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相关推荐

  1. 基于 WebSocket 的 MQTT 移动推送方案

    WebSphere MQ Telemetry Transport 简介 WebSphere MQ Telemetry Transport (MQTT) 是一项异步消息传输协议,是 IBM 在分析了他们 ...

  2. AT32 EMAC MQTT Client

    前言 随着物联网的发展,各式各样的装置都必须具备连网的能力,单芯片也不例外,为此我们以雅特力的AT32F407/AT32F437系列,演示了一系列的范例,以期用户能基于这些范例,使用雅特力的开发板发展 ...

  3. 基于Dotnetty和Protobuf的Unity客户端开发(一)

    目录 前言 链接 环境配置 安装NuGetForUnity 安装Protobuf 安装Dotnetty包 手动安装其他依赖包 前言 公司的前辈基于Netty开发了一个服务器,推荐我在前端也使用Nett ...

  4. C语言基于paho实现MQTT客户端实战案例

    C语言基于paho实现MQTT客户端实战案例 目标 说明 项目代码 make文件 mqttClient.pro 项目入口 main.c 链表 list.h 消息队列 queue.h 消息队列 queu ...

  5. 微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  6. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

  7. Ai-WB2模组基于TCP的MQTT连接服务器使用示例

    前言 1. 准备工作 2. 连接路由器 3. 基于 TCP 的 MQTT 连接(适用于数据量少) 4. 基于 TCP 的 MQTT 连接(适用于数据量多) 5. 联系我们 1. 准备工作 需要准备的软 ...

  8. 基于ZigBee+ESP32+MQTT+EMQX+TomCat+Servlet接口+MySQL+安卓app的物联网课设

    文章目录 一.写在前面 二.课设简介 三.不眠夜开始了 1.基于zigbee网络数据采集的底层实现 2.基于ESP32和mqtt协议的数据上传功能 3.使用EMQX作为MQTT服务器软件 4.使用Ja ...

  9. 工业智能网关BL110应用之59:如何实现智能楼宇控制BACnet 接入MQTT Client One云平台

    COM口采集 楼宇控制BACnet的配置 工业智能网关一共有四个COM 接口, 以COM口采集楼宇控制BACnet MS/TP设备为例,COM口 485接口A+.B-分别对应楼宇控制 BACnet M ...

最新文章

  1. Hadoop伪分布式环境搭建
  2. bzoj千题计划161:bzoj1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
  3. python中的itertools_在python中使用itertools操作csv数据
  4. MEGA | 多序列比对及系统发育树的构建
  5. 微信小程序生成小程序码,如何在开发版本调试?
  6. github 学习笔记【一】
  7. Android设备的ID
  8. 电力-104规约实际测试1
  9. python数学建模基础(一)——矩阵操作
  10. 3GPP TS 29244-g30 中英文对照 | 5.2.6 Combined SGW/PGW Architecture
  11. 热电传感器(1)——原理和定律
  12. 上海名媛 -- 精致女孩的打拼生活
  13. vue.js中使用甘特图(gantt-elastic)的使用
  14. android下载安装包你火,包你火直播最新免费版 v2.5.1
  15. LTE语音业务-VOLTE(一)
  16. js 树形结构数据 已知某一子节点 一次向上获取所有父节点
  17. 九、路由原理与路由协议
  18. 亚马逊海外购SAMSUNG 三星T7上手初体验
  19. html中repeat的作用,repeat-y
  20. Linux命令教程第二期

热门文章

  1. java- JWT +加密方式的解读
  2. 人工智能未来10年神经网络的发展趋势
  3. 微信小程序UI自动化测试实践:Minium+PageObject
  4. Windows live writer 2011下载太慢了
  5. 如何正确衡量线性回归模型中变量的重要性
  6. WINSERVER 2016 评估版转正式版及激活方法
  7. https证书存在哪里?部署https证书的意义
  8. QBC (Query By Criteria)
  9. 最近很火的计算机歌曲,抖音日活跃用户数超4亿 2019年度最火音乐竟是它
  10. mongodb备份oplog_MongoDB备份方式详细介绍