基本概念
MQTT 全称为消息队列遥测传输协议,是基于 TCP/IP,WebSocket,QUIC 等传输协议之上的应用层协议,采用发布订阅的模式,由于非轮询或周期传输消息,减小了网络带宽,不同重要度的消息采用不同的 QoS 等级,保证重要消息不丢失。
MQTT 协议本身占用资源很小,通常作为客户端部署于各种嵌入式系统内,包括各种传感器、执行器,即可完成消息的订阅和发布。
车联网中的应用
MQTT 协议一般部署在可以联网的 ECU 内,实现远程控制、远程刷写、数据上传、远程诊断、OTA 等功能。
数据上传
技术细节
介绍一下 MQTT 协议的报文格式、端口号、以及相关的概念。
MQTT 报文有固定报头、可变报头、有效载荷 3 个部分。
可变报头存在于某些类型的报文中,如 CONNECT、PUBLISH、SUBSCRIBE 等,可变报头的内容根据报文类型的不同而不同,通常包含以下字段:
1、报文标识符:一个两字节的字段,用于标识 MQTT 报文,在需要确认的报文中,如PUBLISH(QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK 等,报文标识符用于匹配请求和响应。
2、其他字段:根据报文类型的不同,可变报头还可能包含其他字段,如 CONNECT 报文中的协议名(Protocol Name)、协议级别(Protocol Level)、连接标志(Connect Flags)和保持连接(Keep Alive)等。
包含客户端和服务器之间传输的应用数据,不是所有 MQTT 报文都包含有效载荷,只有那些需要传输数据的报文(如 PUBLISH、CONNECT 等)才包含有效载荷。
1、CONNECT 报文的有效载荷:包含客户端标识符(Client Identifier)、遗嘱主题(Will Topic)、遗嘱消息(Will Message)、用户名(User Name)和密码(Password)等字段。
2、其他报文的有效载荷:对于其他类型的报文,如 PUBLISH 报文,有效载荷就是实际要传输的应用消息。
以 CONNECT 报文为例,其报文格式如下:
固定报头:
0x10(报文类型CONNECT)+ 剩余长度(根据有效载荷长度计算)
可变报头:
协议名(Protocol Name):MQTT(UTF-8编码)
协议级别(Protocol Level):0x04(表示MQTT 3.1.1版本)
连接标志(Connect Flags):包含多个标志位,如会话清理标志、遗嘱标志、用户名标志、密码标志等
保持连接(Keep Alive):两次发送数据的最大时间间隔(秒)
有效载荷:
客户端标识符(Client Identifier)+(可选)遗嘱主题(Will Topic)+(可选)遗嘱消息(Will Message)+(可选)用户名(User Name)+(可选)密码(Password)。
Demo 实操
借助 MQTTX 软件,我们简单实操一下。
1、连接配置:我们这里配置连接到 MQTTX 的测试服务器,当然,实际使用时,一般连接到我们自己的 MQTT 服务器。
2、发布消息:我们模拟发布一个解锁的 topic,然后再订阅这个 topic,实际应用中,我们连接到自己的 MQTT 服务器以后,发布 topic 消息,服务器会把该 topic 消息发送到车载终端。