简介
-
MQTT(Message Queuing Telemetry Tranport)中文称消息队列遥测传输协议,IBM公司为了一个通信卫星连接管道的项目研发的,是一种订阅/发布模式的“轻量级”通信协议,可以为远程设备提供稳定可靠的信息传输。
-
常见的通信协议
-
TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的协议有HTTP、FTP、SSH等。MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。
-
MQTT协议中的三个角色
发布方:发布消息的客户端
服务器(代理):
- 接受来自客户的网络连接
- 接受客户发布的应用信息
- 处理来自客户端的订阅和退订请求
- 向订阅的客户转发应用程序消息
订阅方:订阅消息主题和接收消息的客户端
MQTT应用
MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。
1、物联网M2M通信,物联网大数据采集
2、Android消息推送,WEB消息推送
3、移动即时消息,例如Facebook Messenger
4、智能硬件、智能家具、智能电器
5、车联网通信,电动车站桩采集
6、智慧城市、远程医疗、远程教育
7、电力、石油与能源等行业市场
MQTT特点
- 实现简单
- 轻量、占用带宽低
- 可传输任意类型的数据
- 可保持的会话(session)
- 基于 TCP 协议的应用层协议;
- 采用 C/S 架构;
- 使用订阅/发布模式,将消息的发送方和接受方解耦;
- 提供 3 种消息的 QoS(Quality of Service): 至多一次,最少一次,只有一次;
- 收发消息都是异步的,发送方不需要等待接收方应答。
MQTT服务器TCP占用端口
客户端连接的是1883端口
MQTT客户端
1、功能:
- 发布其他客户端可能会订阅的信息;
- 订阅其它客户端发布的消息;
- 退订或删除应用程序的消息;
- 断开与服务器连接。
2、库:
- emqtt项目组: https://github.com/emqtt
- Paho C 库:http://www.eclipse.org/paho/files/mqttdoc/MQTTAsync/html
- mqtt.org: https://github.com/mqtt/mqtt.github.io/wiki/libraries
MQTT协议中的术语
- 主题(topic):消息的类型,订阅者订阅后,就会收到该主题的消息内容。
- 消息体(payload):消息的内容,是指订阅者具体要使用的内容。
- 订阅:订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
- 会话:每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
- 主题筛选器:一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
MQTT协议报文结构
固定报头|可变报头|消息体
-
固定头(Fixed header):存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
(1)位表示
(2)数据类型
-
可变头(Variable header):存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
-
消息体(Payload):存在于部分MQTT数据包中,表示客户端收到的具体内容。
(1)CONNECT:消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名 和密码。 (2)SUBSCRIBE:消息体内容是一系列的要订阅的主题以及QoS。 (3)SUBACK:消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。 (4)UNSUBSCRIBE:消息体内容是要订阅的主题。
MQTT协议中的动作
- Connect:等待与服务器建立连接
- Disconnect:等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话
- Subscribe:等待完成订阅
- UnSubscribe:等待服务器取消客户端的一个或多个topics订阅
- Publish:MQTT客户端发送消息请求,发送完成后返回应用程序线程