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 连接管理和心跳机制来保证通信的可靠性。
3.2 主动/被动连接模式
HSMS 定义了两种连接模式:主动模式(Active Mode)和被动模式(Passive Mode)。这两种模式决定了设备在 TCP 连接建立过程中的角色。在典型的半导体设备通信场景中,设备端(Equipment)通常作为被动方,而主机端(Host)作为主动方发起连接。
| 特性 | 主动模式(Active) | 被动模式(Passive) |
|---|---|---|
| 角色 | 发起 TCP 连接请求(Client) | 监听并接受连接请求(Server) |
| 典型应用 | 主机(Host) | 设备端(Equipment) |
| 连接流程 | 主动调用 connect() 到被动方 IP:Port | 调用 listen() 和 accept() 等待连接 |
| 重连行为 | 连接断开后,主动方负责重连 | 被动方等待新的连接请求 |
| 配置参数 | 需要配置目标 IP 和端口 | 需要配置本地监听端口 |
3.3 会话建立与心跳机制
HSMS 会话的建立遵循严格的握手协议。在 TCP 连接建立后,通信双方需要通过 Select 和 Select.rsp 消息来建立 HSMS 会话。一旦会话建立,双方就可以交换 SECS 消息。为了维持会话的活性,HSMS 定义了 Linktest 心跳机制。
3.3.1 会话建立流程
- TCP 连接建立: 主动方通过三次握手与被动方建立 TCP 连接。
- Select 请求: 主动方发送
Select.req消息,请求建立 HSMS 会话。 - Select 响应: 被动方处理请求,返回
Select.rsp消息,包含状态码(0 表示成功)。 - 会话激活: 双方进入通信状态,可以发送 SECS 消息。
3.3.2 心跳机制(Linktest)
心跳机制用于检测 TCP 连接的健康状态。在 HSMS 中,如果在一段时间内没有数据交换,通信的一方会发送 Linktest.req 消息,对方必须回复 Linktest.rsp。如果未收到响应,则认为连接已断开,并触发重连流程。
| 消息类型 | 方向 | 功能 | 触发条件 |
|---|---|---|---|
| Linktest.req | 主动方 → 被动方 | 请求心跳确认 | 空闲时间超过 T3 超时 |
| Linktest.rsp | 被动方 → 主动方 | 确认心跳 | 收到 Linktest.req 后立即回复 |
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 超时,发送方应认为消息丢失或接收方异常,并采取相应的恢复措施(如重发或断开连接)。
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 超时前发现连接问题。
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);
}
3.6 本章小结
HSMS 通信层是 SECS/GEM 设备驱动的基石。本章详细介绍了 TCP/IP 网络基础、主动/被动连接模式、会话建立与心跳机制,以及 T3/T5/T6/T7 四个关键超时参数。掌握这些知识,你将能够构建一个稳定、高效的 HSMS 通信层,为后续的 SECS-II 消息处理和 GEM 状态机实现打下坚实的基础。