目录
TP.CM_BAM (Broadcast Announce Message)
TP.CM_BAM (Broadcast Announce Message)
Tom今天聊的是J1939-24协议的TP.CM_BAM和TP.DT报文传输多包数据,先看协议标准
SAE J1939-21 标准
SAE J1939-21 是一部分定义了商用车辆和工业设备网络通信协议的 SAE J1939 标准系列。它主要关注数据链路层的协议,包括如何处理多包传输。该协议的一个重要部分是处理大数据传输的多包传输协议(Transport Protocol, TP)。
在通信过程中根据数据量和传输需求选择合适的消息ID和传输协议,以确保数据正确有效地传输。
TP.CM_BAM 和 TP.DT 是在 SAE J1939 协议中的多包传输 (Transport Protocol, TP) 的特定消息类型,用于管理和传输大量数据。
TP.CM_BAM (Broadcast Announce Message)
- TP.CM_BAM 全称为 Transport Protocol, Connection Management - Broadcast Announce Message。
- 它用于广播方式宣布即将进行的多包传输。
- 作用:
- 当一个节点(如车辆的电子控制单元)需要发送大于单包能容纳的数据量时,它会先发送一个 TP.CM_BAM 消息,告知网络上的其他节点即将开始一个多包传输。
- 包含的信息包括总的数据长度、数据包数量以及数据的标识符等。
- ID: 典型的消息ID是 0x18ECFFxx,其中
xx
通常是发送节点的地址。
TP.DT (Data Transfer)
- TP.DT 全称为 Transport Protocol, Data Transfer。
- 它用于实际的数据包传输。
- 作用:
- 在 TP.CM_BAM 消息之后,数据将被分成多个 TP.DT 消息发送,每个 TP.DT 消息包含数据的一个片段。
- 这些消息按顺序发送,接收端将这些消息重新组合成完整的数据。
- ID: 典型的消息ID是 0x18EBFFxx,其中
xx
也是发送节点的地址。
工作流程
- 发送 TP.CM_BAM:
- 发送端首先发送一个 TP.CM_BAM 消息,通知网络上的所有节点即将发送的多包传输,包括总数据长度和包数量等信息。
- 发送 TP.DT:
- 紧接着,发送端开始发送 TP.DT 消息,每个消息携带一个数据片段,直到所有数据都被发送完毕。
示例
假设一个控制单元需要发送一个包含 4000 字节的数据包:
-
TP.CM_BAM 消息:
- 包含信息如:总长度为 4000 字节,需要发送 20 个 TP.DT 消息(假设每个 TP.DT 消息能携带 255 字节的数据)。
-
TP.DT 消息:
- 发送 20 个 TP.DT 消息,每个消息按顺序携带数据的片段。
关键点
- TP.CM_BAM 是为了通知接收端即将进行的多包传输,并提供相关的元数据。
- TP.DT 是实际的数据传输消息,按照顺序发送并被接收端重新组装。
这些消息类型在 J1939 协议中确保了大数据量的可靠传输和管理。
TP.CM_BAM (Broadcast Announce Message)
TP.CM_BAM 是多包传输中用于宣布即将进行的大数据传输的消息,具有以下特征:
-
功能:
- 广播发送多包传输的元数据。
- 通知网络中的所有节点即将传输的数据长度和包数量。
-
典型格式:
- 数据长度(总字节数)
- 总包数
- 参数组号(PGN,Parameter Group Number)
- 消息ID为
0x18ECFFxx
,其中xx
是发送节点的地址。
-
示例:
// TP.CM_BAM message structure byte sendbuffer[8]; sendbuffer[0] = CONTROL_BYTE_BAM; // Control byte for BAM sendbuffer[1] = TOTAL_MESSAGE_SIZE & 0xFF; // Least significant byte of total size sendbuffer[2] = (TOTAL_MESSAGE_SIZE >> 8) & 0xFF; // Most significant byte of total size sendbuffer[3] = NUMBER_OF_PACKETS; // Number of packets sendbuffer[4] = PGN & 0xFF; // Least significant byte of PGN sendbuffer[5] = (PGN >> 8) & 0xFF; // Middle byte of PGN sendbuffer[6] = (PGN >> 16) & 0xFF; // Most significant byte of PGN sendbuffer[7] = 0xFF; // Reserved byte
TP.DT (Data Transfer)
TP.DT 是用于实际数据传输的消息,具有以下特征:
-
功能:
- 传输数据片段。
- 通过多次发送 TP.DT 消息完成整个数据的传输。
-
典型格式:
- 数据片段的索引
- 数据片段内容
- 消息ID为
0x18EBFFxx
,其中xx
是发送节点的地址。
-
示例:
// TP.DT message structure
byte sendbuffer[8];
sendbuffer[0] = PACKET_INDEX; // Packet index
for (int i = 1; i < 8; ++i) {
sendbuffer[i] = DATA[PACKET_INDEX * 7 + (i - 1)]; // Copy data fragment
}
具体工作流程
-
发送 TP.CM_BAM 消息:
- 发送端准备好要传输的大数据后,先发送 TP.CM_BAM 消息,通知所有节点将进行多包传输。
- 该消息包括总数据长度、包数量和数据标识符(PGN)。
-
发送 TP.DT 消息:
- 在 TP.CM_BAM 消息之后,发送端开始按顺序发送 TP.DT 消息,每个消息携带数据的一个片段。
- 每个 TP.DT 消息有一个包索引,用于标识该消息在整个传输中的位置。
- 接收端接收到所有 TP.DT 消息后,根据包索引重新组装数据。
-
处理和错误检测:
- 接收端需要检查每个包的完整性,并可能需要处理丢包或错误情况。
- 发送端和接收端可能需要进行一些错误检测和重传机制,以确保数据完整性。
控制字节
在 TP.CM_BAM 和 TP.DT 消息中,控制字节(Control Byte)定义了消息的类型和作用:
- 0x20: 表示 TP.CM_BAM 消息。
- 0x00: 表示 TP.DT 消息的开始(包索引从1开始)。
重要注意事项
- 节点地址:J1939 网络中的每个节点都有一个唯一的地址,用于区分不同的设备。
- 参数组号(PGN):用于标识数据类型和内容,是 J1939 消息的重要部分。
- 超时处理:在多包传输过程中,接收端和发送端都需要处理超时情况,以防止通信中断。
Tom的博客内有相关J1939全套协议。想了解更多的J1939相关知识可自行下载