3. HSMS 通信层:TCP/IP 网络基础、主动/被动连接模式、会话建立与心跳机制、T3/T5/T6/T7 超时参数详解

HSMS(High-Speed SECS Message Services)是 SEMI 标准 E37 定义的通信协议,它使用 TCP/IP 作为传输层,替代了传统的 RS-232 串口通信。作为 SECS/GEM 设备驱动的开发者,理解 HSMS 通信层是构建稳定、可靠设备连接的基础。本章将深入剖析 HSMS 的核心机制,从 TCP/IP 基础到复杂的超时参数配置,帮助你掌握驱动开发中的通信层实现要点。

3.1 TCP/IP 网络基础与 HSMS 协议栈

HSMS 协议栈位于 OSI 模型的第 5 层(会话层)和第 6 层(表示层),它依赖于底层的 TCP/IP 协议栈提供可靠的、面向连接的字节流传输。与 SECS-I(RS-232)不同,HSMS 无需物理层握手,而是通过 TCP 连接管理和心跳机制来保证通信的可靠性。

核心概念: HSMS 将 SECS 消息封装为 HSMS 数据包,通过 TCP 连接发送。每个 HSMS 数据包包含一个 4 字节的消息长度头(Message Length)和紧随其后的 SECS 消息(Message Text)。这种“长度前缀”的帧格式使得接收方能够准确地从 TCP 字节流中提取完整的消息。
HSMS 协议栈架构与 TCP/IP 关系 应用层 (GEM) 表示层 (SECS-II) 会话层 (HSMS) 传输层 (TCP) 网络层 (IP) 数据链路层 物理层 HSMS 数据包结构 消息长度 (4B) 消息文本 (SECS 消息) HSMS 关键特性 • 面向连接:基于 TCP 的可靠字节流 • 帧格式:4 字节长度前缀 + 消息体 • 会话管理:Select/Deselect/Reject 控制 • 心跳机制:Linktest 保持连接活性

3.2 主动/被动连接模式

HSMS 定义了两种连接模式:主动模式(Active Mode)和被动模式(Passive Mode)。这两种模式决定了设备在 TCP 连接建立过程中的角色。在典型的半导体设备通信场景中,设备端(Equipment)通常作为被动方,而主机端(Host)作为主动方发起连接。

特性 主动模式(Active) 被动模式(Passive)
角色 发起 TCP 连接请求(Client) 监听并接受连接请求(Server)
典型应用 主机(Host) 设备端(Equipment)
连接流程 主动调用 connect() 到被动方 IP:Port 调用 listen() 和 accept() 等待连接
重连行为 连接断开后,主动方负责重连 被动方等待新的连接请求
配置参数 需要配置目标 IP 和端口 需要配置本地监听端口
开发建议: 在设备驱动中,通常将设备端配置为被动模式,主机配置为主动模式。但某些场景下(如设备需要主动上报事件),设备也可以配置为主动模式。驱动应支持两种模式的动态切换,以适应不同的工厂网络拓扑。
主动模式 vs 被动模式连接流程 主动方 (Host) 1. 发起 connect() 2. 发送 Select.req 3. 接收 Select.rsp 4. 通信建立 被动方 (Equipment) 1. listen() 等待 2. accept() 接受 3. 处理 Select.req 4. 通信建立 TCP 连接 Select.req Select.rsp

3.3 会话建立与心跳机制

HSMS 会话的建立遵循严格的握手协议。在 TCP 连接建立后,通信双方需要通过 Select 和 Select.rsp 消息来建立 HSMS 会话。一旦会话建立,双方就可以交换 SECS 消息。为了维持会话的活性,HSMS 定义了 Linktest 心跳机制。

3.3.1 会话建立流程

  1. TCP 连接建立: 主动方通过三次握手与被动方建立 TCP 连接。
  2. Select 请求: 主动方发送 Select.req 消息,请求建立 HSMS 会话。
  3. Select 响应: 被动方处理请求,返回 Select.rsp 消息,包含状态码(0 表示成功)。
  4. 会话激活: 双方进入通信状态,可以发送 SECS 消息。
注意: 如果 Select.rsp 返回非零状态码(如 1:连接已存在;2:连接失败),主动方应关闭 TCP 连接并等待重试。驱动必须正确处理这些错误码,避免陷入死循环。

3.3.2 心跳机制(Linktest)

心跳机制用于检测 TCP 连接的健康状态。在 HSMS 中,如果在一段时间内没有数据交换,通信的一方会发送 Linktest.req 消息,对方必须回复 Linktest.rsp。如果未收到响应,则认为连接已断开,并触发重连流程。

消息类型 方向 功能 触发条件
Linktest.req 主动方 → 被动方 请求心跳确认 空闲时间超过 T3 超时
Linktest.rsp 被动方 → 主动方 确认心跳 收到 Linktest.req 后立即回复
HSMS 会话建立与心跳机制时序 主动方 被动方 TCP 三次握手 Select.req Select.rsp 会话建立 Linktest.req Linktest.rsp T3 超时:空闲时间超过 T3 时触发 Linktest

3.4 T3/T5/T6/T7 超时参数详解

HSMS 协议定义了多个超时参数,用于控制通信的不同阶段。这些参数的正确配置直接关系到通信的稳定性和效率。在设备驱动开发中,必须为这些超时参数提供可配置的接口,并设置合理的默认值。

参数 名称 默认值 范围 作用
T3 Reply Timeout 45 秒 1-120 秒 等待 SECS 消息回复的超时时间
T5 Connect Timeout 10 秒 1-60 秒 等待 TCP 连接建立的超时时间
T6 Separate Timeout 5 秒 1-30 秒 等待 Separate 确认的超时时间
T7 Linktest Timeout 30 秒 1-120 秒 Linktest 心跳间隔时间

3.4.1 T3:Reply Timeout(回复超时)

T3 是 SECS/GEM 通信中最关键的超时参数。它定义了发送方在发送一条需要回复的消息后,等待接收方回复的最大时间。如果 T3 超时,发送方应认为消息丢失或接收方异常,并采取相应的恢复措施(如重发或断开连接)。

驱动实现要点: T3 超时管理通常使用定时器或事件驱动机制。在发送消息时,启动一个 T3 定时器;收到回复后,取消定时器。如果定时器触发,则调用超时处理函数。驱动应支持为不同的消息类型设置不同的 T3 值,但通常使用统一的全局 T3 值。

3.4.2 T5:Connect Timeout(连接超时)

T5 定义了主动方在发起 TCP 连接时,等待连接建立的最大时间。如果 T5 超时,主动方应放弃本次连接尝试,并进入重连逻辑。T5 的值通常较小(默认 10 秒),以便快速检测网络故障。

3.4.3 T6:Separate Timeout(分离超时)

T6 用于 HSMS 会话的分离过程。当一方发送 Separate.req 消息请求断开会话时,它会在 T6 时间内等待对方的 Separate.rsp 确认。如果 T6 超时,发送方将直接关闭 TCP 连接。

3.4.4 T7:Linktest Timeout(心跳超时)

T7 定义了 Linktest 心跳消息的发送间隔。在通信空闲状态下,如果距离上次收到任何消息的时间超过了 T7,通信的一方应发送 Linktest.req 来探测连接活性。T7 的默认值为 30 秒,通常设置为小于 T3 的值,以便在 T3 超时前发现连接问题。

HSMS 超时参数关系与触发场景 T5: 连接超时 TCP connect() 等待 T7: 心跳间隔 Linktest 发送周期 T3: 回复超时 等待消息回复 T6: 分离超时 Separate 确认等待 连接建立后 消息交互 会话分离 超时参数配置原则 T7 < T3:确保心跳能在回复超时前发现连接问题;T5 应尽量小以快速检测网络故障

3.5 驱动开发中的超时管理实践

在嵌入式设备驱动中,超时管理通常依赖于操作系统的定时器服务。以下是一个简化的超时管理代码示例,展示了如何在驱动中实现 T3 超时控制。

/* HSMS 超时管理器结构体 */
struct hsms_timeout_mgr {
    uint32_t t3_value;      /* T3 超时值,单位秒 */
    uint32_t t5_value;      /* T5 超时值,单位秒 */
    uint32_t t6_value;      /* T6 超时值,单位秒 */
    uint32_t t7_value;      /* T7 超时值,单位秒 */

    os_timer_t t3_timer;    /* T3 定时器句柄 */
    os_timer_t t5_timer;    /* T5 定时器句柄 */
    os_timer_t t7_timer;    /* T7 定时器句柄 */

    uint32_t last_rx_time;  /* 上次收到消息的时间戳 */
    uint32_t last_tx_time;  /* 上次发送消息的时间戳 */
};

/* T3 超时回调函数 */
static void t3_timeout_handler(void *arg) {
    struct hsms_session *session = (struct hsms_session *)arg;
    /* 处理 T3 超时:重发消息或断开连接 */
    hsms_handle_t3_timeout(session);
}

/* 发送消息时启动 T3 定时器 */
int hsms_send_message(struct hsms_session *session,
                      struct secs_message *msg) {
    /* 发送消息逻辑 */
    tcp_send(session->sockfd, msg->data, msg->length);

    /* 如果消息需要回复,启动 T3 定时器 */
    if (msg->requires_reply) {
        os_timer_start(&session->timeout_mgr.t3_timer,
                       session->timeout_mgr.t3_value * 1000,
                       t3_timeout_handler,
                       session);
    }
    return 0;
}

/* 收到回复时取消 T3 定时器 */
void hsms_on_reply_received(struct hsms_session *session) {
    os_timer_stop(&session->timeout_mgr.t3_timer);
}
最佳实践: 在驱动初始化时,从配置文件中读取超时参数,并允许在运行时通过 SECS 命令动态修改。同时,建议在日志中记录所有超时事件,以便于调试和网络性能分析。

3.6 本章小结

HSMS 通信层是 SECS/GEM 设备驱动的基石。本章详细介绍了 TCP/IP 网络基础、主动/被动连接模式、会话建立与心跳机制,以及 T3/T5/T6/T7 四个关键超时参数。掌握这些知识,你将能够构建一个稳定、高效的 HSMS 通信层,为后续的 SECS-II 消息处理和 GEM 状态机实现打下坚实的基础。