MQTT笔记

2020-04-12  本文已影响0人  StormerX

首先在本机macOS安装ActiveMQ
https://activemq.apache.org/getting-started#Pre-InstallationRequirements

安装后运行,打开ActiveMQ控制台
http://127.0.0.1:8161/admin/topics.jsp

C#项目中

m2mqtt: https://github.com/mohaqeq/paho.mqtt.m2mqtt

项目中添加依赖

在API控制器中加入测试代码,订阅名为 /home/temperature 的主题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Mvc;

using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace TestMQTT.Controllers
{
    [Route("api/[controller]")]
    public class MqttController : Controller
    {
        private static string ReceivedMessage;


        // GET: api/values
        [HttpGet]
        [Obsolete]
        public IEnumerable<string> Get()
        {
            // create client instance 
            MqttClient client = new MqttClient(IPAddress.Parse("127.0.0.1"));

            // register to message received 
            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

            string clientId = Guid.NewGuid().ToString();
            client.Connect(clientId);

            // subscribe to the topic "/home/temperature" with QoS 2 
            client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });


            return new string[] { ReceivedMessage };
        }


        static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // handle message received
            ReceivedMessage = Encoding.UTF8.GetString(e.Message);
           
        }
 
    }
}

编译执行后打开API https://localhost:5001/api/mqtt/
这时返回值为null,但是已经订阅了主题。

回到ActiveMQ控制台,选Topics,在Operations里点选Send To



填写好消息内容后点击send按钮,这样凡是订阅了该主题的客户端都可以收到这条消息。再次刷新接口:https://localhost:5001/api/mqtt/

可以看见订阅的客户端已经接收到了消息内容。

下面记录一段在WinFrom里的示例代码。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


// including the M2Mqtt Library
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;


namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        MqttClient client;
        string clientId;


        // this code runs when the main window opens (start of the app)
        public MainWindow()
        {
            InitializeComponent();

            string BrokerAddress = "test.mosquitto.org";
            
            client = new MqttClient(BrokerAddress);

            // register a callback-function (we have to implement, see below) which is called by the library when a message was received
            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

            // use a unique id as client id, each time we start the application
            clientId = Guid.NewGuid().ToString();

            client.Connect(clientId);
        }


        // this code runs when the main window closes (end of the app)
        protected override void OnClosed(EventArgs e)
        {
            client.Disconnect();

            base.OnClosed(e);
            App.Current.Shutdown();
        }


        // this code runs when the button "Subscribe" is clicked
        private void btnSubscribe_Click(object sender, RoutedEventArgs e)
        {
            if (txtTopicSubscribe.Text != "")
            {
                // whole topic
                string Topic = "/ElektorMyJourneyIoT/" + txtTopicSubscribe.Text + "/test";

                // subscribe to the topic with QoS 2
                client.Subscribe(new string[] { Topic }, new byte[] { 2 });   // we need arrays as parameters because we can subscribe to different topics with one call
                txtReceived.Text = "";
            }
            else
            {
                System.Windows.MessageBox.Show("You have to enter a topic to subscribe!");
            }
        }


        // this code runs when the button "Publish" is clicked
        private void btnPublish_Click(object sender, RoutedEventArgs e)
        {    
            if (txtTopicPublish.Text != "")
            {
                // whole topic
                string Topic = "/ElektorMyJourneyIoT/" + txtTopicPublish.Text + "/test";

                // publish a message with QoS 2
                client.Publish(Topic, Encoding.UTF8.GetBytes(txtPublish.Text), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
            }
            else
            {
                System.Windows.MessageBox.Show("You have to enter a topic to publish!");
            }
        }


        // this code runs when a message was received
        void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            string ReceivedMessage = Encoding.UTF8.GetString(e.Message);

            Dispatcher.Invoke(delegate {              // we need this construction because the receiving code in the library and the UI with textbox run on different threads
                txtReceived.Text = ReceivedMessage;   
            });
        }




    }
}
上一篇下一篇

猜你喜欢

热点阅读