若是想用C#来和mqtt的服务器进行数据交互的话,有一个常见的选择,那就是 MQTTNETgit
地址以下:https://github.com/chkr1011/MQTTnetgithub
那个库在最近几个版本升级的过程当中,更改了一些api接口,形成了你们的困惑,因此我在hsl中也提供了mqtt的实现类,用法很简单。如今来介绍一下api
本库的demo源代码地址:https://github.com/dathlin/HslCommunication缓存
若是想要联系做者,请访问官网: http://www.hslcommunication.cn/服务器
测试的MQTT界面以下:性能
而后须要准备mqtt的服务器了,固然了,你能够安装EMQtt的服务器,也能够安装mqttnet的服务器,固然为了尽快的测试,可使用hsl支持的服务器,虽然目前的支持的功能比较简陋,可是基本的功能都有的。测试
好了,咱们先运行demo,打开服务器线程
点击start便可。orm
而后咱们新建一个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的源代码。