3. HSMS连接建立与心跳机制
HSMS(High-Speed SECS Message Services)是SEMI E37标准定义的通信协议,运行在TCP/IP之上,用于设备与Host之间高速传输SECS-II消息。与老式SECS-I串行通信不同,HSMS把"连接"和"会话"分成两层:TCP负责字节流,HSMS负责在字节流上建立受控的逻辑链路。理解Select/Deselect、Linktest和五个定时器,是EAP联机调试中最核心的基本功。
一、连接建立:Select 与 Deselect
TCP三次握手成功后,链路只是"物理可达",还不能传SECS-II消息。HSMS规定必须由主动方(通常是Host/EAP)发送 Select.req,被动方(设备)回 Select.rsp,状态从 NOT SELECTED 进入 SELECTED,此时才允许传输数据消息。Select.req 的 SessionID 必须与设备配置一致,常见为 0xFFFF(表示不区分会话)或具体设备ID。
当需要维护、切换Host或长时间空闲时,主动方发送 Deselect.req,设备回 Deselect.rsp,链路回到 NOT SELECTED,但TCP连接保持。这样可以在不断开物理连接的前提下暂停业务,避免频繁重连带来的开销。
二、Linktest:链路心跳
SELECTED 状态下,如果长时间没有数据消息,双方无法判断对端是否还活着。HSMS 用 Linktest.req / Linktest.rsp 作为心跳:主动方周期性发送 Linktest.req,对端必须回 Linktest.rsp。收到响应即证明链路健康;若在 T6 时间内未收到响应,则判定链路异常并断开重连。
心跳周期通常由 T7 控制(常见配置 10s~60s),T6 为等待响应超时(常见 5s~10s)。心跳太密会增加无谓流量,太疏则故障发现慢,工程上常取 T7=30s、T6=10s。
三、五个定时器:T3 / T5 / T6 / T7 / T8
| 定时器 | 作用 | 典型值 |
|---|---|---|
| T3 | 等待回复超时(Reply Timeout),发出 Primary 消息后等待 Secondary 的最长时间 | 45s |
| T5 | 连接分离超时(Connect Separation Timeout),两次连接尝试之间的间隔 | 10s |
| T6 | 控制消息超时(Control Transaction Timeout),等待 Select/Linktest 等控制响应的时间 | 5s |
| T7 | NOT SELECTED 超时(Not Selected Timeout),未 Select 状态的最长保持时间 | 10s |
| T8 | 网络字符间超时(Network Intercharacter Timeout),接收消息字节间最大间隔 | 5s |
其中 T3 决定业务层重发与报警节奏,T5 决定断线后重连的"退避"节奏,T6 决定控制消息的容错窗口,T7 决定未 Select 时是否主动断开,T8 用于检测半开连接。五个定时器共同构成 HSMS 的"时间契约",任何一方配置不一致都可能导致联机不稳定。
四、断线重连策略
当 T6 超时、T8 超时或 TCP 断开时,主动方进入重连流程。工程上推荐"指数退避 + 上限"策略:首次等待 T5(如 10s),之后 10s、20s、40s、80s……直到上限(如 120s),避免网络抖动时疯狂重连。重连成功后必须重新执行 Select,不能假设链路自动恢复。
重连伪代码(EAP 侧):
retry = 0
while not connected:
sleep(min(T5 * 2^retry, MAX_BACKOFF))
try TCP connect
if ok:
send Select.req
wait Select.rsp (T6)
if ok: retry = 0; break
retry += 1
五、抓包分析要点
用 Wireshark 抓包时,过滤 tcp.port == 5000(HSMS 常用端口)。观察顺序应为:TCP SYN/SYN-ACK/ACK → Select.req/rsp → Linktest 周期 → 数据消息。若看到 Select.req 后没有 Select.rsp,检查设备 SessionID 与 T6;若 Linktest.req 连续发出无响应,说明对端已死或 T6 配置过短;若频繁 TCP RST,多为 T8 超时或半开连接。
掌握 Select/Deselect 的状态语义、Linktest 的心跳作用以及 T3/T5/T6/T7/T8 的职责边界,再配合抓包验证,就能把 HSMS 连接从"能通"做到"稳定可控"。