4. SECS-II 消息结构:Stream 与 Function 概念、Message ID(SxFy)、W-Bit、E-Bit、系统字节(System Bytes)的作用与格式
SECS-II 是 SECS/GEM 协议栈中定义消息内容与格式的层级。它不关心消息如何通过物理线缆传输,而是专注于“这条消息长什么样、携带什么数据、如何被识别”。理解 SECS-II 的消息结构是进行协议测试与故障排除的基础。
4.1 Stream 与 Function:消息的二维分类体系
SECS-II 使用 Stream(流) 和 Function(功能) 两个维度对消息进行分类,类似于图书馆的“楼层(Stream)”和“书架编号(Function)”。
- Stream(流):表示消息的类别或功能域。范围从
0到127。例如,Stream 1 通常用于设备状态与控制,Stream 2 用于设备数据与参数。 - Function(功能):表示在特定 Stream 下的具体操作。范围从
0到255。例如,Function 1 通常表示“请求”,Function 2 表示“数据”或“响应”。
关键规则: 偶数 Function(如 S1F2、S2F4)通常用于 回复(Reply) 或 数据(Data);奇数 Function(如 S1F1、S2F3)通常用于 请求(Request) 或 命令(Command)。这是测试中判断消息流向的重要依据。
4.1.1 Message ID:SxFy 格式
每条 SECS-II 消息都有一个唯一的标识符,格式为 S<Stream>F<Function>,简称 SxFy。
| 示例 | 含义 | 典型用途 |
|---|---|---|
S1F1 |
Stream 1, Function 1 | Are You There?(请求)—— 主机查询设备是否在线 |
S1F2 |
Stream 1, Function 2 | Are You There?(回复)—— 设备回复在线状态 |
S2F41 |
Stream 2, Function 41 | Host Command(主机发送命令给设备) |
S6F11 |
Stream 6, Function 11 | Event Report(设备主动上报事件) |
测试提示: 在抓包分析时,优先查看 SxFy 字段。如果看到
SxF0(Function 为 0),这通常表示该消息不被支持或是一个错误响应。
4.2 W-Bit(等待位)与 E-Bit(结束位)
W-Bit 和 E-Bit 是 SECS-II 消息头中的两个控制位,用于管理消息的交互流程。
4.2.1 W-Bit(Wait-Bit)
W-Bit 表示发送方是否期望收到回复。它位于消息头的第 2 个字节的第 7 位。
- W-Bit = 1:发送方要求接收方必须回复。这通常用于请求消息(如 S1F1)。
- W-Bit = 0:发送方不期望回复。这通常用于单向通知或广播消息。
故障排除要点: 如果主机发送了一条 W-Bit=1 的消息,但设备没有回复(或回复超时),主机通常会触发超时重传(T3 超时)。这是最常见的通信故障之一。检查 W-Bit 设置是否正确,以及设备是否支持该消息的回复。
4.2.2 E-Bit(End-Bit)
E-Bit 用于多块消息(Multi-Block Message)中,表示当前数据块是否为最后一块。它位于消息头的第 2 个字节的第 6 位。
- E-Bit = 1:当前块是消息的最后一块。
- E-Bit = 0:当前块不是最后一块,后续还有更多数据块。
对于单块消息(Single-Block Message),E-Bit 始终为 1。
| 控制位 | 位置(消息头第2字节) | 值=1 含义 | 值=0 含义 | 典型场景 |
|---|---|---|---|---|
| W-Bit | Bit 7 | 需要回复 | 不需要回复 | 请求/响应交互 |
| E-Bit | Bit 6 | 最后一块 | 非最后一块 | 大数据量传输 |
4.3 系统字节(System Bytes)
系统字节 是 SECS-II 消息头中的 4 字节字段,用于唯一标识一对请求-回复消息。它是消息关联与超时管理的核心。
4.3.1 作用
- 消息配对:请求消息(W-Bit=1)和对应的回复消息必须使用相同的系统字节值。这样接收方可以知道“这条回复是对应哪条请求的”。
- 超时管理:发送方在发送 W-Bit=1 的消息后,会启动 T3 定时器(回复超时)。如果超时前未收到相同系统字节的回复,则判定为通信故障。
- 去重与排序:在多消息并发场景下,系统字节帮助区分不同的消息流。
4.3.2 格式
系统字节是一个 4 字节(32 位)的无符号整数。通常由发送方生成,并保证在会话中唯一。
消息头结构(简化):
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| 字节 0 | 字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 | 字节 8 | 字节 9 |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| 长度 | 控制位 | Stream | Function| 系统字节 (Byte 4-7) |
| (2字节)| (W/E) | (1字节)| (1字节) | (4字节) |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
测试技巧: 在分析抓包日志时,使用系统字节字段来匹配请求与回复。如果发现一条回复的系统字节在最近的请求列表中找不到,说明可能发生了消息错乱或超时重传。
4.3.3 系统字节的生成与使用示例
| 步骤 | 发送方 | 消息 | 系统字节(Hex) | 说明 |
|---|---|---|---|---|
| 1 | 主机 | S1F1 (W=1) | 0x00000001 |
主机生成唯一 ID,启动 T3 定时器 |
| 2 | 设备 | S1F2 | 0x00000001 |
设备回复时复制相同的系统字节 |
| 3 | 主机 | S2F41 (W=1) | 0x00000002 |
下一条请求使用新的系统字节 |
| 4 | 设备 | S2F42 | 0x00000002 |
回复与请求配对 |
4.4 综合故障排除案例
场景: 主机发送 S1F1(W-Bit=1,系统字节=0x00000005)后,等待 45 秒仍未收到回复,触发 T3 超时。主机重传相同的 S1F1,但系统字节变为 0x00000006。随后设备回复了 S1F2(系统字节=0x00000005)。
问题分析:
1. 第一次请求(SysBytes=5)可能丢失或设备处理延迟。
2. 主机重传时使用了新的系统字节(6),这是标准行为。
3. 设备最终回复了旧的系统字节(5),但主机已经不再等待该 ID,导致回复被丢弃。
解决方案: 检查网络延迟或设备处理能力。如果设备支持,可以配置主机重传策略为“使用相同系统字节重传”,但这需要双方协议一致。
问题分析:
1. 第一次请求(SysBytes=5)可能丢失或设备处理延迟。
2. 主机重传时使用了新的系统字节(6),这是标准行为。
3. 设备最终回复了旧的系统字节(5),但主机已经不再等待该 ID,导致回复被丢弃。
解决方案: 检查网络延迟或设备处理能力。如果设备支持,可以配置主机重传策略为“使用相同系统字节重传”,但这需要双方协议一致。
4.5 本章小结
- Stream/Function 构成 SECS-II 消息的二维分类,SxFy 是消息的唯一标识。
- W-Bit 控制是否需要回复,E-Bit 控制多块消息的结束标志。
- 系统字节 是 4 字节的唯一 ID,用于配对请求与回复,是超时管理和消息追踪的核心。
- 在测试与故障排除中,优先检查 SxFy、W-Bit 和 系统字节 这三个字段。