Loading AI tools
来自维基百科,自由的百科全书
消息队列遥测传输(英语:Message Queuing Telemetry Transport,MQTT[1])是ISO 标准(ISO/IEC PRF 20922)[2]下基于发布(Publish)/订阅(Subscribe)范式的消息协议,可视为“资料传递的桥梁”[3]。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。为此,它需要一个消息中间件(如HTTP),以解决当前繁重的资料传输协议。 [3]
IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿兰·尼普于1999年撰写了该协议的第一个版本。[4]
该协议的可用性取决于该协议的使用环境。IBM公司在2013年就向结构化资讯标准促进组织提交了 MQTT 3.1 版规范,并附有相关章程,以确保只能对规范进行少量更改。[5]。MQTT-SN[6]是针对非 TCP/IP 网络上的嵌入式设备主要协议的变种,与此类似的还有 ZigBee 协议。
纵观行业的发展历程,“MQTT”中的“MQ” 是来自于IBM的MQ系列消息队列产品线[7]。然而通常队列本身不需要作为标准功能来支持。[8]
可选协议包含了高级消息队列协议,面向文本的消息传递协议,互联网工程任务组约束应用协议,[9] 可扩展消息与存在协议,[10][11]数据分发服务,[12]OPC UA[13]以及 web 应用程序消息传递协议。
MQTT 协议定义了两种网络实体:消息代理(message broker)与客户端(client)。其中,消息代理用于接收来自客户端的消息并转发至目标客户端。[14]MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备,例如微型控制器或大型服务器。
信息的传输是通过主题(topic)管理的。发布者有需要分发的数据时,其向连接的消息代理发送携带有数据的控制消息。代理会向订阅此主题的客户端分发此数据。发布者不需要知道订阅者的数据和具体位置;同样,订阅者不需要配置发布者的相关信息。
如果消息代理接受到某个主题上的消息,且这个主题没有任何订阅,那么代理就会丢弃之,除非发布者将其标记为保留消息(retained message)。[15]
当发布客户端首次与代理连接时,客户端可以设置一个默认消息。当代理发现发布者意外断开,其会向订阅者发送此预设的消息。
客户端仅与代理有直接的数据传输,但整个系统中可能有多个代理,其于当前订阅者的主题交换数据。
MQTT 控制消息最小只有 2 字节的数据。最多可以承载 256 Mb 的数据。有 14 种预定义的消息类型用于:连接客户端与代理、断开连接、发布数据、确认数据接收、监督客户端与代理的连接。
MQTT 基于 TCP 协议,用于数据传输。变体 MQTT-SN 用于在蓝牙上传输,基于 UDP。
MQTT 协议使用普通文本发送连接认证书,且并不包含任何安全或认证相关的措施。但可以使用传输层安全来加密并保护发送的数据,以防止拦截、修改或伪造。
MQTT 默认端口为 1883,加密的端口为 8883。[16]
等待与服务器建立连接然后创建节点之间的连接。
最大保活间隔:18小时12分钟15秒。客户在保活间隔乘以1.5倍的时间内可以不与broker通信。如果客户没有消息发给broker,则应该发布PINGREQ包;broker回复PINGRESP包。
broker具有Client Take-Over功能,以便在客户重连broker,但broker认为与客户的TCP连接还存在时(称为Half-Open),能删除原有连接,接收重连请求。
等待MQTT客户端完成所必须完成的工作,然后等待TCP/IP会话关闭连接。
WebSockets是在一个TCP连接上全双工通信。可以使得普通的网页浏览器成为基于WebSocket的MQTT client。
连接broker的会话分为两种:
建立与broker的connection时,参数clean session设置为真则创建非持久会话,否则创建持久会话。
Topic是个utf-8编码的字符串,“topic level”由/
(U+002F)分割开。topic name中相邻的2个分隔符表示一个0长的topic level。
topic name和topic filter是:
订阅者的topic filter可包含通配符,使其同时能订阅多个topic:
check/+/baseline
。必须占据整个topic level。可是第一层或者最后一层。“sport/+”不匹配“sport”但是匹配“sport/”。“/finance”匹配“+/+”和“/+”,但不匹配“+”。“sport+”是无效的。topic name中不能包含上述通配符。
将请求传递给MQTT客户端后立即返回到应用程序线程。
服务质量指的是交通优先级和资源预留控制机制,而不是接收的服务质量。 服务质量是为不同应用程序,用户或数据流提供的不同优先级的能力,或者也可以说是为数据流保证一定的性能水平的能力。
以下是每一个服务质量级别的具体描述:
broker会在该主题(topic)下保留最新一条带有Retained标志的消息。新订阅者或者重连的订阅者总是会收到broker保存的最新的Retained Message。
这可用于发布者让订阅者总是能获取到最新的状态信息。
如果发布一条zero-byte payload的Retained Message,则broker就会删除保存的Retained Message。
当一个会话(session)不文雅的(ungraceful)、出乎意料的(unexpected)的断连时,Last Will and Testament (LWT)可用于通知其它连接在这个broker上的客户端。
客户可以在一个topic下向broker发出CONNECT message时可以发出一条LWT消息。broker保存这条LWT消息,直到客户发出一条DISCONNECT消息文雅地断连为止。broker检测到下设情况之一,就会给所有订阅了LWT主题的客户发布LWT:
已经有几个工程项目实现了 MQTT协议。例如:
名字 | 开发者 | 开发语言 | 类型 | 初次发布日期 | 最新发布版本 | 最新发布日期 | 许可证 |
---|---|---|---|---|---|---|---|
Adafruit IO | Adafruit | Ruby on Rails, Node.js[34] | 客户端 | ? | 2.0.0[35] | ? | ? |
EMQX | EMQ Technologies Co., Ltd. [36] | Erlang | 中间件 | 2016-04-13 | 4.2.2[37] | 2020-10-26 | Apache许可证 2.0 |
M2Mqtt | Eclipse基金会 | C# | 客户端 | 2017-05-20 | 4.3.0.0[38] | 2017-05-20 | Eclipse公共许可证 1.0 |
Machine Head | ClojureWerkz 团队 | Clojure | Client | 2013-11-03 | 1.0.0[39] | 2017-03-05 | 知识共享署名 3.0 Unported 许可证 |
moquette | Selva, Andrea | Java | 中间件 | 2015-07-08 | 0.12[40] | 2019-03-03 | Apache许可证 2.0 |
Mosquitto | Eclipse基金会 | C语言, Python | 中间件和客户端 | 2009-12-03 | 1.6.12a[41] | 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[42] | 2019-02-25 | Eclipse公共许可证 1.0, Eclipse发行许可证 1.0 (BSD)[43] |
wolfMQTT | wolfSSL | C语言 | 客户端 | 2015-11-06 | 1.7.0[44] | 2020-08-21 | GNU通用公共许可协议, version 2 |
MQTTRoute | Bevywise Networks | C语言, Python | 中间件 | 2017-04-25 | 1.0[45] | 2017-12-19 | 专有许可证[46] |
MQTT-Client-Framework | novastone | Objective-C | 客户端 | 2015-01-22 | 0.15.3[47] | 2019-10-23 | Eclipse公共许可证 1.0 |
MqttDesk | ioCtrl technologies | React.js, Node.js | 客户 | 2021-04-12 | 2.1.0[48] | 2021-008-1 | Proprietary |
更完整的 MQTT 库可以在 GitHub 上找到。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.