ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# MQTT mqtt客户端,发布订阅消息

2019-10-07 19:54:16  阅读:599  来源: 互联网

标签:mqttClient 订阅 MqttClient C# mqtt private MQTT new 服务器


如果想用C#来和mqtt的服务器进行数据交互的话,有一个常见的选择,那就是 MQTTNET

地址如下:https://github.com/chkr1011/MQTTnet

那个库在最近几个版本升级的过程中,更改了一些api接口,造成了大家的困惑,所以我在hsl中也提供了mqtt的实现类,用法很简单。现在来介绍一下

 

本库的demo源代码地址:https://github.com/dathlin/HslCommunication

如果想要联系作者,请访问官网:  http://www.hslcommunication.cn/

 

测试的MQTT界面如下:

 

 

然后需要准备mqtt的服务器了,当然了,你可以安装EMQtt的服务器,也可以安装mqttnet的服务器,当然为了尽快的测试,可以使用hsl支持的服务器,虽然目前的支持的功能比较简陋,但是基本的功能都有的。

好了,我们先运行demo,打开服务器

点击start即可。

然后我们新建一个winform项目,然后nuget安装hslcommunication

 

 

安装完成后,我们就要在主界面添加一个按钮了。

先定义对象,然后在构造方法里初始化。

        public Form1( )
        {
            InitializeComponent( );

            // 实例化
            mqttClient = new MqttClient( new MqttConnectionOptions( )
            {
                ClientId = "ABC",
                IpAddress = "127.0.0.1"
            } );
        }


        private MqttClient mqttClient = null;
        private void button1_Click( object sender, EventArgs e )
        {
            // 连接
            OperateResult connect = mqttClient.ConnectServer( );
            if (connect.IsSuccess)
            {
                MessageBox.Show( "Success" );
            }
            else
            {
                MessageBox.Show( "Failed" );
            }
        }

  实例化的时候支持设置客户端的ID信息,服务器的地址,端口,超时时间,如果服务器设置了用户名和密码。那么实例化的时候修改成下面的信息

            // 实例化
            mqttClient = new MqttClient( new MqttConnectionOptions( )
            {
                ClientId = "ABC",
                IpAddress = "127.0.0.1",
                Credentials = new MqttCredential( "admin", "123456" ),   // 设置了用户名和密码
            } );

  

如何发布消息呢?我们再增加一个按钮。

        private void button2_Click( object sender, EventArgs e )
        {
            // 测试发布
            mqttClient.PublishMessage( new MqttApplicationMessage( )
            {
                Topic = "A",                                                      // 主题
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,     // 消息等级
                Payload = Encoding.UTF8.GetBytes( "This is test message!" ),        // 数据
                Retain = false,                                                   // 是否保留
            } );
        }

  我们来看看测试效果。

 

我们看到服务器上接收到客户端的信息,可以方便的知道哪个客户端,发的什么主题,内容是什么。

 

我们再来看看订阅操作。我们再增加一个按钮,用来订阅操作

        private void button3_Click( object sender, EventArgs e )
        {
            // 订阅测试,在label1上显示结果
            mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 调用一次即可
            mqttClient.SubscribeMessage( "A" );     // 订阅A的主题
        }

        private void MqttClient_OnMqttMessageReceived( string topic, byte[] payload )
        {
            // 跨线程更新了UI界面的内容
            Invoke( new Action( ( ) =>
             {
                 label1.Text = $"Topic[{topic}] {Encoding.UTF8.GetString( payload )}";
             } ) );
        }

  

 

好了我们再来操作以下

 

我们可以看到我们订阅的A,然后发布的A确实是收到消息了。

实际上MQTT协议的操作就只有这么点,基本就差不多了,但是在发布消息的时候有个属性,

QualityOfServiceLevel

这个需要额外注意一下。有三个选项,最多一次,最少一次,刚好一次,从性能上来说,最多一次最高性能,刚好一次最损耗性能。

所以一般工业现场的实时数据的推送都是最多一次即可。

 

还有 Retain 属性,含义是,你推上去的消息是否要在服务器本地缓存,缓存之后有什么好处呢?新的客户端订阅消息的时候,会立即推送一次旧数据。这样,你就可以及时的在界面上显示出来。

 

更多的操作,可以参照demo的源代码。

 

标签:mqttClient,订阅,MqttClient,C#,mqtt,private,MQTT,new,服务器
来源: https://www.cnblogs.com/dathlin/p/11631894.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有