美文网首页
MQTT笔记

MQTT笔记

作者: StormerX | 来源:发表于2020-04-12 19:42 被阅读0次

    首先在本机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;   
                });
            }
    
    
    
    
        }
    }
    

    相关文章

      网友评论

          本文标题:MQTT笔记

          本文链接:https://www.haomeiwen.com/subject/zybbmhtx.html