3. 通信建立与初始化:HSMS连接建立、Select/Communicate状态、Linktest机制
在SECS/GEM协议栈中,通信建立与初始化是设备与主机(Host)之间建立可靠会话的第一步。本章聚焦于HSMS(High-Speed SECS Message Services)连接的生命周期管理,包括TCP/IP连接建立、Select/Communicate状态机转换以及Linktest心跳机制。理解这些底层交互是后续进行日志解析和状态机调试的基础。
3.1 HSMS连接建立流程
HSMS定义了两种连接模式:主动模式(Active Mode)和被动模式(Passive Mode)。设备通常作为主动端发起连接,主机作为被动端监听。连接建立分为三个核心阶段:TCP连接、控制消息交换、会话激活。
工程要点:在实际联调中,80%的通信失败问题源于TCP端口不通或防火墙拦截。建议在设备端使用
telnet host_ip 5000 测试主机端口可达性。
HSMS连接建立步骤清单:
- TCP三次握手:设备(主动端)向主机(被动端)的指定端口(默认5000)发起TCP连接。
- 发送Select.req:TCP连接建立后,设备立即发送HSMS Select.req消息,请求建立控制会话。
- 接收Select.rsp:主机回复Select.rsp,携带通信状态(COMMUNICATING或NOT COMMUNICATING)。
- 会话激活:若Select.rsp状态为COMMUNICATING,则HSMS会话正式建立,可以开始收发SECS-II消息。
3.2 Select/Communicate状态机
HSMS状态机定义了设备与主机之间的通信状态。核心状态包括:NOT CONNECTED、CONNECTED、NOT COMMUNICATING、COMMUNICATING。Select过程是状态转换的关键触发事件。
| 状态名称 | 描述 | 触发条件 | 可操作行为 |
|---|---|---|---|
| NOT CONNECTED | TCP连接未建立 | 初始状态或连接断开 | 等待连接请求 |
| CONNECTED | TCP连接已建立,但未完成Select | TCP三次握手成功 | 只能发送Select.req |
| NOT COMMUNICATING | Select完成但通信异常 | Select.rsp返回NOT COMMUNICATING | 重试Select或断开重连 |
| COMMUNICATING | 正常通信状态 | Select.rsp返回COMMUNICATING | 收发SECS-II消息、Linktest |
常见陷阱:部分设备在TCP连接建立后立即发送SECS-II消息,跳过Select过程。这会导致主机丢弃消息并断开连接。务必遵循“先Select,后通信”的协议顺序。
3.3 Linktest机制
Linktest是HSMS定义的心跳检测机制,用于验证通信链路在空闲状态下的健康性。设备或主机可以定期发送Linktest.req消息,对方必须回复Linktest.rsp。如果连续多次未收到响应,则判定连接断开并触发重连。
Linktest关键参数:
- 发送间隔:通常为10~30秒,由设备配置决定。
- 超时次数:连续3次未收到Linktest.rsp视为连接断开。
- 触发动作:断开TCP连接,重新执行Select流程。
- 日志特征:Linktest.req的消息ID通常为0x0000,Linktest.rsp为0x0001。
3.4 日志解析实战:通信建立阶段
在实际联调中,通信建立阶段的日志是排查问题的第一手资料。以下是一个典型的HSMS连接建立日志片段,包含TCP连接、Select和Linktest交互。
2025-03-20 10:00:01.123 [INFO] HSMS: TCP connection established to 192.168.1.100:5000
2025-03-20 10:00:01.124 [INFO] HSMS: Sending Select.req (Message ID: 0x0001)
2025-03-20 10:00:01.150 [INFO] HSMS: Received Select.rsp (Message ID: 0x0001, Status: COMMUNICATING)
2025-03-20 10:00:01.151 [INFO] HSMS: Session established, entering COMMUNICATING state
2025-03-20 10:00:15.000 [DEBUG] HSMS: Sending Linktest.req (Message ID: 0x0002)
2025-03-20 10:00:15.010 [DEBUG] HSMS: Received Linktest.rsp (Message ID: 0x0002)
2025-03-20 10:00:30.000 [DEBUG] HSMS: Sending Linktest.req (Message ID: 0x0003)
2025-03-20 10:00:30.012 [DEBUG] HSMS: Received Linktest.rsp (Message ID: 0x0003)
日志解析要点:
- 关注
Status: COMMUNICATING关键字,确认Select成功。 - Linktest的发送间隔应稳定,若间隔波动超过50%则可能存在网络延迟。
- 如果日志中出现
Select.rsp (Status: NOT COMMUNICATING),检查设备是否已注册或主机配置是否正确。
3.5 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| TCP连接失败 | 端口不通、防火墙拦截、主机未启动 | 使用 telnet 测试端口;检查主机服务状态 |
| Select.rsp返回NOT COMMUNICATING | 设备未注册、主机拒绝连接 | 检查设备ID配置;查看主机日志确认拒绝原因 |
| Linktest连续超时 | 网络不稳定、主机负载过高 | 增加超时次数;检查网络丢包率;优化主机处理能力 |
| 通信建立后立即断开 | Select后未等待Linktest即发送数据 | 确认协议顺序;检查设备状态机实现 |
避坑指南:部分老旧设备在Select成功后不发送Linktest,导致主机误判连接断开。建议在设备端强制启用Linktest,或与主机协商关闭Linktest检查。