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

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

解决方案goocz2025-05-25 12:08:401A+A-

.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/

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5