4. 连接建立状态机:HSMS连接状态与状态转换条件

在SECS/GEM通信中,HSMS(High-Speed SECS Message Services)定义了设备与主机之间TCP/IP连接的完整状态机。理解HSMS连接状态及其转换条件是进行设备连接调试的基础。本章将详细解析NOT CONNECTED、CONNECTED、SELECTED三个核心状态,以及触发状态转换的关键事件。

4.1 HSMS连接状态概述

HSMS状态机包含三个基本状态,设备与主机之间的通信会话必须依次经过这些状态才能进行正常的SECS消息交换。下表总结了各状态的核心特征:

状态名称 状态编号 TCP连接状态 消息收发能力 典型持续时间
NOT CONNECTED 1 未建立 无法收发任何消息 设备启动后/连接断开后
CONNECTED 2 已建立 仅可收发控制消息(Select/Deselect/Linktest/Reject) TCP连接建立后,Select成功前
SELECTED 3 已建立 可收发所有SECS消息(包括数据消息) 正常通信期间
调试要点: 在CONNECTED状态下,设备虽然已经建立了TCP连接,但还不能发送数据消息(如S1F1、S2F41等)。只有进入SELECTED状态后,完整的SECS通信才被允许。这是调试过程中最容易忽略的环节。

4.2 HSMS连接状态机详细图解

下图展示了HSMS连接状态机的完整转换路径,包含所有状态节点、转换条件以及关键控制消息:

HSMS连接状态机转换图 HSMS连接状态机转换图 NOT CONNECTED 状态1:无TCP连接 CONNECTED 状态2:TCP已连接 SELECTED 状态3:会话已选择 TCP连接建立 (主动/被动连接) Select.req成功 (发送Select.req) Deselect / 超时T6 / 连接断开 TCP连接断开 / 超时T7/T8 TCP连接异常断开 状态转换关键说明 ① NOT CONNECTED → CONNECTED: TCP三次握手成功,设备或主机发起连接请求(主动连接模式)或接受连接(被动连接模式)。 ② CONNECTED → SELECTED: 设备或主机发送Select.req控制消息,对方回复Select.rsp且通信ID匹配,状态提升为SELECTED。 ③ SELECTED → CONNECTED / NOT CONNECTED: 发送Deselect.req主动降级,或T6超时(未收到响应)、TCP连接断开导致回退。 ④ 超时参数: T6(连接响应超时,默认45s)、T7(连接空闲超时,默认10s)、T8(网络字符超时,默认5s)。
实战提示: 在调试过程中,使用Wireshark或SECS调试工具抓包时,重点关注Select.req/Select.rsp消息的交换。如果设备一直停留在CONNECTED状态无法进入SELECTED,通常是因为Select.rsp中的通信ID(Communication ID)不匹配,或者T6超时设置不合理。

4.3 状态转换条件详解

4.3.1 NOT CONNECTED → CONNECTED

此转换由TCP连接建立事件触发。HSMS支持两种连接模式:

  • 主动连接模式(Active Mode): 设备主动向主机发起TCP连接请求。设备配置中需指定主机的IP地址和端口号(通常为5000或5001)。
  • 被动连接模式(Passive Mode): 设备监听指定端口,等待主机发起连接。设备作为TCP Server运行。

转换条件总结:

条件编号 触发事件 说明 常见调试问题
C1 TCP三次握手成功 SYN → SYN-ACK → ACK 完成 防火墙阻止端口、IP地址配置错误
C2 连接请求队列非空 被动模式下收到连接请求 端口被占用、连接数超限
C3 重连定时器超时 设备自动重连机制触发 重连间隔过短导致频繁连接

4.3.2 CONNECTED → SELECTED

这是HSMS状态机中最重要的转换,标志着通信会话的正式建立。转换过程涉及以下步骤:

  1. 发送Select.req: 设备(或主机)构造Select请求消息,消息头中Session ID设置为0xFFFF,Message ID为0x0001。
  2. 等待Select.rsp: 接收方必须在T6超时时间内回复Select.rsp响应消息。
  3. 验证通信ID: Select.rsp中的通信ID必须与Select.req中的一致,否则转换失败。
  4. 检查响应代码: Select.rsp的响应代码必须为0(成功),非0值表示拒绝选择。
调试案例: 某设备在CONNECTED状态反复超时,抓包发现Select.rsp中的通信ID为0x0001,而设备期望的是0x0002。原因是主机端通信ID计数器未初始化。解决方案:在主机端重置通信ID计数器,确保与设备端对齐。

4.3.3 SELECTED → CONNECTED

从SELECTED状态降级到CONNECTED状态,通常由以下条件触发:

  • Deselect.req/Deselect.rsp: 设备或主机主动发送Deselect请求,解除会话选择状态。
  • T6超时: 在SELECTED状态下发送消息后,未在T6时间内收到响应,状态自动降级。
  • Linktest失败: Linktest.req发送后未收到Linktest.rsp,连接被认为不可用。

4.3.4 SELECTED → NOT CONNECTED

直接回退到NOT CONNECTED状态,通常由TCP连接异常断开导致:

触发条件 典型原因 调试方法
TCP RST接收 主机端进程崩溃、网络设备重置 检查主机端日志,确认进程状态
T8超时 网络字符间隔超时,数据包丢失 检查网络延迟和丢包率
物理链路断开 网线松动、交换机端口down 检查物理连接状态

4.4 状态转换时序图

以下SVG图展示了设备从启动到进入SELECTED状态的完整时序流程,包含关键消息交换和超时监控点:

HSMS连接建立时序图 HSMS连接建立时序图(设备主动连接模式) 设备(主动) 主机(被动) NOT CONNECTED NOT CONNECTED TCP SYN TCP SYN-ACK TCP ACK → CONNECTED → CONNECTED Select.req (Session ID=0xFFFF) T6超时监控 Select.rsp (通信ID匹配, 响应码=0) → SELECTED → SELECTED S1F1 (Are You There?) S1F2 (On Line Data) 时序关键点 ① TCP三次握手完成后,设备立即进入CONNECTED状态;② Select.req必须在T6超时(默认45s)内收到Select.rsp; ③ 通信ID必须严格匹配,否则Select失败;④ 进入SELECTED后,设备才能发送数据消息(如S1F1)。

4.5 状态机调试实战要点

常见调试陷阱:
  • 状态机卡在CONNECTED: 检查Select.rsp是否返回,通信ID是否匹配,T6超时时间是否足够。
  • 频繁状态抖动: 设备在SELECTED和CONNECTED之间反复切换,通常由T6超时或Linktest失败引起。检查网络稳定性和响应时间。
  • 无法建立TCP连接: 确认IP地址、端口号、防火墙规则。使用telnet或nc命令测试TCP连通性。
  • 通信ID冲突: 多设备场景下,确保每个连接的通信ID唯一。主机端应维护独立的ID计数器。

4.5.1 状态机调试步骤

  1. 步骤1:确认物理连接 — 使用ping命令测试设备与主机之间的网络连通性。
  2. 步骤2:检查TCP连接 — 使用netstat或ss命令查看TCP连接状态,确认是否进入ESTABLISHED状态。
  3. 步骤3:监控Select过程 — 抓包分析Select.req和Select.rsp消息,检查消息头和通信ID。
  4. 步骤4:验证SELECTED状态 — 发送S1F1(Are You There?)消息,确认设备能够正常响应。
  5. 步骤5:持续监控 — 观察Linktest消息是否定期交换,确保状态机稳定在SELECTED。

4.5.2 状态机调试常用命令

调试工具 命令/操作 用途
telnet telnet <host_ip> <port> 测试TCP端口连通性
netstat netstat -an | grep <port> 查看TCP连接状态
tcpdump tcpdump -i eth0 port <port> 抓取HSMS通信数据包
Wireshark 设置过滤条件 tcp.port == <port> 图形化分析HSMS消息
SECS调试器 发送Select.req / S1F1 模拟主机或设备行为
实战案例: 某半导体设备在现场调试时,主机端日志显示设备频繁断开重连。抓包分析发现,设备在SELECTED状态下发送S1F1后,主机在T6超时内未回复S1F2,导致设备状态降级为CONNECTED,随后设备自动重连。最终定位为主机端消息处理线程阻塞,优化线程池配置后问题解决。

4.6 状态机参数配置参考

HSMS状态机的行为受多个定时器参数影响,合理配置这些参数是保证连接稳定性的关键:

参数名称 默认值 推荐范围 作用
T6 45秒 10~120秒 连接响应超时,控制Select.req等待时间
T7 10秒 5~30秒 连接空闲超时,控制Linktest发送间隔
T8 5秒 1~10秒 网络字符超时,控制数据包间隔
Connect Mode 主动模式 主动/被动 连接建立方式
Retry Interval 10秒 5~60秒 重连间隔时间
配置建议: 在调试初期,建议将T6设置为60秒以上,避免因网络延迟导致Select失败。生产环境中,根据实际网络状况调整T7和T8,网络质量较差时可适当增大T8值。

通过深入理解HSMS连接状态机的三个核心状态及其转换条件,调试工程师能够快速定位连接建立过程中的问题点。在实际调试中,结合抓包工具和状态监控手段,可以高效地完成设备与主机之间的通信握手调试。