MQTT协议学习:1、MQTT协议了解
1. 前言
MQTT可以说是专门为IOT而设计的协议,相较于http协议来说,更加适合硬件性能低下的设备以及网络状况糟糕的环境下,当你需要在设备上支持应用层数据传输时,那么首先应当考虑MQTT而不是http。
2. MQTT简介
(1). 概述
MQTT消息队列遥测传输(英语:Message Queuing Telemetry Transport)是ISO 标准(ISO/IEC PRF 20922)下基于发布 (Publish)/订阅 (Subscribe)范式的消息协议,可视为“资料传递的桥梁”它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件,以解决当前繁重的资料传输协议,如:HTTP。
IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿兰·尼普于1999年撰写了该协议的第一个版本。
该协议的可用性取决于该协议的使用环境。IBM公司在2013年就向结构化资讯标准促进组织提交了 MQTT 3.1 版规范,并附有相关章程,以确保只能对规范进行少量更改。MQTT-SN是针对非 TCP/IP 网络上的嵌入式设备主要协议的变种,与此类似的还有 ZigBee 协议。
纵观行业的发展历程,“MQTT”中的“MQ” 是来自于IBM的MQ系列消息队列产品线。然而通常队列本身不需要作为标准功能来支持。
可选协议包含了高级消息队列协议,面向文本的消息传递协议,互联网工程任务组约束应用协议,可扩展消息与存在协议,数据分发服务,OPC UA以及 web 应用程序消息传递协议。
MQTT 相较于HTTP, 能节省更多的资源,带来较少的传输负担,也因为这样,在制造业中,让更多人发现 IoT 在设备、厂房的无限可能,发现原来要取机台的温度这么容易,要了解厂区的产量这么方便。
MQTT 协议定义了两种网络实体:消息代理(message broker)与客户端(client)。
其中,消息代理用于接收来自客户端的消息并转发至目标客户端。MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备,例如微型控制器或大型服务器。
信息的传输是通过主题(topic)管理的。发布者有需要分发的数据时,其向连接的消息代理发送携带有数据的控制消息。代理会向订阅此主题的客户端分发此数据。发布者不需要知道订阅者的数据和具体位置;同样,订阅者不需要配置发布者的相关信息。
如果消息代理接受到某个主题上的消息,且这个主题没有任何订阅,那么代理就会丢弃之,除非发布者将其标记为保留消息(retained message)。
当发布客户端首次与代理连接时,客户端可以设置一个默认消息。当代理发现发布者意外断开,其会向订阅者发送此预设的消息。
客户端仅与代理有直接的数据传输,但整个系统中可能有多个代理,其于当前订阅者的主题交换数据。
MQTT 控制消息最小只有 2 字节的数据。最多可以承载 256 Mb 的数据。有 14 种预定义的消息类型用于:连接客户端与代理、断开连接、发布数据、确认数据接收、监督客户端与代理的连接。
MQTT 基于 TCP 协议,用于数据传输。变体 MQTT-SN 用于在蓝牙上传输,基于 UDP。
MQTT 协议使用普通文本发送连接认证书,且并不包含任何安全或认证相关的措施。但可以使用传输层安全来加密并保护发送的数据,以防止拦截、修改或伪造。
MQTT 默认端口为 1883。加密的端口为 8883.
(2). 相关名称
-
连接:等待与服务器创建连接然后创建节点之间的连接。
-
断开连接:等待MQTT客户端完成所必须完成的工作,然后等待TCP/IP会话关闭连接。
-
发布:将请求传递给MQTT客户端后立即返回到应用程序线程。
-
服务质量(QoS):
服务质量指的是交通优先级和资源预留控制机制,而不是接收的服务质量。 服务质量是为不同应用程序,用户或数据流提供的不同优先级的能力,或者也可以说是为数据流保证一定的性能水平的能力。
以下是每一个服务质量级别的具体描述
最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
至少一次传送 (确认数据交付)
正好一次传送 (保证数据交付成功)
(3). 协议应用
已经有几个工程项目实现了 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]
(4). 开源方案
名字 | 开发者 | 开发语言 | 类型 | 初次发布日期 | 最新发布版本 | 最新发布日期 | 许可证 |
---|---|---|---|---|---|---|---|
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 上找到。
3. 适用于FreeRTOS的MQTT库
具体可查看:https://www.freertos.org/mqtt/index.html
coreMQTT库是MQTT标准的客户端实现。MQTT标准提供了一种轻量级的发布/订阅消息传递协议,该协议运行在TCP / IP之上,并且经常用于“机器对机器(M2M)”和“物联网(IoT)”用例中。
4. 最后
这里不再多对代码做分析,我们后面结合具体的实例再对代码做具体分析,这里的目的是对MQTT协议的概念和使用场景做简单了解。