4. SECS-II 消息结构:核心概念与协议基石
SECS-II 定义了在主机与设备之间传输的消息(Message)的结构与语义。理解消息结构是进行协议一致性测试的前提。本章将深入剖析 SECS-II 消息的构成要素:Stream、Function、Message ID、W-Bit、系统字节以及消息分类。
4.1 Stream 与 Function:消息的“坐标”
SECS-II 消息通过 Stream(流)和 Function(功能)两个维度进行唯一标识,类似于二维坐标系中的点。
- Stream (S):消息的类别,取值范围 0~127。例如,Stream 1 通常用于设备状态与控制,Stream 2 用于设备数据与参数。
- Function (F):消息的具体操作,取值范围 0~255。例如,Function 1 通常表示“请求”(Request),Function 2 表示“数据”(Data)。
一个完整的消息标识符写作 S<n>F<m>,例如 S1F1(Are You There Request)、S1F2(Are You There Data)。
测试要点: 一致性测试必须验证设备是否正确响应所有强制实现的 Stream/Function 组合,并拒绝未定义的组合。
4.2 Message ID:消息的唯一标识
Message ID 由 Stream 编号和 Function 编号组合而成,是消息在协议层面的唯一标识。在测试中,Message ID 用于匹配请求与响应。
| 消息示例 | Stream | Function | Message ID | 典型用途 |
|---|---|---|---|---|
| S1F1 | 1 | 1 | 0x0101 | Are You There (Request) |
| S1F2 | 1 | 2 | 0x0102 | Are You There (Data) |
| S2F41 | 2 | 41 | 0x0229 | Host Command (Request) |
| S6F11 | 6 | 11 | 0x060B | Event Report (Data) |
测试技巧: 在自动化测试脚本中,Message ID 通常作为字典的 Key 来索引对应的解析函数和预期响应模板。
4.3 W-Bit:等待响应的标志
W-Bit(Wait-Bit)是消息头中的一个标志位,用于指示发送方是否期望接收方返回一条响应消息。
- W-Bit = 1:发送方要求接收方必须回复一条 Secondary Message(次要消息)。
- W-Bit = 0:发送方不要求回复,消息为单向通信(Fire-and-Forget)。
一致性测试关键点: 如果主机发送 W-Bit=1 的请求,设备必须在规定超时时间内回复对应的 Secondary 消息。不回复或回复错误 Message ID 均视为协议违规。
4.4 系统字节:事务关联的纽带
系统字节(System Bytes)是消息头中的 4 字节字段,用于将 Primary 消息与对应的 Secondary 消息关联起来,形成一次完整的事务(Transaction)。
- Primary 消息:发送方生成一个唯一的系统字节值。
- Secondary 消息:接收方在回复时必须将系统字节设置为与 Primary 消息相同的值。
测试验证: 自动化测试用例必须检查 Secondary 消息的系统字节是否与对应的 Primary 消息完全一致。不一致表明设备未正确实现事务关联。
4.5 消息分类:Primary 与 Secondary
SECS-II 消息根据其在事务中的角色分为两类:
| 特性 | Primary Message | Secondary Message |
|---|---|---|
| 发起方 | 主机或设备均可发起 | 只能由接收 Primary 的一方回复 |
| W-Bit | 通常为 1(要求回复) | 通常为 0(不要求回复) |
| 系统字节 | 由发送方生成唯一值 | 复制 Primary 的系统字节 |
| Message ID | 例如 S1F1, S2F41 | 例如 S1F2, S2F42 |
| 事务角色 | 事务发起者 | 事务响应者 |
4.6 消息结构在测试中的应用
在自动化测试中,理解消息结构有助于构建精确的测试用例:
- 构造 Primary 请求:设置正确的 Stream/Function、W-Bit=1、生成唯一系统字节。
- 验证 Secondary 响应:检查 Message ID 是否为预期的 Function+1、W-Bit=0、系统字节与请求一致。
- 异常测试:发送 W-Bit=0 的消息,验证设备不会回复;发送错误的系统字节,验证设备是否拒绝。
自动化测试代码示例: 验证 Secondary 消息的系统字节匹配
def test_secondary_system_bytes_match(host_session, device_session):
# 1. 主机发送 Primary 消息
primary_msg = build_secs_message(
stream=1, function=1, w_bit=True,
system_bytes=0x12345678, # 生成唯一系统字节
body=[] # 空消息体
)
host_session.send(primary_msg)
# 2. 设备应回复 Secondary 消息
secondary_msg = device_session.receive(timeout=5.0)
# 3. 验证 Message ID 为 S1F2
assert secondary_msg.stream == 1
assert secondary_msg.function == 2
# 4. 验证 W-Bit 为 0
assert secondary_msg.w_bit == False
# 5. 验证系统字节与 Primary 一致
assert secondary_msg.system_bytes == 0x12345678, \
f"系统字节不匹配: 期望 0x12345678, 实际 {secondary_msg.system_bytes}"
print("PASS: Secondary 消息系统字节匹配正确")
最佳实践: 在测试框架中维护一个“事务追踪表”,记录每个已发送 Primary 消息的系统字节和预期 Secondary 的 Message ID,便于自动化比对。