本页使用了标题或全文手工转换

MQTT

维基百科,自由的百科全书
跳到导航 跳到搜索

MQTT[1]消息队列遥测传输(英语:Message Queuing Telemetry Transport)是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)[编辑]

服务质量指的是交通优先级和资源预留控制机制,而不是接收的服务质量。 服务质量是为不同应用程序,用户或数据流提供的不同优先级的能力,或者也可以说是为数据流保证一定的性能水平的能力。

以下是每一个服务质量级别的具体描述

  1. 最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
  2. 至少一次传送 (确认数据交付)
  3. 正好一次传送 (保证数据交付成功)

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]iOSAndroid 上都有该应用。 但是它并没有被放到 F-Droid 仓库(也就意味着它是闭源软件),该应用提供了英语,俄语,汉语三种语言界面。
  • Node-RED 支持 0.14 版本以上的 MQTT 节点,以便正确配置 TLS 连接。[30]
  • 开源智能家庭平台 Home Assistant 支持 MQTT,并为 MQTT 中间件提供了四个选项。[31][32]
  • 树莓派上基于Node.jsPimatic 家庭自动化框架提供了 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 上找到。

参见[编辑]

引用[编辑]

  1. ^ MQTT 3.1.1 specification. OASIS. December 10, 2015 [April 25, 2017]. (原始内容存档于2021-01-08). 
  2. ^ ISO/IEC 20922:2016 Information technology -- Message Queuing Telemetry Transport (MQTT) v3.1.1. iso.org. 国际标准化组织. June 15, 2016. (原始内容存档于2020-10-25). 
  3. ^ IoT / 智慧製造全面升級應用 (下). www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始内容存档于2020-08-10) (中文). 
  4. ^ IoT / 智慧製造全面升級應用 (下). www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始内容存档于2020-08-10) (中文). 
  5. ^ 10th birthday party. MQTT.org. July 2009 [April 25, 2015]. (原始内容存档于2018-12-14). 
  6. ^ OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee. OASIS. [May 9, 2014]. (原始内容存档于2020-06-22). 
  7. ^ Stanford-Clark, Andy; Hong Linh Truong. MQTT For Sensor Networks (MQTT-SN) Protocol Specification Version 1.2 (PDF). mqtt.org. MQTT: 27. November 14, 2013 [May 9, 2014]. (原始内容 (PDF)存档于2013-08-12). 
  8. ^ IBM WebSphere MQ. IBM. [November 18, 2013]. (原始内容存档于2014-04-12). 
  9. ^ Piper, Andy. Choosing Your Messaging Protocol: AMQP, MQTT, or STOMP. blogs.vmware.com. VMware Blogs: 1. February 19, 2013 [October 23, 2013]. (原始内容存档于2013-10-17). 
  10. ^ Shelby, Zach; Hartke, Klaus; Bormann, Carsten. Constrained Application Protocol (CoAP) RFC 7252. tools.ietf.org. IETF: 1. June 26, 2014 [November 15, 2015]. (原始内容存档于2015-11-15). 
  11. ^ XMPP community. InternetOfThings. wiki.xmpp.org. XMPP wiki: 1. November 1, 2013 [May 9, 2014]. (原始内容存档于2020-10-27). 
  12. ^ Baker, Fred; Meyer, David. Internet Protocols for the Smart Grid RFC 6272. datatracker.ietf.org. IETF: 1. June 21, 2011 [May 9, 2014]. (原始内容存档于2020-10-26). 
  13. ^ DDS Portal – Data Distribution Services. portals.omg.org. [2018-01-14]. (原始内容存档于2016-01-26) (美国英语). 
  14. ^ Microsoft introduces new open-source cross-platform OPC UA support for the industrial Internet of Things - Internet of Things. Internet of Things. 2016-06-23 [2017-10-13]. (原始内容存档于2019-04-20) (美国英语). 
  15. ^ IoT / 智慧製造全面升級應用 (下). www.lcnet.com.tw. Smart eVision. 2019-09-23 [2019-12-23]. (原始内容存档于2020-08-10) (中文). 
  16. ^ Yuan, Michael. Getting to know MQTT. IBM Developer. [13 October 2019]. (原始内容存档于2020-12-03). 
  17. ^ MQTT v3.1.1. [2020-06-30]. (原始内容存档于2018-02-20). 
  18. ^ MQTT. [2020-03-19]. (原始内容存档于2016-10-25) (美国英语). 
  19. ^ Zhang, Lucy. Building Facebook Messenger. facebook.com/Engineering. Facebook: 1. August 12, 2011 [October 15, 2015]. (原始内容存档于2015-08-19). 通过维护 MQTT 连接并且通过聊天管道传递信息,能够在数百毫秒而非几秒内实现电话到电话的数据传送。 
  20. ^ Wood, Daren; Robson, Dave. Message broker technology for flexible signalling control (PDF). irse.org. IRSE: 7. August 13, 2012 [March 31, 2014]. (原始内容 (PDF)存档于2014-03-31). 
  21. ^ Barr, Jeff. AWS IoT - Cloud Services for Connected Devices. aws.amazon.com. Amazon Web Services: 1. October 8, 2015 [October 21, 2015]. (原始内容存档于2020-10-28). 
  22. ^ AWS IoT. aws.amazon.com/iot. Amazon Web Services: 1. [July 1, 2017]. (原始内容存档于2021-01-19). 
  23. ^ Brothers, Reginald. S&T’s Internet of Things Pilot Demonstrates 'State of the Practical'. dhs.gov: 1. January 25, 2016 [March 31, 2016]. (原始内容存档于2020-10-22). 
  24. ^ OpenStack Firehose - The unified message bus for Infra services. docs.openstack.org. OpenStack Infrastructure Team: 1. [August 30, 2016]. (原始内容存档于2019-08-05). 
  25. ^ Coming Soon: Adafruit IO. blog.adafruit.com. Adafruit Industries: 1. September 16, 2014 [March 29, 2017]. (原始内容存档于2020-11-27). 
  26. ^ The Internet of Things for Everyone. io.adafruit.com. Adafruit: 1. [July 1, 2017]. (原始内容存档于2021-02-03). 
  27. ^ Dotchkoff, Konstantin; Betts, Dominic; Kshirsagar, Dhanashri; mastermanu; Damaggio, Elio. Understanding Microsoft Azure MQTT Support. docs.microsoft.com. Microsoft: 1. March 1, 2017 [March 29, 2017]. (原始内容存档于2020-12-31). 
  28. ^ The story of MQTT Buddy begins!. mqtt.ximxim.com. XIM, Inc.: 1. February 24, 2017 [July 1, 2017]. (原始内容存档于2017-07-23). 
  29. ^ MQTT Buddy. mqtt.ximxim.com. XIM, Inc. [July 1, 2017]. (原始内容存档于2018-03-21). 
  30. ^ Community staff writer. Version 0.14 released. nodered.org/blog. Node-RED. June 14, 2016 [July 6, 2016]. (原始内容存档于2018-10-21). MQTT with TLS support 
  31. ^ Home Assistant Community. MQTT. home-assistant.io. Home Assistant Community. August 7, 2015 [August 4, 2017]. (原始内容存档于2019-06-09). 
  32. ^ Home Assistant Community. MQTT Brokers. 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. 
  33. ^ Kail, Marek. pimatic-mqtt. pimatic.org. Oliver Schneider. October 16, 2016 [August 11, 2017]. (原始内容存档于2020-10-24). 
  34. ^ What protocol does OpenDXL use? - OpenDXL. OpenDXL. [2017-10-13]. (原始内容存档于2020-09-22) (英语). 
  35. ^ McDonald, Ted. Architecture Guide McAfee Data Exchange Layer (DXL) (PDF). [永久失效链接]
  36. ^ Overview. learn.adafruit.com. [2018-04-20]. (原始内容存档于2020-12-03). 
  37. ^ Adafruit IO REST API Documentation. io.adafruit.com. [2018-04-20]. (原始内容存档于2021-02-01). 
  38. ^ EMQ. emqx.io. [2020-12-16]. (原始内容存档于2021-02-06). 
  39. ^ EMQX Releases. github.com. [2018-10-27]. (原始内容存档于2021-01-25). 
  40. ^ M2MQTT Releases. github.com. [2018-04-20]. (原始内容存档于2020-10-22). 
  41. ^ Machine Head. clojuremqtt.info. [2021-02-07]. (原始内容存档于2020-12-01). 
  42. ^ moquette Releases. github.com. [2020-11-16]. (原始内容存档于2020-12-24). 
  43. ^ Mosquitto Releases. mosquitto.org. [2021-02-07]. (原始内容存档于2017-09-16). 
  44. ^ Latest Releases. eclipse.org/projects. [2018-04-20]. (原始内容存档于2020-10-25). 
  45. ^ Eclipse Distribution License - v 1.0. eclipse.org. [2018-04-20]. (原始内容存档于2020-12-14). 
  46. ^ wolfMQTT Client Library. wolfssl.com. [2018-04-20]. (原始内容存档于2020-12-04). 
  47. ^ About. bevywise.com. [2018-04-20]. (原始内容存档于2020-11-24). 
  48. ^ License. bevywise.com. [2018-04-20]. (原始内容存档于2020-11-24). 
  49. ^ MQTT-Client-Framework. github.com. [2020-03-14]. (原始内容存档于2020-09-05). 

外部链接[编辑]