前言:
此刻看官们对“netmqtt”可能比较看重,各位老铁们都想要分析一些“netmqtt”的相关内容。那么小编同时在网摘上搜集了一些关于“netmqtt””的相关资讯,希望看官们能喜欢,看官们快快来学习一下吧!.net core 3.0开始支持winform程序的开发,Visual Studio 2019需先安装.NET Core Windows Forms designer(Winform窗体的设计器),设计器插件可以从微软网站上下载。
新建项目,我们选择Windows Forms App(.net core)项目模板。项目建立后,我们打开NuGet包管理器搜索MQTT相关包,MQTTnet (824K个下载)、M2Mqtt (304K个下载),本文我们将使用MQTTnet 3.0.12
我们使用窗体设计器拖拽相关控件,设计MQTT客户端相关功能界面。设计界面过程中我们发现.net core winform设计器有BUG,经常提示控件Name xxxx已存在(拖动多个相同类型控件时),客户端最终界面如下:
上网搜索MQTTnet相关用法,发现大部分都是基于2.X版本,本示例使用的是3.0.12,所以用法很多不兼容,我们打开MQTTnet官方站点查阅相关Wiki:
创建MQTT客户端
var factory = new MqttFactory();var mqttClient = factory.CreateMqttClient();var options = new MqttClientOptionsBuilder() .WithClientId("客户端ID") .WithTcpServer("服务器地址",1883) .WithCredentials("username", "password") //mqtt服务器认证账号、密码。没有则不设置 .WithCleanSession() .Build();支持WebSocket 方式connectionvar options = new MqttClientOptionsBuilder() .WithWebSocketServer("broker.hivemq.com:8000/mqtt") .Build();MQTT客户端连接与重连
我们可以使用上一步定义的客户端对象,执行ConnectAsync方法连接服务器,当连接断开时,在连接断开事件UseDisconnectedHandler中尝试执行ConnectAsync方法重新连接mqtt服务器即可。
await mqttClient.ConnectAsync(options, CancellationToken.None);mqttClient.UseDisconnectedHandler(async e =>{ await Task.Delay(TimeSpan.FromSeconds(5)); try { await mqttClient.ConnectAsync(options, CancellationToken.None); catch { Console.WriteLine("重连失败"); }});MQTT客户端订阅消息
与MQTT代理服务器建立连接成功后,我们便可以使.SubscribeAsync("topic"))订阅指定的主题。
mqttClient.UseConnectedHandler(async e =>{ await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build());});MQTT客户端发布消息
var message = new MqttApplicationMessageBuilder() .WithTopic("MyTopic") //发布消息的主题 .WithPayload("Hello World") //发布的内容 .WithExactlyOnceQoS() //消息质量 .WithRetainFlag() .Build();await mqttClient.PublishAsync(message, CancellationToken.None);ManagedClient的使用
本次MQTT客户端实现,使用的是ManagedClient,与普通的mqttClient相比有一些很方便的特性:ManagedClient一旦启动,它将自动维护连接,包括断线重新连接等功能;一旦服务器可用,所有MQTT应用程序消息都将添加到内部队列中并进行处理;可以存储所有MQTT应用程序消息以支持在应用程序重新启动后发送它们;所有订阅都通过服务器连接进行管理,与服务器的连接丢失后,无需手动预订。
//启动ManagedClient实例,不用关注连接重连逻辑await client.StartAsync( new ManagedMqttClientOptions {ClientOptions = options });//订阅消息 var topicFilter = new MqttTopicFilter { Topic = SubscribeTopic };await client.SubscribeAsync(topicFilter);//发布消息var message = new MqttApplicationMessageBuilder().WithTopic(SubscribeTopic).WithPayload(payload).WithQualityOfServiceLevel( MqttQualityOfServiceLevel.AtLeastOnce ).WithRetainFlag().Build();await.client.PublishAsync(message);程序运行效果以及代码下载
该MQTT客户端代码已上传github.com/mingyunet/MqttClient/
标签: #netmqtt