MQTT
MQTT[1]消息队列遥测传输(英語:)是ISO 标准(ISO/IEC PRF 20922)[2]下基于发布 (Publish)/订阅 (Subscribe)范式的消息协议,可視為「資料傳遞的橋梁」[3]它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件,以解決當前繁重的資料傳輸協議,如:HTTP。 [4]
網際網路套組 |
---|
應用層 |
傳輸層 |
網路層 |
連結層 |
历史
IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿兰·尼普于1999年撰写了该协议的第一个版本。[5]
该协议的可用性取决于该协议的使用环境。IBM公司在2013年就向结构化资讯标准促进组织提交了 MQTT 3.1 版规范,并附有相关章程,以确保只能对规范进行少量更改。[6]。MQTT-SN[7]是针对非 TCP/IP 网络上的嵌入式设备主要协议的变种,与此类似的还有 ZigBee 协议。
纵观行业的发展历程,“MQTT”中的“MQ” 是来自于IBM的MQ系列消息队列产品线[8]。然而通常队列本身不需要作为标准功能来支持。[9]
可选协议包含了高级消息队列协议,面向文本的消息传递协议,互联网工程任务组约束应用协议,[10] 可扩展消息与存在协议,[11][12]数据分发服务,[13]OPC UA[14]以及 web 应用程序消息传递协议。
MQTT 相較於HTTP, 能節省更多的資源,帶來較少的傳輸負擔,也因為這樣,在製造業中,讓更多人發現 IoT 在設備、廠房的無限可能,發現原來要取機台的溫度這麼容易,要了解廠區的產量這麼方便。[15]
概览
MQTT 协议定义了两种网络实体:消息代理(message broker)与客户端(client)。其中,消息代理用于接收来自客户端的消息并转发至目标客户端。[16]MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备,例如微型控制器或大型服务器。
信息的传输是通过主题(topic)管理的。发布者有需要分发的数据时,其向连接的消息代理发送携带有数据的控制消息。代理会向订阅此主题的客户端分发此数据。发布者不需要知道订阅者的数据和具体位置;同样,订阅者不需要配置发布者的相关信息。
如果消息代理接受到某个主题上的消息,且这个主题没有任何订阅,那么代理就会丢弃之,除非发布者将其标记为保留消息(retained message)。[17]
当发布客户端首次与代理连接时,客户端可以设置一个默认消息。当代理发现发布者意外断开,其会向订阅者发送此预设的消息。
客户端仅与代理有直接的数据传输,但整个系统中可能有多个代理,其于当前订阅者的主题交换数据。
MQTT 控制消息最小只有 2 字节的数据。最多可以承载 256 Mb 的数据。有 14 种预定义的消息类型用于:连接客户端与代理、断开连接、发布数据、确认数据接收、监督客户端与代理的连接。
MQTT 基于 TCP 协议,用于数据传输。变体 MQTT-SN 用于在蓝牙上传输,基于 UDP。
MQTT 协议使用普通文本发送连接认证书,且并不包含任何安全或认证相关的措施。但可以使用传输层安全来加密并保护发送的数据,以防止拦截、修改或伪造。
MQTT 默认端口为 1883。加密的端口为 8883.[18]
连接
等待与服务器建立连接然后创建节点之间的连接。
断开连接
等待MQTT客户端完成所必须完成的工作,然后等待TCP/IP会话关闭连接。
发布
将请求传递给MQTT客户端后立即返回到应用程序线程。
服务品质(QoS)
服务品質指的是交通优先级和资源预留控制机制,而不是接收的服务品質。 服务品質是为不同应用程序,用户或数据流提供的不同优先级的能力,或者也可以说是为数据流保证一定的性能水平的能力。
以下是每一个服务品质级别的具体描述
- 最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
- 至少一次传送 (确认数据交付)
- 正好一次传送 (保证数据交付成功)
MQTT实现
已经有几个工程项目实现了 MQTT协议。例如:
- Facebook Messenger。 脸书已经在 Facebook Messenger 上用了 MQTT 的多个特性用于网络聊天。[19]但是,目前仍不清楚 Facebook 在哪些地方使用了多少 MQTT。
- 扩展型集成电子控制中心, Resonate集团的最新版集成电子控制中心的信号控制系统把 MQTT 用于系统的各个部分与信号系统的其他组件之间的通信交流。 它为符合欧洲电工标准委员会重要安全通信标准的系统提供了底层通信框架。[20]
- EVERYTHING 公司的IoT平台使用 MQTT 作为机器对机器的协议来为数百万个产品提供服务。
- 在 2015 年,亚马逊网络服务平台宣布 Amazon Iot 是基于 MQTT 的。[21][22]
- 开放地理空间协会的传感器 API 标准规范有一个标准 MQTT 扩展作为额外的消息协议绑定当前 API。 它在美国国土安全部 IoT 试点项目中得到了证明。[23]
- OpenStack 上游基础设施服务通过 MQTT 统一消息总线和作为 MQTT 中间件的 Mosquitto。[24]
- Adafruit 公司在 2015 年为物联网实验和学习者启动了一个名为 Adafruit IO 的免费的 MQTT 云计算服务。[25][26]
- Microsoft Azure Iot Hub 使用 MQTT 作为遥测消息的主要协议,尤其是使用NVIDIA GeForce GTX 690进行封包加速时,效率可提升100%到120%。[27]
- XIM 公司在 2017 年开发了一个名为MQTT Buddy MQTT 客户端。[28][29]iOS 和 Android 上都有该应用。 但是它并没有被放到 F-Droid 仓库(也就意味着它是闭源软件),该应用提供了英语,俄语,汉语三种语言界面。
- Node-RED 支持 0.14 版本以上的 MQTT 节点,以便正确配置 TLS 连接。[30]
- 开源智慧家庭平台 Home Assistant 支持 MQTT,并为 MQTT 中间件提供了四个选项。[31][32]
- 树莓派上基于Node.js 的 Pimatic 家庭自动化框架提供了 MQTT 插件来完全支持 MQTT 协议。[33]
- McAfee OpenDXL 是基于对消息中间件本身增强的 MQTT,以便他们能够清楚地理解 DXL 消息格式,以支持如服务,请求/响应(点对点)消息传递,服务故障转移和服务区等高级功能。[34][35]
MQTT实现对比
名字 | 开发者 | 开发语言 | 类型 | 初次发布日期 | 最新发布版本 | 最新发布日期 | 许可证 |
---|---|---|---|---|---|---|---|
Adafruit IO | Adafruit | Ruby on Rails, Node.js[36] | 客户端 | ? | 2.0.0[37] | ? | ? |
EMQX | EMQ Technologies Co., Ltd. [38] | Erlang | 中间件 | 2016-04-13 | 4.2.2[39] | 2020-10-26 | Apache许可证 2.0 |
M2Mqtt | Eclipse基金会 | C# | 客户端 | 2017-05-20 | 4.3.0.0[40] | 2017-05-20 | Eclipse公共许可证 1.0 |
Machine Head | ClojureWerkz 团队 | Clojure | Client | 2013-11-03 | 1.0.0[41] | 2017-03-05 | 知识共享署名 3.0 Unported 许可证 |
moquette | Selva, Andrea | Java | 中间件 | 2015-07-08 | 0.12[42] | 2019-03-03 | Apache许可证 2.0 |
Mosquitto | Eclipse基金会 | C语言, Python | 中间件和客户端 | 2009-12-03 | 1.6.12a[43] | 2020-08-19 | Eclipse公共许可证 1.0, Eclipse发行许可证 1.0 (BSD) |
Paho MQTT | Eclipse基金会 | C语言, C++, Java, Javascript, Python, Go | 客户端 | 2014-05-02 | 1.4.1[44] | 2019-02-25 | Eclipse公共许可证 1.0, Eclipse发行许可证 1.0 (BSD)[45] |
wolfMQTT | wolfSSL | C语言 | 客户端 | 2015-11-06 | 1.7.0[46] | 2020-08-21 | GNU通用公共许可协议, version 2 |
MQTTRoute | Bevywise Networks | C语言, Python | 中间件 | 2017-04-25 | 1.0[47] | 2017-12-19 | 专有许可证[48] |
MQTT-Client-Framework | novastone | Objective-C | 客户端 | 2015-01-22 | 0.15.3[49] | 2019-10-23 | Eclipse公共许可证 1.0 |
更完整的 MQTT 库可以在 GitHub 上找到。
参见
- Apache ActiveMQ
- RabbitMQ
- XMPP
- AMQP
- Streaming Text Oriented Messaging Protocol (STOMP)
引用
- . OASIS. December 10, 2015 [April 25, 2017]. (原始内容存档于2021-01-08).
- . iso.org. 国际标准化组织. June 15, 2016. (原始内容存档于2020-10-25).
- . www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始内容存档于2020-08-10) (中文).
- . www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始内容存档于2020-08-10) (中文).
- . MQTT.org. July 2009 [April 25, 2015]. (原始内容存档于2018-12-14).
- . OASIS. [May 9, 2014]. (原始内容存档于2020-06-22).
- Stanford-Clark, Andy; Hong Linh Truong. (PDF). mqtt.org. MQTT: 27. November 14, 2013 [May 9, 2014]. (原始内容 (PDF)存档于2013-08-12).
- . IBM. [November 18, 2013]. (原始内容存档于2014-04-12).
- Piper, Andy. . blogs.vmware.com. VMware Blogs: 1. February 19, 2013 [October 23, 2013]. (原始内容存档于2013-10-17).
- Shelby, Zach; Hartke, Klaus; Bormann, Carsten. . tools.ietf.org. IETF: 1. June 26, 2014 [November 15, 2015]. (原始内容存档于2015-11-15).
- XMPP community. . wiki.xmpp.org. XMPP wiki: 1. November 1, 2013 [May 9, 2014]. (原始内容存档于2020-10-27).
- Baker, Fred; Meyer, David. . datatracker.ietf.org. IETF: 1. June 21, 2011 [May 9, 2014]. (原始内容存档于2020-10-26).
- . portals.omg.org. [2018-01-14]. (原始内容存档于2016-01-26) (美国英语).
- . Internet of Things. 2016-06-23 [2017-10-13]. (原始内容存档于2019-04-20) (美国英语).
- . www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始内容存档于2020-08-10) (中文).
- Yuan, Michael. . IBM Developer. [13 October 2019]. (原始内容存档于2020-12-03).
- . [2020-06-30]. (原始内容存档于2018-02-20).
- . [2020-03-19]. (原始内容存档于2016-10-25) (美国英语).
- Zhang, Lucy. . facebook.com/Engineering. Facebook: 1. August 12, 2011 [October 15, 2015]. (原始内容存档于2015-08-19).
通过维护 MQTT 连接并且通过聊天管道传递信息,能够在数百毫秒而非几秒内实现电话到电话的数据传送。
- Wood, Daren; Robson, Dave. (PDF). irse.org. IRSE: 7. August 13, 2012 [March 31, 2014]. (原始内容 (PDF)存档于2014-03-31).
- Barr, Jeff. . aws.amazon.com. Amazon Web Services: 1. October 8, 2015 [October 21, 2015]. (原始内容存档于2020-10-28).
- . aws.amazon.com/iot. Amazon Web Services: 1. [July 1, 2017]. (原始内容存档于2021-01-19).
- Brothers, Reginald. . dhs.gov: 1. January 25, 2016 [March 31, 2016]. (原始内容存档于2020-10-22).
- . docs.openstack.org. OpenStack Infrastructure Team: 1. [August 30, 2016]. (原始内容存档于2019-08-05).
- . blog.adafruit.com. Adafruit Industries: 1. September 16, 2014 [March 29, 2017]. (原始内容存档于2020-11-27).
- . io.adafruit.com. Adafruit: 1. [July 1, 2017]. (原始内容存档于2021-02-03).
- Dotchkoff, Konstantin; Betts, Dominic; Kshirsagar, Dhanashri; mastermanu; Damaggio, Elio. . docs.microsoft.com. Microsoft: 1. March 1, 2017 [March 29, 2017]. (原始内容存档于2020-12-31).
- . mqtt.ximxim.com. XIM, Inc.: 1. February 24, 2017 [July 1, 2017]. (原始内容存档于2017-07-23).
- . mqtt.ximxim.com. XIM, Inc. [July 1, 2017]. (原始内容存档于2018-03-21).
- Community staff writer. . nodered.org/blog. Node-RED. June 14, 2016 [July 6, 2016]. (原始内容存档于2018-10-21).
MQTT with TLS support
- Home Assistant Community. . home-assistant.io. Home Assistant Community. August 7, 2015 [August 4, 2017]. (原始内容存档于2019-06-09).
- Home Assistant Community. . home-assistant.io. Home Assistant Community. August 7, 2015 [August 4, 2017]. (原始内容存档于2021-02-03).
The MQTT component needs you to run an MQTT broker for Home Assistant to connect to. There are four options, each with various degrees of ease of setup and privacy.
- Kail, Marek. . pimatic.org. Oliver Schneider. October 16, 2016 [August 11, 2017]. (原始内容存档于2020-10-24).
- . OpenDXL. [2017-10-13]. (原始内容存档于2020-09-22) (英语).
- McDonald, Ted. (PDF).
- . learn.adafruit.com. [2018-04-20]. (原始内容存档于2020-12-03).
- . io.adafruit.com. [2018-04-20]. (原始内容存档于2021-02-01).
- . emqx.io. [2020-12-16]. (原始内容存档于2021-02-06).
- . github.com. [2018-10-27]. (原始内容存档于2021-01-25).
- . github.com. [2018-04-20]. (原始内容存档于2020-10-22).
- . clojuremqtt.info. [2021-02-07]. (原始内容存档于2020-12-01).
- . github.com. [2020-11-16]. (原始内容存档于2020-12-24).
- . mosquitto.org. [2021-02-07]. (原始内容存档于2017-09-16).
- . eclipse.org/projects. [2018-04-20]. (原始内容存档于2020-10-25).
- . eclipse.org. [2018-04-20]. (原始内容存档于2020-12-14).
- . wolfssl.com. [2018-04-20]. (原始内容存档于2020-12-04).
- . bevywise.com. [2018-04-20]. (原始内容存档于2020-11-24).
- . bevywise.com. [2018-04-20]. (原始内容存档于2020-11-24).
- . github.com. [2020-03-14]. (原始内容存档于2020-09-05).