4. HSMS与TCP/IP通信实战

HSMS(High-Speed SECS Message Services)是SEMI E37标准定义的通信协议,它把传统的SECS-II消息承载在TCP/IP之上,是300mm晶圆厂中设备与主机(Host)之间最主流的通信方式。理解HSMS,关键不是背协议字段,而是搞清楚一条TCP连接从建立到可用、再到异常恢复的完整生命周期。本节围绕HSMS-SS与HSMS-GS两种模式,梳理连接建立、Select/Deselect、心跳(Linktest)、超时与断线重连的实战要点。

一、HSMS-SS与HSMS-GS的角色差异

HSMS-SS(Single Session)是最常见的部署形态:一台设备与一台主机之间建立一条TCP连接,连接双方固定为Active(主动发起连接)和Passive(被动监听)角色。通常设备侧作为Active,主动连接主机的某个端口;主机侧作为Passive,监听该端口。HSMS-GS(General Session)则允许一条TCP连接上复用多个Session,通过Session ID区分不同会话,适合一台主机管理多台设备或一个设备对接多个逻辑主机的场景。

无论SS还是GS,HSMS连接都分为两个层次:TCP连接层和HSMS会话层。TCP连接建立成功,只代表物理链路通了;只有完成Select交互,HSMS会话才真正进入“可收发SECS-II消息”的状态。这是初学者最容易混淆的地方——TCP连上了不等于HSMS可用了。

HSMS连接生命周期与状态迁移 设备侧 (Active) 主动 connect() 主机侧 (Passive) listen() 监听端口 TCP三次握手 → 连接建立 状态:CONNECTED(TCP已通,HSMS未就绪) Select.req → Select.rsp (Select Status=0) 会话层握手,协商Session ID 状态:SELECTED(可收发SECS-II消息) Linktest心跳维持 + 数据消息传输 Linktest.req/rsp T7超时内必须响应 Deselect.req/rsp 主动断开会话 TCP断开 / T7超时 → 重连退避 指数退避:1s→2s→4s→8s→上限30s

二、连接建立与Select/Deselect

HSMS-SS的连接建立过程可以概括为“TCP先通,Select后通”。设备侧Active端调用connect()连接主机IP和端口(常见如5000),TCP握手成功后,双方进入CONNECTED状态。此时设备还不能发送SECS-II消息,必须先发送Select.req。主机收到后回复Select.rsp,其中Select Status为0表示接受,非0表示拒绝。只有收到Status=0的Select.rsp,设备才进入SELECTED状态,可以正常收发数据消息。

Deselect则是优雅断开会话的方式:一方发送Deselect.req,另一方回复Deselect.rsp,双方回到CONNECTED状态,但TCP连接仍然保留。如果只是想临时停止通信而不关闭TCP,用Deselect;如果要彻底断开,则直接关闭TCP连接。

Select.rsp的Select Status常见取值:0=接受;1=已在使用;2=不支持该Session ID;3=资源不足。调试时若一直无法进入SELECTED,优先检查Session ID是否匹配、主机是否已占用该会话。

三、心跳(Linktest)与超时机制

HSMS用Linktest来检测链路是否存活。在SELECTED状态下,如果一段时间内没有数据消息,任一方都可以发送Linktest.req,对方必须回复Linktest.rsp。这个“一段时间”由T7定时器控制,典型值为10秒到45秒。如果发出Linktest.req后在T7时间内没有收到rsp,发送方判定链路异常,关闭TCP连接并进入重连流程。

除了T7,还有几个关键定时器需要关注:T3是等待回复的超时(通常45秒),T5是连接分离后的重连等待时间(通常10秒),T6是控制消息之间的超时(通常5秒)。这些参数在设备端和主机端必须协调配置,否则会出现一方还在等、另一方已经判超时的“假断线”。

# 典型HSMS参数配置(示例值,需按现场协商调整)
T3  = 45s   # 等待回复超时
T5  = 10s   # 重连等待时间
T6  = 5s    # 控制消息超时
T7  = 10s   # Linktest超时
T8  = 5s    # 网络字符间超时
Linktest间隔 = 30s
重连退避 = 1s, 2s, 4s, 8s, 16s, 30s(上限)

四、断线重连调试实战

断线重连是现场调试中最常遇到的问题。一个健壮的HSMS实现应该包含以下逻辑:检测到TCP断开或T7超时后,关闭当前socket,等待T5时间,然后重新发起connect()。如果连续失败,采用指数退避策略,避免频繁重连冲击主机。

调试时建议按以下顺序排查:

  1. 确认TCP层是否通:用telnet或nc测试主机端口,例如 telnet 192.168.1.100 5000,能连上说明网络和端口没问题。
  2. 抓包看Select交互:用Wireshark过滤 tcp.port==5000,观察是否有Select.req发出、Select.rsp是否返回、Status是否为0。
  3. 检查Session ID:SS模式下通常为0xFFFF,GS模式下必须与主机配置一致,否则Select会被拒绝。
  4. 观察Linktest节奏:如果Linktest.req发出后没有rsp,说明对端进程可能已挂死或网络中断,需要检查主机侧服务状态。
  5. 查看重连日志:记录每次connect()的时间戳和结果,确认退避策略是否生效,避免“疯狂重连”把主机打挂。
常见误区:TCP连接成功就认为HSMS可用。实际上,如果Select未完成,发送SECS-II消息会被对端丢弃或报错。调试时务必先确认进入SELECTED状态,再验证数据消息。

五、状态判断与日志观察

一个实用的调试技巧是给HSMS状态机加日志,把状态迁移和定时器事件都打出来。例如:

[2024-06-01 10:00:01] TCP connected to 192.168.1.100:5000
[2024-06-01 10:00:01] Send Select.req, SessionID=0xFFFF
[2024-06-01 10:00:01] Recv Select.rsp, Status=0 → SELECTED
[2024-06-01 10:00:31] Send Linktest.req
[2024-06-01 10:00:31] Recv Linktest.rsp → Link OK
[2024-06-01 10:01:15] T7 timeout, no Linktest.rsp
[2024-06-01 10:01:15] Close socket, wait T5=10s
[2024-06-01 10:01:25] Reconnect attempt #1
[2024-06-01 10:01:25] TCP connected, resend Select.req
[2024-06-01 10:01:25] Recv Select.rsp, Status=0 → SELECTED

通过这样的日志,可以快速判断问题出在TCP层、Select层还是心跳层。实际项目中,建议把HSMS状态、最后收发时间、重连次数做成可视化监控,便于长期运行观察。

总结来说,HSMS-SS/GS的实战核心就是:TCP先通、Select后通、Linktest保活、超时判死、退避重连。把这五步的状态和定时器理清楚,绝大多数通信问题都能定位到具体环节。