Windows Forms App (.net core) 实现一个MQTT客户端
.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 方式connection
var 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/
相关文章
- c#.Net.NetCore面试(四十四)c#/net/netcore读取文件
- iNeuOS工业互联网操作系统,从NetCore3.1升级到Net6的过程汇报
- c#.Net.NetCore面试(二十二)c# Hashtable(哈希表)解析
- 开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包
- Netcore部署和使用docker
- .NetCore中使用分布式事务DTM的二阶段消息
- 3-跟我一起学.NetCore之依赖注入
- 微软停止更新 .NET Standard 今后转向.NET 5
- c#.Net.NetCore面试(六)readonly与const区别?
- c#.Net.NetCore面试(三十九)选择排序算法