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

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

c8b890b0a56e0cf035da986e81c40181.png

Windows Forms App (.net core)

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

9fd6eb556174cd46981af1696ae2c348.png

新建.net core winform项目

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

b96e433866be5504533dbe8a54404463.png

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

6f23e86f27bbc10f22a6ada64748da99.png

mqtt client test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值