.NET使用MQTT通信实例

最近项目里面需要用到MQTT,刚开始听到这个词一脸茫然,不知道是什么,最后通过自己百度整理一点资料,希望最大家有帮助。
在这里需要引用MQTTnet,可在解决方案在右键单击-选择“管理解决方案的 NuGet 程序包”-在“浏览”选项卡下面搜索 MQTTnet,为服务端项目和客户端项目都安装上 MQTTnet 库。示例中使用的是2.4版本,不同版本最低要求的.net版本或其它支持,在NuGet选中MQTTNet,右侧可以看到具体描述
相关MQTTnet dll文件下载
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);
        //}
    }
    界面就是以下
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181213110213768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NjA5MjY4,size_16,color_FFFFFF,t_70)
   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}");
        })));
    }
    界面
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181213111000377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NjA5MjY4,size_16,color_FFFFFF,t_70)
    本人第一次写,有什么问题大家可以指出来,谢谢~~~~
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值