NanoMQ 是面向边缘计算的超轻量高性能 MQTT 消息引擎+多协议消息总线。支持 MQTT 协议和 ZeroMQ、Nanomsg 等不同边缘常用总线协议,集成 broker 和 brokerless 消息模式。NanoMQ 与 EMQX 通过桥接集成实现从边缘到云的一站式 MQTT 数据移动和处理。
社区站地址:https://nanomq.io/zh
GitHub 仓库:https://github.com/emqx/nanomq
金秋十月,NanoMQ 继续保持稳步更新,最新的 0.13 版本将于近日正式发布。此版本的更新继续聚焦于桥接功能部分:为原来的 MQTT over QUIC 桥接功能增加了多路桥接和更丰富的 QUIC 传输层配置参数,新增了内置的 Azure 桥接功能。另外新增了规则引擎消息重发布功能。
更完善的 MQTT over QUIC 桥接
在 0.12 版本中推出的 MQTT over QUIC 桥接功能与 EMQX 5.0 配合使用得到了用户的热烈反响。在 0.13 版本中,我们为此功能进行了多项加强:
原先的 MQTT over QUIC 桥接功能只能支持连接一个服务端,这无法满足多路数据同步和传输的要求。与传统的基于 TCP 的 MQTT 连接相同,NanoMQ 也为基于 QUIC 的桥接功能的传输层做了优化,使其能够支持同时建立多个 MQTT over QUIC 连接。用户只需要和使用标准 MQTT 桥接功能一样,在配置文件中设置多个桥接目标配置(只摘录部分相关):
## Bridge via both TCP & QUIC #### 以同时桥接到EMQX公共服务器和EMQX Cloud为例,配置桥接URL ##bridge.mqtt.emqx1.address=mqtt-quic://broker.emqx.io:14567bridge.mqtt.emqx2.address=mqtt-quic://54.75.171.11:14567bridge.mqtt.emqx3.address=mqtt-tcp://broker.emqx.io:1883......
多路桥接时,桥接数据是会同时发布给每个桥接对象的。NanoMQ 也支持同时进行基于 TCP 和 QUIC 的 MQTT 桥接。
MQTT over QUIC 能够帮助 IoT 应用极大改善弱网状态下的数据传输和地址迁移问题。
但由于 QUIC 是基于 UDP 的,目前许多运营商仍然对 UDP 包有特殊的路由策略,这往往导致 QUIC 连接无法成功建立或一直被丢包。NanoMQ 也考虑到需要应对复杂的中间网络问题,特地推出了 QUIC 连接失败时自动切换至标准 MQTT over TCP 桥接的功能。

切换逻辑示意图
使用时只需要在配置文件中设置新增的 bridge.mqtt.emqx.hybrid_bridging
选项为 true
来开启这一模式。注意目前并不能自动切换回 QUIC,后续再备用桥接目标功能中会支持这一需求。另外,因为此过程不计为连接通断,所以也不会发出桥接断开/连接的上下线事件消息。
QUIC 作为新晋的网络标准,而且具有一定的设计自由度,所以往往需要针对不同的网络环境和场景修改其内部参数,为此 NanoMQ 暴露了一些常用的配置选项,以下是对它们的详细解释:
## Newly added config params for QUIC ####--------------------------------------------------------------------## Ping: QUIC 传输层发送Ping包的时间间隔#### Value: Duration## Default: 120 secondsbridge.mqtt.emqx.quic_keepalive=120## Idle Timeout: 保持QUIC连接的最大空闲时间,超过此设置时间长度的无活动连接将会被主动关闭。设置为0的话就不侦测无活动连接,若MQTT层keepalive设置的过大,这会造成僵尸连接的风险## Value: Duration## Default: 120 secondsbridge.mqtt.emqx.quic_idle_timeout=120## Disconnect Timeout: QUIC Stream 最大等待对端ACK的时间,超过此时间未收到回应的Stream会被认为无效并断开。## Value: Duration## Default: 20 secondsbridge.mqtt.emqx.quic_discon_timeout=20## Handshake Timeout: NanoMQ建立QUIC连接时的最大等待时间## Value: Duration## Default: 60 secondsbridge.mqtt.emqx.quic_handshake_timeout=60## Hybrid bridging: 混合桥接模式的开关,若开启会根据QUIC链接的建立情况自动退回 MQTT overTCP 桥接模式## Value: true/false## Default: falsebridge.mqtt.emqx.hybrid_bridging=false####--------------------------------------------------------------------
NanoMQ 的桥接功能一大特色是桥接能够支持断网数据本地缓存,网络恢复自动重传。之前此项功能只对标准的 MQTT over TCP 有效。从 0.13 版本开始,当开启 SQLite 自动缓存功能时,此功能对 QUIC 桥接也同样有效。
在 0.12 版本,用户如果想要使用 NanoMQ 的 QUIC 相关功能,需要自行下载源码编译安装,过程较为复杂。为了方便用户使用,从 0.13 版本开始,NanoMQ 新增了自动化编译打包流程,每次都会自动编译出包含 QUIC 库在内的二进制包供用户直接安装使用。希望以此来降低项目中引入 QUIC 功能的上手门槛,用户只需简单安装 EMQX 5.0 + NanoMQ 并做相应配置即可。
Azure IoT Hub 桥接
微软的 Azure 云服务有提供一个兼容部分 MQTT 协议的物联网服务:IoT Hub,详情可参阅微软官方文档(https://learn.microsoft.com/zh-cn/azure/iot-hub/iot-hub-mqtt-support)。NanoMQ 也内置支持了与其的桥接功能,具体使用方式如下:
Azure 强制要求必须使用 TLS 加密连接,且使用的 Topic 和认证用的用户名密码必须在其控制台预先创建设备来配置使用。

目前 NanoMQ 只支持使用对称秘钥加密和用户名+密码的方式认证链接 Azure IoT Hub。
配置后的页面如图:

之后修改桥接配置文件,其中需要特殊对待的配置有:
bridge.mqtt.azure.address=tls+mqtt-tcp://azure-iot-hub.net:8883 (使用Azure提供的主机名)bridge.mqtt.azure.clientid=device01 (使用在Azure控制台创建的设备名)bridge.mqtt.azuer.username= {iothubhostname}/{device_id}/?api-version=datetime(主机名+设备名+API版本日期拼接而成)bridge.mqtt.azuer.password=***** ( 使用SAS令牌,需要用Azure提供的工具本地生成 )bridge.mqtt.azuer.tls.enable=true (必须使用TLS加密)bridge.mqtt.azuer.forwards=devices/{device_id}/messages/events/bridge.mqtt.azuer.subscriptions.1.topic=devices/{device_id}/messages/devicebound/#(订阅和发布的主题必须按照Azure规则配置)

例:使用 VS Code 生成 SAS 令牌的方法
如此启动 NanoMQ 就能够完成将本地标准 MQTT 客户端的消息转换桥接至 Azure IoT Hub。
规则引擎消息重发布
规则引擎消息重发布功能在 v0.13 中测试完成正式发布。支持根据用户编写的 SQL 语句将本机 NanoMQ 里命中的消息修改后重新发布到目标 MQTT 服务的主题。简单示例如下:
## 重新发布消息到此目标主机:rule.repub.1.address=mqtt-tcp://broker.emqx.io:1883## 重新发布到此目标主题:rule.repub.1.topic=topic/repub1## 根据如下规则过滤本机NanoMQ的消息:rule.event.publish.1.sql="SELECT topic, payload FROM "abc""
如此就能将本地 NanoMQ 的”abc”主题中的消息和主题名一起组合成新的消息转发给云端公有的 EMQX MQTT 服务。
同时,这一版本开始规则引擎也能够支持使用 HTTP API 来对部分规则进行热更新。
即将到来
目前 NanoMQ 正计划将配置文件格式更新为更易读的 HOCON(Human-Optimized Configuration Object Notation)。关于配置文件使用体验,欢迎用户在 Github 提出宝贵建议。同时 NanoMQ 还将增加 Reload 命令和 HTTP API 来支持部分配置选项的热更新,并增加 ACL 支持等功能。





