.NET使用MQTT通信实例

最近项目里面需要用到MQTT,刚开始听到这个词一脸茫然,不知道是什么,最后通过自己百度整理一点资料,希望最大家有帮助。
在这里需要引用MQTTnet,可在解决方案在右键单击-选择“管理解决方案的 NuGet 程序包”-在“浏览”选项卡下面搜索 MQTTnet,为服务端项目和客户端项目都安装上 MQTTnet 库。示例中使用的是2.4版本,不同版本最低要求的.net版本或其它支持,在NuGet选中MQTTNet,右侧可以看到具体描述
1.首先创建一个winform项目作为服务端,MqttService
下面是代码的实例

       

 private MqttServer mqttServer=null;

        public Server_Form()

        {

        InitializeComponent();

        MqttNetTrace.TraceMessagePublished += MqttNetTrace_TraceMessagePublished;

        this.button2.Enabled = false;

        }

        /// <summary>

        /// 开启连接

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                this.button1.Enabled = false;

                this.button2.Enabled = true;

                StartMqttServer();

            }

            catch (Exception ex)

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");

            }

        }

        /// <summary>

        /// 断开连接

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button2_Click(object sender, EventArgs e)

        {

            this.button1.Enabled = true;

            this.button2.Enabled = false;

            mqttServer.StopAsync();

            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "MQTT服务停止成功!" + " \r\n\r\n");

        }

        /// <summary>

        /// 清除日志

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button3_Click(object sender, EventArgs e)

        {

            this.textBox1.Text = "";

        }

        #region 自定义方法

        /// <summary>

        /// MQTT服务开启

        /// </summary>

        private void StartMqttServer()

        {

            if (mqttServer == null)

            {

                try

                {

                    var options = new MqttServerOptions

                    {

                        ConnectionValidator = p =>

                        {

                            if (p.ClientId == "c001")

                            {

                                if (p.Username != "u001" || p.Password != "p001")

                                {

                                    return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;

                                }

                            }

                            return MqttConnectReturnCode.ConnectionAccepted;

                        }

                    };

                    mqttServer = new MqttServerFactory().CreateMqttServer(options) as MqttServer;

                    mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived;

                    mqttServer.ClientConnected += MqttServer_ClientConnected;

                    mqttServer.ClientDisconnected += MqttServer_ClientDisconnected;

                }

                catch (Exception ex)

                {

                    this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");

                    return;

                }

            }

            mqttServer.StartAsync();

            this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "MQTT服务启动成功!" + " \r\n\r\n");

        }

        /// <summary>

        /// 客户端连接触发的事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void MqttServer_ClientConnected(object sender, MqttClientConnectedEventArgs e)

        {

            try

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.Client.ClientId + "}]已连接,协议版本:{" + e.Client.ProtocolVersion + "}" + " \r\n\r\n");

            }

            catch (Exception ex)

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");

            }

        }

        /// <summary>

        /// 客户端断开触发的事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void MqttServer_ClientDisconnected(object sender, MqttClientDisconnectedEventArgs e)

        {

            try

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.Client.ClientId + "}]已断开连接!" + "" + " \r\n\r\n");

            }

            catch (Exception ex)

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");

            }

        }

        /// <summary>

        /// 消息事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void MqttServer_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)

        {

            try

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "客户端[{" + e.ClientId + "}]>> 主题:{" + e.ApplicationMessage.Topic + "} 负荷:{" + Encoding.UTF8.GetString(e.ApplicationMessage.Payload) + "} Qos:{" + e.ApplicationMessage.QualityOfServiceLevel + "} 保留:{" + e.ApplicationMessage.Retain + "}" + " \r\n\r\n");

            }

            catch (Exception ex)

            {

                this.textBox1.AppendText("" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "" + ex.Message + "" + " \r\n\r\n");

            }

        }

        private void MqttNetTrace_TraceMessagePublished(object sender, MqttNetTraceMessagePublishedEventArgs e)

        {

            //Console.WriteLine($">> 线程ID:{e.ThreadId} 来源:{e.Source} 跟踪级别:{e.Level} 消息: {e.Message}");

            //if (e.Exception != null)

            //{

            //    Console.WriteLine(e.Exception);

            //}

        }

        界面就是以下
       
       2.创建一个winform项目作为服务端,MqttClient
        

 private MqttClient mqttClient = null;

        public Client_Form1()

        {

           

            InitializeComponent();

            Task.Run(async () => { await ConnectMqttServerAsync(); });

        }

        /// <summary>

        /// 发布

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button1_Click(object sender, EventArgs e)

        {

            string topic = txtPubTopic.Text.Trim();

            if (string.IsNullOrEmpty(topic))

            {

                MessageBox.Show("发布主题不能为空!");

                return;

            }

            string inputString = txtSendMessage.Text.Trim();

            var appMsg = new MqttApplicationMessage(topic, Encoding.UTF8.GetBytes(inputString), MqttQualityOfServiceLevel.AtMostOnce, false);

            mqttClient.PublishAsync(appMsg);

        }

        /// <summary>

        /// 订阅

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void button2_Click(object sender, EventArgs e)

        {

            string topic = txtSubTopic.Text.Trim();

            if (string.IsNullOrEmpty(topic))

            {

                MessageBox.Show("订阅主题不能为空!");

                return;

            }

            if (!mqttClient.IsConnected)

            {

                MessageBox.Show("MQTT客户端尚未连接!");

                return;

            }

            mqttClient.SubscribeAsync(new List<TopicFilter> {

                new TopicFilter(topic, MqttQualityOfServiceLevel.AtMostOnce)

            });

            txtReceiveMessage.AppendText($"已订阅[{topic}]主题" + Environment.NewLine);

            txtSubTopic.Enabled = false;

            button2.Enabled = false;

        }

        #region 自定义方法

        private async Task ConnectMqttServerAsync()

        {

            if (mqttClient == null)

            {

                mqttClient = new MqttClientFactory().CreateMqttClient() as MqttClient;

                mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;

                mqttClient.Connected += MqttClient_Connected;

                mqttClient.Disconnected += MqttClient_Disconnected;

            }

            try

            {

                var options = new MqttClientTcpOptions

                {

                    //Server = "127.0.0.1",

                    Server = "192.168.16.207",

                    ClientId = Guid.NewGuid().ToString().Substring(0, 5),

                    UserName = "u0011123",

                    Password = "p00112134",

                    CleanSession = false,

                };

                await mqttClient.ConnectAsync(options);

            }

            catch (Exception ex)

            {

                Invoke((new Action(() =>

                {

                    txtReceiveMessage.AppendText($"连接到MQTT服务器失败!" + Environment.NewLine + ex.Message + Environment.NewLine);

                })));

            }

        }

        /// <summary>

        /// 连接触发事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void MqttClient_Connected(object sender, EventArgs e)

        {

            Invoke((new Action(() =>

            {

                txtReceiveMessage.AppendText("已连接到MQTT服务器!" + Environment.NewLine);

            })));

        }

        /// <summary>

        /// 断开连接触发事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void MqttClient_Disconnected(object sender, EventArgs e)

        {

            Invoke((new Action(() =>

            {

                txtReceiveMessage.AppendText("已断开MQTT连接!" + Environment.NewLine);

            })));

        }

        /// <summary>

        /// 消息事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void MqttClient_ApplicationMessageReceived(object sender,MqttApplicationMessageReceivedEventArgs e)

        {

            Invoke((new Action(() =>

            {

                txtReceiveMessage.AppendText($">> {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}");

            })));

        }

       

        界面
      
        本人第一次写,有什么问题大家可以指出来,谢谢~~~~

给大家推荐一个平台:帐号已迁移

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值