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 组合,并拒绝未定义的组合。
Stream 与 Function 坐标映射 Function (F) 0~255 Stream (S) 0~127 S1F1 S2F41 S6F11 每个 (Stream, Function) 对唯一标识一条 SECS-II 消息

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 均视为协议违规。
W-Bit 控制的消息交互流程 主机 (Host) 设备 (Equipment) S1F1 (W=1, 系统字节=0x1234) S1F2 (系统字节=0x1234) Primary 消息设置 W=1,设备必须回复 Secondary 消息 Secondary 消息的 Message ID 与 Primary 不同,但系统字节必须相同

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
事务角色 事务发起者 事务响应者
Primary 与 Secondary 消息结构对比 Primary 消息 Stream=1, Function=1 W-Bit = 1 系统字节 = 0x00001234 Secondary 消息 Stream=1, Function=2 W-Bit = 0 系统字节 = 0x00001234 (相同) 系统字节匹配 Primary 与 Secondary 通过系统字节关联,形成一次完整的事务

4.6 消息结构在测试中的应用

在自动化测试中,理解消息结构有助于构建精确的测试用例:

  1. 构造 Primary 请求:设置正确的 Stream/Function、W-Bit=1、生成唯一系统字节。
  2. 验证 Secondary 响应:检查 Message ID 是否为预期的 Function+1、W-Bit=0、系统字节与请求一致。
  3. 异常测试:发送 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,便于自动化比对。