2、HSMS连接状态机:Not Selected、Selected、Connected状态详解、状态转换图
HSMS(High-Speed SECS Message Services)作为SECS/GEM协议在TCP/IP网络上的实现,其连接管理依赖于一个精确定义的状态机。理解Not Selected、Selected和Connected这三个核心状态及其转换规则,是设计可靠重连策略的基础。任何状态转换的失误都可能导致通信中断或数据丢失。
2.1 状态定义与核心职责
HSMS状态机定义了设备(Equipment)与主机(Host)之间TCP连接的控制权归属与通信能力。每个状态都对应特定的控制实体(谁可以主动发送数据)和允许的操作集合。
| 状态 | 控制实体 | TCP连接状态 | 允许的操作 | 典型场景 |
|---|---|---|---|---|
| Not Selected | 无(未建立控制关系) | 已建立 | 仅发送Select.req / 接收Select.rsp | TCP连接刚建立,等待确定主从关系 |
| Selected | 主动方(Active Peer) | 已建立 | 发送/接收所有SECS消息(Data Message) | 正常通信阶段,设备与主机交换数据 |
| Connected | 无(TCP连接已断开) | 已断开 | 仅允许发起TCP连接建立 | 网络中断、对方关闭连接、心跳超时 |
关键概念:“Selected”状态并不意味着TCP连接是唯一的。一个TCP连接上可以承载多个“Session”(会话),但每个Session独立维护自己的Selected状态。在标准HSMS实现中,通常一个TCP连接对应一个Session,因此“Selected”状态直接决定了该连接能否传输业务数据。
2.2 状态转换图(核心SVG)
下图展示了HSMS连接状态机的完整转换路径,包括正常流程、异常回退以及重连触发条件。图中使用不同颜色区分状态节点与转换触发事件。
2.3 状态详解与转换触发条件
2.3.1 Connected 状态
含义:TCP连接尚未建立或已经断开。设备或主机处于“待连接”状态,无法进行任何SECS消息交互。
- 进入条件:系统启动、TCP连接被对端关闭、网络故障、心跳(Heartbeat)超时。
- 允许操作:仅能发起TCP连接建立请求(主动连接或被动监听)。
- 重连意义:这是重连策略的起点。设备在此状态下应启动连接定时器,尝试重新建立TCP连接。
常见陷阱:许多实现错误地在Connected状态下发送Select.req,这会导致协议违规。必须先完成TCP三次握手进入Not Selected,才能进行Select协商。
2.3.2 Not Selected 状态
含义:TCP连接已成功建立,但尚未确定哪一方是“主动方”(Active Peer)。此时连接处于“未控制”状态,不能传输业务数据(Data Message)。
- 进入条件:TCP连接建立成功(从Connected转换而来);或从Selected状态通过Deselect操作回退。
- 允许操作:仅能发送
Select.req消息或接收Select.rsp消息。 - 控制权协商:设备与主机通过Select事务确定主动方。主动方负责后续的数据传输调度。
最佳实践:在Not Selected状态,建议设置较短的超时时间(如5秒)。如果Select事务在超时内未完成,应主动断开TCP连接并回到Connected状态,避免连接挂起。
2.3.3 Selected 状态
含义:控制关系已建立,设备与主机可以自由交换SECS消息(包括Primary Message和Reply Message)。这是正常的通信工作状态。
- 进入条件:Select事务成功完成(主动方收到
Select.rsp且返回代码为0)。 - 允许操作:发送/接收所有SECS消息;发起Deselect操作以主动降级到Not Selected。
- 稳定性保障:在此状态下,HSMS通过心跳机制(Heartbeat)监控连接健康度。若连续多次心跳无响应,则自动回退到Connected状态。
2.4 状态转换流程清单
以下表格总结了所有合法的状态转换路径及其触发事件,帮助开发者在实现状态机时避免遗漏边界情况。
| 起始状态 | 目标状态 | 触发事件 | 动作说明 | 超时/异常处理 |
|---|---|---|---|---|
| Connected | Not Selected | TCP连接建立成功 | 完成三次握手,进入待控制状态 | 连接失败则重试(重连策略) |
| Not Selected | Selected | Select.req + Select.rsp (成功) | 主动方发送Select请求,对端确认 | 超时未收到响应,回退到Connected |
| Not Selected | Connected | TCP连接断开 / 对端关闭 | 连接异常中断,释放资源 | 触发重连机制 |
| Selected | Not Selected | Deselect.req / 对端Deselect | 主动降级控制关系 | 通常用于连接复用或重置 |
| Selected | Connected | TCP连接断开 / 心跳超时 | 通信中断,立即回退 | 必须触发重连,不能停留在Selected |
2.5 状态机实现要点
- 状态锁定:状态转换必须是原子操作,避免多线程环境下状态竞争。建议使用互斥锁(Mutex)保护状态变量。
- 超时驱动:每个状态都应关联一个超时定时器。Connected状态使用连接超时;Not Selected使用Select超时;Selected使用心跳超时。
- 日志记录:每次状态转换都应记录时间戳、旧状态、新状态和触发事件,便于故障排查。
- 资源清理:从Selected或Not Selected回退到Connected时,必须清空发送缓冲区、重置序列号、关闭Socket句柄。
代码示例:状态机转换核心逻辑(伪代码)
switch (current_state) {
case CONNECTED:
if (tcp_connected_success) {
set_state(NOT_SELECTED);
start_select_timer(5000); // 5秒超时
}
break;
case NOT_SELECTED:
if (select_success) {
set_state(SELECTED);
start_heartbeat_timer(10000); // 10秒心跳
} else if (tcp_disconnected || select_timeout) {
set_state(CONNECTED);
trigger_reconnect();
}
break;
case SELECTED:
if (deselect_received || heartbeat_timeout || tcp_disconnected) {
set_state(CONNECTED);
cleanup_resources();
trigger_reconnect();
}
break;
}
2.6 状态机与重连策略的关联
HSMS状态机是重连策略的“导航图”。重连策略的核心目标就是:在Connected状态下,以最优的方式驱动状态机回到Selected状态。每一次重连尝试都对应一次“Connected → Not Selected → Selected”的完整转换路径。理解状态机,才能精准设置重连参数:
- 重连间隔:影响从Connected到Not Selected的转换频率。
- Select超时:影响从Not Selected到Selected的转换成功率。
- 心跳间隔:影响Selected状态的稳定性,间接决定何时回退到Connected。