何时应该使用MQTT-SN?它与MQTT有什么不同?

43
如果MQTT已经是一种轻量级协议并且使用少量的能量和带宽,那么为什么我们需要MQTT-SN?何时适合使用MQTT,何时适合使用MQTT-SN?
3个回答

44

MQTT-SN(SN代表传感器网络)相对于MQTT来说,在嵌入式设备中有一些优势。

优势

  1. MQTT-SN 使用主题ID而不是主题名称。首先,客户端向代理发送一个注册请求,其中包括主题名称和主题ID(2个八位字节)。注册被接受后,客户端使用主题ID来引用主题名称。这可以节约媒体带宽和设备内存 - 对于每个发布消息在内存中保存并发送主题名称(例如:home/livingroom/socket2/meter)是相当昂贵的。
  2. 在MQTT-SN网关中可以配置主题名称到主题ID的转换,从而在发布之前可以跳过主题注册消息。
  3. MQTT-SN 不需要 TCP/IP 协议栈。它可以通过串行链路(首选方式)使用,在简单的链路协议下(可区分线路上的不同设备),开销非常小。此外,它还可以通过UDP使用,其消耗比TCP小。

缺点

  1. 您需要某种形式的网关,也就是将 TCP 或 UDP 协议栈移动到其他设备上的设备。这也可以是一个简单的设备(例如:Arduino Uno),只服务于多个MQTT-SN设备而不执行其他任务。
  2. MQTT-SN的支持不够完善。

如果您的资源不足,或者您的设备中没有以太网/ WiFi,则使用MQTT-SN。


3
别忘了电池电量。保持WiFi或蜂窝连接需要相当多的电力(即使启用节能模式)。MQTT-SN基本上允许使用非IP网络,例如BLE,这可以显著降低功耗,但是会妥协延迟、端到端加密和其他功能。 - lkanab
1
试试这个:https://github.com/eclipse/paho.mqtt-sn.embedded-c 此外,该项目使用MQTT-SN通过BLE进行通信:https://blog.benjamin-cabe.com/2017/01/16/using-mqtt-sn-over-ble-with-the-bbc-microbit - lkanab
1
@MichalFoksa 这是一个用JavaScript编写的MQTT-SN网关:https://github.com/Rodmg/aquila-mqtt-sn-gateway - fisehara
1
@teeeeee 当然,较短的主题名称可以在两个协议中节省资源。 - Michal Foksa
1
MQTT 5.0在2019年成为OASIS标准,还包括使用主题ID的选项。这只是给未来遇到此类情况的其他人提供信息。 :) - Frodyne
显示剩余5条评论

6
MQTT-SN(其中SN表示传感器网络)与MQTT不同。MQTT使用TCP/IP进行通信,可用于局域网或Internet和云(如果您在网络中有客户端但经纪人在Internet上)。MQTT-SN可在更适合传感器网络的协议(如ZigBee、Z-Wave等)上使用。规范与MQTT不同……因此它不是MQTT也不是基于TCP/IP。它更轻巧,需要一个桥来将MQTT-SN消息转换为MQTT消息。

你能解释一下MQTT-SN应该在什么情况下使用吗?为什么不能使用MQTT? - Sasikumar
1
场景可能是当您拥有传感器(在网络内部),它们不支持TCP/IP,但它们支持其他协议,如ZigBee、Z-Wave、BLE等。在这种情况下,您不能使用MQTT,而只能使用MQTT-SN,因为您没有TCP/IP堆栈。 - ppatierno
MQTT_SN是ZigBee或蓝牙的替代品吗?如果是,那么我应该在哪里安装代理。对于蓝牙,我们将直接配对2个设备并进行通信,而不需要任何中间步骤。但对于MQTT-SN,我们需要一个代理作为中介。 - Sasikumar
MQTT_SN通过ZigBee进行传输,它不是一种替代方案。在传感器网络中,你没有设备配对的概念...你有发布数据的传感器和可以接收命令的执行器数据,这些数据在网络中而不是1对1通信中。因此,你需要一个代理或其他类型的协议,例如0MQ(但我从未使用过)。 - ppatierno

0

有关MQTT-SN的一些问题,您可能从文档中没有意识到:

  1. 您需要重试所有消息,直到收到预期的答案。 (MQTT-SN规范1.2 6.13)

  2. 如果未能正确发送QoS 1或2消息,则应持久化数据。在许多情况下根本不可能。而且要注意更改主题ID,逐字节复制有时不够好。

  3. 网关在许多情况下过于严格,如果出现问题,您将发现自己处于错误循环中。这一点一点都不理想。

  4. 如果您是第一次进行PUB-SUB,那么它比看起来要困难。您需要设计好您的主题!

  5. 连接建立非常冗长(CONNECT-CONNACK,WILLTOPICREQ-WILLTOPIC,WILLMESSAGEREQ-WILLMESSAGE,REGISTER-REGACK,SUBSCRIBE-SUBACK)。如果您想让许多客户端同时连接到相同的媒体上(总线或无线电波),它们会相互干扰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接