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),这通常表示该消息不被支持或是一个错误响应。
SECS-II 消息二维分类体系:Stream × Function Stream (1-127) Function (1-255) S1F1 S1F2 S2F41 S6F11 说明: 偶数 Function(S1F2)通常为回复;奇数 Function(S1F1)通常为请求。S6F11 是设备主动上报事件,属于“未请求”消息。

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 最后一块 非最后一块 大数据量传输
W-Bit 与 E-Bit 在消息交互中的作用 主机 (Host) 设备 (Equipment) S1F1 (W-Bit=1) 请求 S1F2 (E-Bit=1) 回复 交互流程: 1. 主机发送 S1F1,W-Bit=1,表示“我需要你回复”。 2. 设备收到后必须回复 S1F2,E-Bit=1 表示这是完整的单块回复。

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 回复与请求配对
系统字节(System Bytes)在消息配对中的作用 主机 (Host) 设备 (Equipment) S1F1 (W=1) SysBytes=0x00000001 S1F2 (E=1) SysBytes=0x00000001 S2F41 (W=1) SysBytes=0x00000002 S2F42 (E=1) SysBytes=0x00000002 关键点: 系统字节在请求-回复对中必须相同。主机通过递增系统字节来区分不同的消息流。如果设备回复了错误的系统字节,主机将无法匹配并可能触发超时。

4.4 综合故障排除案例

场景: 主机发送 S1F1(W-Bit=1,系统字节=0x00000005)后,等待 45 秒仍未收到回复,触发 T3 超时。主机重传相同的 S1F1,但系统字节变为 0x00000006。随后设备回复了 S1F2(系统字节=0x00000005)。

问题分析:
1. 第一次请求(SysBytes=5)可能丢失或设备处理延迟。
2. 主机重传时使用了新的系统字节(6),这是标准行为。
3. 设备最终回复了旧的系统字节(5),但主机已经不再等待该 ID,导致回复被丢弃。

解决方案: 检查网络延迟或设备处理能力。如果设备支持,可以配置主机重传策略为“使用相同系统字节重传”,但这需要双方协议一致。

4.5 本章小结

  • Stream/Function 构成 SECS-II 消息的二维分类,SxFy 是消息的唯一标识。
  • W-Bit 控制是否需要回复,E-Bit 控制多块消息的结束标志。
  • 系统字节 是 4 字节的唯一 ID,用于配对请求与回复,是超时管理和消息追踪的核心。
  • 在测试与故障排除中,优先检查 SxFy、W-Bit 和 系统字节 这三个字段。