基于 Dotnetty 的 Mqtt Client
Dotnetty
Netty是顶顶大名的网络通讯开发库,使通讯开发人员再也不用费九牛二虎之力来处理socket通讯和一些常见应用层协议如HTTP、WEBSOCKET、MQTT等底层问题,而可以专心做应用层的开发工作。Dotnetty是Azure团队照着Netty开发的C#版本。
MQTT Client
基于 Netty/Dotnetty 提供的是MQTT 14种Packet和编码、解码的实现,但没有提供MQTT客户端或服务端的官方实现。我重点参考了https://github.com/jetlinks/netty-mqtt-client的java代码,其中包含了重连和重传机制,相较于其他netty的mqtt client更为成熟,但代码中出现的Future/Promise也着实不好对付。
JAVA到C#
Java中的Future相当于C#的Task,Promise相当于TaskCompletionSource,后者主要用于将多个步骤合并为一个任务,都完成后再返回。Mqtt协议里,这种多步一回合的情况是普遍的,包括:
- CONNECT——CONACT
- PUBLISH——PUBACK
- PUBLISH——PUBREC——PUBREL——PUBCOMP
- SUBSCRIBE——SUBACK
- UNSUBSCRIBE——UNSUBACK
例如,Client对外提供的 Publish 方法在QoS>0的情况下,并不是WriteAndFlush后就算完成了,还要等到PUBACK(QoS=1)甚至PUBREL(QoS=2)才能返回,这中间Mqtt Client和Mqtt Broker之间已经进行了好几次通讯,因此需要用Promise/TaskCompletionSource来将这几步通讯包裹成一个任务,执行完后Publish方法才返回。
代码结构
相关的代码已上传github,csdn下载,核心是MqttClient类,提供了Connect, Disconnect, Publish,Subscribe 和Unsubscribe 向Mqtt Broker发送消息的方法,以及On*** 负责接收来自Mqtt Broker消息的回调方法。MqttHandler作为管道里的最后一个Handler,负责接收来自Mqtt Broker的消息,转发给MqttClient。
在MqttClient基础上,可以方便的进行扩展,例如HeartbeatMqttClient就是在管道中加入了Idle和Ping两个Handler,实现定时发送PING包完成心跳功能。
测试一:订阅/发布相同主题
在云端服务器上运行mosquitto Mqtt Broker。通过如下代码,向服务器订阅test/1主题,然后再向test/1主题每秒发送 0-7,收到0-7,验证了Connect, Disconnect, Publish,Subscribe。
Mqtt.Client.MqttClient mqttClient = new Mqtt.Client.MqttClient();var result = await mqttClient.ConnectAsync("127.0.0.1", 1883);Console.WriteLine($"connect {result.Success}");if (result.Success){await mqttClient.SubscribeAsync("test/1", DotNetty.Codecs.Mqtt.Packets.QualityOfService.AtLeastOnce, (packet) =>{var pubpacket = (DotNetty.Codecs.Mqtt.Packets.PublishPacket)packet;Console.WriteLine(pubpacket.Payload.GetString(0, pubpacket.Payload.WriterIndex, UTF8Encoding.UTF8));});await Task.Delay(1000);for(int i = 0; i < 8; i++){await mqttClient.PublishAsync("test/1", UTF8Encoding.UTF8.GetBytes(i.ToString()));await Task.Delay(1000);}await Task.Delay(1000);await mqttClient.DisconnectAsync();}
测试二:心跳
Mqtt.Client.HeartbeatMqttClient mqttClient = new Mqtt.Client.HeartbeatMqttClient();var result = await mqttClient.ConnectAsync("127.0.0.1", 1883);Console.WriteLine($"connect {result.Success}");if (result.Success){await Task.Delay(100000);await mqttClient.DisconnectAsync();}
基于 Dotnetty 的 Mqtt Client相关推荐
- 基于 WebSocket 的 MQTT 移动推送方案
WebSphere MQ Telemetry Transport 简介 WebSphere MQ Telemetry Transport (MQTT) 是一项异步消息传输协议,是 IBM 在分析了他们 ...
- AT32 EMAC MQTT Client
前言 随着物联网的发展,各式各样的装置都必须具备连网的能力,单芯片也不例外,为此我们以雅特力的AT32F407/AT32F437系列,演示了一系列的范例,以期用户能基于这些范例,使用雅特力的开发板发展 ...
- 基于Dotnetty和Protobuf的Unity客户端开发(一)
目录 前言 链接 环境配置 安装NuGetForUnity 安装Protobuf 安装Dotnetty包 手动安装其他依赖包 前言 公司的前辈基于Netty开发了一个服务器,推荐我在前端也使用Nett ...
- C语言基于paho实现MQTT客户端实战案例
C语言基于paho实现MQTT客户端实战案例 目标 说明 项目代码 make文件 mqttClient.pro 项目入口 main.c 链表 list.h 消息队列 queue.h 消息队列 queu ...
- 微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台
索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...
- java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅
阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...
- Ai-WB2模组基于TCP的MQTT连接服务器使用示例
前言 1. 准备工作 2. 连接路由器 3. 基于 TCP 的 MQTT 连接(适用于数据量少) 4. 基于 TCP 的 MQTT 连接(适用于数据量多) 5. 联系我们 1. 准备工作 需要准备的软 ...
- 基于ZigBee+ESP32+MQTT+EMQX+TomCat+Servlet接口+MySQL+安卓app的物联网课设
文章目录 一.写在前面 二.课设简介 三.不眠夜开始了 1.基于zigbee网络数据采集的底层实现 2.基于ESP32和mqtt协议的数据上传功能 3.使用EMQX作为MQTT服务器软件 4.使用Ja ...
- 工业智能网关BL110应用之59:如何实现智能楼宇控制BACnet 接入MQTT Client One云平台
COM口采集 楼宇控制BACnet的配置 工业智能网关一共有四个COM 接口, 以COM口采集楼宇控制BACnet MS/TP设备为例,COM口 485接口A+.B-分别对应楼宇控制 BACnet M ...
最新文章
- Hadoop伪分布式环境搭建
- bzoj千题计划161:bzoj1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
- python中的itertools_在python中使用itertools操作csv数据
- MEGA | 多序列比对及系统发育树的构建
- 微信小程序生成小程序码,如何在开发版本调试?
- github 学习笔记【一】
- Android设备的ID
- 电力-104规约实际测试1
- python数学建模基础(一)——矩阵操作
- 3GPP TS 29244-g30 中英文对照 | 5.2.6	Combined SGW/PGW Architecture
- 热电传感器(1)——原理和定律
- 上海名媛 -- 精致女孩的打拼生活
- vue.js中使用甘特图(gantt-elastic)的使用
- android下载安装包你火,包你火直播最新免费版 v2.5.1
- LTE语音业务-VOLTE(一)
- js 树形结构数据 已知某一子节点 一次向上获取所有父节点
- 九、路由原理与路由协议
- 亚马逊海外购SAMSUNG 三星T7上手初体验
- html中repeat的作用,repeat-y
- Linux命令教程第二期