共计 2910 个字符,预计需要花费 8 分钟才能阅读完成。
MQTT-SN 全名为 MQTT for Sensor Networks,其指标是为非 TCP/IP 协定栈的嵌入式设施(如 Zigbee、Bluetooth)提供应用层通信规范。MQTT-SN 是一个专为 WSN(Wireless Sensor Networks)网络设计的 Publish/Subscribe 的音讯传输协定。
大规模分布式物联网 MQTT 音讯服务器 EMQX 除了残缺反对 MQTT 协定外,还能够通过网关解决所有非 MQTT 协定的连贯、认证和音讯收发,并为其提供对立的用户层接口。本文将介绍如何在 EMQX 中接入 MQTT-SN 协定设施,并通过认证及受权保障设施接入平安。
MQTT-SN 的长处是什么?
- 与 MQTT 协定兼容: MQTT-SN 通信模型齐全与 MQTT 绝对应,例如公布、订阅、保留会话、遗嘱音讯等。对立的模型有利于升高端到端的设计复杂度。
- 轻量: 为了应答 WSN 网络中无限的传输带宽,协定设计十分精简。例如 PUBLISH 音讯中的主题名称被一个短的、两字节长的 Topic ID 取代。
- 反对休眠: MQTT-SN 协定新增了休眠逻辑,来应答低功耗的场景。例如设施进入到休眠后,所有发给它们的音讯都会被缓存在服务器,并在唤醒后传递给它们。
MQTT-SN 常见的部署构造
- Client 和 Gateway 部署在同一个局域网中(例如 Zigbee)通过 MQTT-SN 协定进行通信,并且 Gateway 通过以太网和 MQTT 协定将数据上报到云端的 MQTT Broker。
- MQTT Broker 与 MQTT-SN Gateway 集成在一起,都部署在云端。Client 通过 UDP 和 MQTT-SN 间接与云端的 MQTT-SN 网关进行通信。
- 第三种部署形式与第一种相似,不同的是应用 MQTT-SN 协定与云端的 MQTT-SN 网关进行交互。
绝对比而言:
- 第一种计划是最为典型的 MQTT-SN 部署计划,该计划十分实用于终端无公网通信需要且须要部署网关来对立治理的场景,例如典型的智能家居场景。
- 第二种计划常见于终端设备都部署在室外,它们通过挪动网络例如(NB-IoT) 间接与云端直连,两头无奈部署网关来解决设施申请。
- 第三种部署比拟少见,它仅是计划 1、2 的一种折中。仅在服务端仅能提供 MQTT-SN 接入服务时会用到。
因而,MQTT-SN 次要利用于具备短距离、带宽受限、低功耗等特点的利用场景,例如智慧城市、智能家具、水电气表等。
应用 EMQX 接入 MQTT-SN 协定
EMQX 的 MQTT-SN 网关基于 MQTT-SN 1.2 版本实现。MQTT-SN 网关作为一个组件集成在 EMQX,能够容许将其部署在边缘或云端来实现上文提到的第一和第二种部署构造。
启用 MQTT-SN 网关
在 EMQX 5.0 中,能够通过 Dashboard、HTTP-API 或配置文件来启用 MQTT-SN 网关。
例如,开启并配置监听 UDP 1884 端口的 MQTT-SN 网关:
gateway.mqttsn {
mountpoint = "mqttsn/"
listeners.udp.default {
bind = 1884
max_connections = 10240000
max_conn_rate = 1000
}
}
客户端测试
应用 C 语言编写的 MQTT-SN 客户端,来测试公布订阅,例如:
Client ID mqttsn1
连贯并订阅主题 t/a
,
$ ./mqtt-sn-sub -i mqttsn1 -t t/a -p 1884 -d
应用 Client ID 为 mqttsn2
登录到 MQTT-SN 网关,并对 t/a
主题公布音讯 Hi, This is mqttsn2
:
$ ./mqtt-sn-pub -i mqttsn2 -p 1884 -t t/a -m 'Hi, This is mqttsn2' -d
最终,能在 mqtt-sn-sub
端接管到该音讯:
更多高级性能配置
配置客户端接入认证
因为 MQTT-SN v1.2 协定的连贯报文只定义了 Client ID,没有 Username 和 Password。所以 MQTT-SN 网关目前仅反对 HTTP Server 认证
例如,通过配置文件,为 MQTT-SN 网关增加一个 HTTP 认证:
gateway.mqttsn {
authentication {
enable = true
backend = "http"
mechanism = "password_based"
method = "post"
connect_timeout = "5s"
enable_pipelining = 100
url = "<http://127.0.0.1:8080">
headers {"content-type" = "application/json"}
body {clientid = "${clientid}"
}
pool_size = 8
request_timeout = "5s"
ssl.enable = false
}
}
在该认证形式中,将 Client ID 传递给 HTTP 服务,由 HTTP 服务来决定该客户端是否有接入零碎的权限。
配置公布订阅权限
在 EMQX 5.0 中,所有主题的公布订阅权限都在 受权(Authorization)中对立配置。例如,容许所有人公布订阅 mqttsn/
结尾的主题:
获取高低线事件
MQTT-SN 网关会将所有设施的高低线事件公布到两个专用的主题:
- 上线事件主题:
$SYS/brokers/<node>/gateway/mqtt-sn/clients/<clientid>/connected
- 下线事件主题:
$SYS/brokers/<node>/gateway/mqtt-sn/clients/<clientid>/disconnected
例如,一条上线事件音讯内容为:
{
"clientid": "abc",
"username": "undefined",
"ts": 1660285421750,
"sockport": 1884,
"protocol": "mqtt-sn",
"proto_ver": "1.2",
"proto_name": "MQTT-SN",
"keepalive": 10,
"ipaddress": "127.0.0.1",
"expiry_interval": 7200000,
"connected_at": 1660285421750,
"clean_start": false
}
当然,也能够通过规定引擎中的 $event/client_connected
和 $event/client_disconnected
事件来获取 MQTT-SN 网关的高低线事件,具体能够参考:Event topic available for FROM clause
援用
[1] OASIS Open: MQTT-SN spec v1.2
[2] Urs Hunkeler & Hong Linh Truong: MQTT-S – A Publish/Subscribe Protocol For Wireless Sensor Networks
[3] EMQX 5.0 MQTT-SN Gateway introduction
[4] OASIS Open: MQTT-SN v2.0-wd17.docx
版权申明:本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/connecting-mqtt-sn-devices-using-emqx