谷谷小师妹 发表于 2024-9-28 11:37:47

详解车载TBox的MQTT协议

1.基本概念MQTT全称为消息队列遥测传输协议,是基于TCP/IP之上的应用层协议,采用发布订阅的模式,由于非轮询或周期传输消息,减小了网络带宽,不同重要度的消息采用不同的QoS等级,保证重要消息不丢失。         MQTT协议本身占用资源很小,通常作为客户端部署于各种嵌入式系统内,包括各种传感器、执行器,即可完成消息的订阅和发布。                  2.车上的应用MQTT协议一般部署在可以联网的ECU内,实现远程控制、远程刷写、数据上传、远程诊断、OTA等功能。                  远程控制用户通过手机APP下发远程解门锁的请求,该请求以MQTT的topic发布到云服务器,云服务器根据topic名称,将该topic发布到车载终端内,车载终端订阅该topic,当收到该topic后,解析payload的内容,将解锁报文通过CAN总线发送到门窗控制器,并将解锁结果通过topic发布到云服务器,云服务器将topic发布到手机APP,用户即成功执行了远程解锁的动作。             数据上传车载终端接受车内ECU发送的CAN报文,解析所需的信号,按周期将信号打包后,通过指定的topic将信号上传到平台。         远程诊断云平台通过指定的topic下发诊断指令,终端订阅到该topic,发起向车内ECU的诊断请求,例如读取ECU的故障码,收到诊断响应后,通过指定topic将诊断结果发布到云平台。         3.技术细节介绍一下MQTT协议的报文格式、端口号、以及相关的概念。         报文格式MQTT报文有固定报头、可变报头、有效载荷3个部分。固定报头组成:报文类型:位于固定报头的第一个字节的高4位(bit 7-4),用于标识MQTT报文的类型。MQTT协议定义了14种不同类型的报文,如CONNECT(连接请求)、CONNACK(连接确认)、PUBLISH(发布消息)、PUBACK(发布确认)等。标志位:位于固定报头的第一个字节的低4位(bit 3-0),用于某些特定类型的报文,如PUBLISH报文中的DUP(重复分发标志)、QoS(服务质量等级)、RETAIN(保留标志)等。这些标志位的具体含义取决于报文类型。    剩余长度:紧接着报文类型之后,表示当前报文剩余部分的字节数,包括可变报头和有效载荷。剩余长度字段使用变长编码方案,最小一个字节,最大四个字节。         可变报头组成:可变报头存在于某些类型的报文中,如CONNECT、PUBLISH、SUBSCRIBE等,可变报头的内容根据报文类型的不同而不同,通常包含以下字段:报文标识符:一个两字节的字段,用于标识MQTT报文,在需要确认的报文中,如PUBLISH(QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK等,报文标识符用于匹配请求和响应。其他字段:根据报文类型的不同,可变报头还可能包含其他字段,如CONNECT报文中的协议名(Protocol Name)、协议级别(Protocol Level)、连接标志(Connect Flags)和保持连接(Keep Alive)等。         有效载荷:包含客户端和服务器之间传输的应用数据,不是所有MQTT报文都包含有效载荷,只有那些需要传输数据的报文(如PUBLISH、CONNECT等)才包含有效载荷。CONNECT报文的有效载荷:包含客户端标识符(Client Identifier)、遗嘱主题(Will Topic)、遗嘱消息(Will Message)、用户名(User Name)和密码(Password)等字段。其他报文的有效载荷:对于其他类型的报文,如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)         4.Demo实操借助MQTTX软件,我们简单实操一下。         连接配置:我们这里配置连接到MQTTX的测试服务器,当然,实际使用时,一般连接到我们自己的MQTT服务器。连接配置         
         发布消息:我们模拟发布一个解锁的topic,然后再订阅这个topic,实际应用中,我们连接到自己的MQTT服务器以后,发布topic消息,服务器会把该topic消息发送到车载终端。发布解锁topic         
   可承接汽车电子、嵌入式软件开发和测试相关的需求,包括C、Matlab、Python、C#、CANoe等。
开源项目链接:基于UDS on CAN的Bootloader的刷写上位机:https://github.com/sydyg/UDS-on-Bootloader.gitOSEKNM协议栈:https://github.com/sydyg/OSEK_NM
嵌入式/汽车电子测试、开发学习课程链接:https://mv0qxzpryx9.feishu.cn/wiki/H3JCwYIVGiEOKSk9VkQcxTJ9nRf?from=from_copylink

九二,汽车行业,域控软件架构师。
熟悉汽车电子和嵌入式开发测试✍。
跟大伙聊聊天、交朋友。
喜欢的朋友可以关注和赞赏。


页: [1]
查看完整版本: 详解车载TBox的MQTT协议