2. HSMS连接建立机制精讲
HSMS(High-Speed SECS Message Services)是SEMI E37标准定义的通信协议,它把SECS-II消息承载在TCP之上,用于设备与主机之间的高速数据交换。很多现场“连不上”“连上又断”“Select失败”的问题,根源并不在SECS-II报文本身,而在HSMS连接建立这一层。理解主动/被动模式、TCP三次握手、Select/Deselect交互以及状态机与超时参数,是后续排障的基础。
一、主动模式与被动模式:谁发起连接
HSMS把通信两端分为两种角色:Active(主动)和Passive(被动)。主动方负责发起TCP连接,被动方负责监听端口并接受连接。角色由配置决定,与设备是主机还是设备无关。常见约定是主机侧配置为Active,设备侧配置为Passive,但也可以反过来,只要两端配置互补即可。
被动方需要绑定一个监听端口,HSMS默认端口是5000,实际项目中常改为其他端口以避免冲突。主动方需要知道被动方的IP和端口。如果两端都配成Active,则双方都在发起连接,没有监听方,连接永远建立不起来;如果两端都配成Passive,则双方都在等待,同样无法建立。这是现场最常见的配置错误之一。
二、TCP连接建立过程
HSMS的底层是标准TCP连接。主动方调用connect()向被动方的IP:Port发起SYN,被动方回复SYN+ACK,主动方再回复ACK,三次握手完成后TCP连接进入ESTABLISHED状态。此时只是TCP通道通了,HSMS层还没有真正“可用”。
TCP连接建立后,双方进入HSMS的Connected状态,但还不能收发SECS-II数据消息。必须经过Select交互,进入Selected状态,才允许传输数据。这一点非常关键:TCP通不等于HSMS通。
三、Select.req/Select.rsp交互
TCP连接建立后,主动方(或按配置指定的一方)发送Select.req,其中携带Session ID等参数。被动方收到后,如果同意建立HSMS会话,回复Select.rsp,状态码为0表示接受;如果拒绝,则返回非0状态码,常见如1表示已在使用、2表示不支持等。
Select.req和Select.rsp的交互过程如下:
- 主动方发送Select.req,启动T6定时器,等待Select.rsp。
- 被动方收到Select.req,检查Session ID和自身状态,决定接受或拒绝。
- 被动方回复Select.rsp,状态码0表示接受。
- 主动方收到Select.rsp且状态码为0,停止T6,双方进入Selected状态。
如果T6超时仍未收到Select.rsp,主动方会认为Select失败,通常关闭TCP连接并重试。T6默认值一般为45秒,实际项目中可根据网络质量调整,但不宜过短,否则容易误判。
四、Deselect.req/Deselect.rsp交互
当需要正常结束HSMS会话但保留TCP连接时,一方发送Deselect.req,另一方回复Deselect.rsp。Deselect完成后,双方从Selected状态回到Connected状态,TCP连接仍然保持。之后可以再次发起Select,重新进入Selected状态。
Deselect与直接断开TCP不同:Deselect是“优雅地退出会话”,TCP连接还在;而直接关闭TCP会同时终止会话和连接。现场调试时,如果只想临时停止数据交换而不想重新建立TCP,可以用Deselect。
五、连接状态机
HSMS连接状态可以用一个简化的状态机来描述,主要状态包括:
- Not Connected:尚未建立TCP连接。
- Connected:TCP已建立,但未Select,不能收发数据消息。
- Selected:Select成功,可以收发SECS-II数据消息。
状态迁移关系为:Not Connected → Connected(TCP建立成功);Connected → Selected(Select成功);Selected → Connected(Deselect成功);Connected → Not Connected(TCP断开);Selected → Not Connected(TCP断开或通信异常)。
六、超时参数与常见故障判断
HSMS定义了多个定时器,与连接建立直接相关的主要有T5、T6、T7:
| 定时器 | 名称 | 默认值 | 作用 | 超时后果 |
|---|---|---|---|---|
| T5 | Connect Separation Timeout | 10s | 两次连接尝试之间的间隔 | 重连节奏变慢,但不影响单次连接 |
| T6 | Control Transaction Timeout | 45s | 等待Select.rsp或Deselect.rsp | Select失败,关闭TCP并重试 |
| T7 | Not Selected Timeout | 10s | TCP建立后等待Select.req | 未收到Select.req则关闭TCP |
现场排障时,可以按以下顺序判断:
- TCP是否建立?如果TCP都建不起来,检查IP、端口、防火墙、Active/Passive配置。
- TCP建立后是否收到Select.req?如果T7超时,说明主动方没有发Select.req,检查主动方配置和程序状态。
- Select.req发出后是否收到Select.rsp?如果T6超时,检查被动方是否正常处理、Session ID是否匹配。
- Select.rsp状态码是否为0?非0说明被动方拒绝,需查看拒绝原因。
- Selected后是否稳定?如果频繁Deselect或断开,检查T3、T5等参数和网络质量。
七、配置示例
以下是一个典型的HSMS连接配置示例(以某设备侧Passive配置为例):
HSMS Mode = Passive
Listen Port = 5000
Session ID = 0
T5 = 10
T6 = 45
T7 = 10
Device ID = 1
主机侧Active配置示例:
HSMS Mode = Active
Remote IP = 192.168.1.100
Remote Port = 5000
Session ID = 0
T5 = 10
T6 = 45
T7 = 10
Device ID = 1
两端Session ID必须一致,否则Select.rsp会返回错误。Device ID用于SECS-II层,与HSMS层Session ID不是同一个概念,不要混淆。
八、小结与排障要点
HSMS连接建立的核心是:Active发起TCP,Passive监听;TCP建立后进入Connected;Select成功进入Selected;Deselect回到Connected;TCP断开回到Not Connected。T6和T7是连接建立阶段最关键的定时器。排障时先看TCP,再看Select,最后看数据消息,逐层定位,避免一上来就抓SECS-II报文。