龙空技术网

Windows Forms App (.net core) 实现一个MQTT客户端

IT点滴 1268

前言:

此刻看官们对“netmqtt”可能比较看重,各位老铁们都想要分析一些“netmqtt”的相关内容。那么小编同时在网摘上搜集了一些关于“netmqtt””的相关资讯,希望看官们能喜欢,看官们快快来学习一下吧!

.net core 3.0开始支持winform程序的开发,Visual Studio 2019需先安装.NET Core Windows Forms designer(Winform窗体的设计器),设计器插件可以从微软网站上下载。

Windows Forms App (.net core)

新建项目,我们选择Windows Forms App(.net core)项目模板。项目建立后,我们打开NuGet包管理器搜索MQTT相关包,MQTTnet (824K个下载)、M2Mqtt (304K个下载),本文我们将使用MQTTnet 3.0.12

新建.net core winform项目

我们使用窗体设计器拖拽相关控件,设计MQTT客户端相关功能界面。设计界面过程中我们发现.net core winform设计器有BUG,经常提示控件Name xxxx已存在(拖动多个相同类型控件时),客户端最终界面如下:

.net core winform设计器

上网搜索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/

mqtt client test

标签: #netmqtt