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连接状态机的完整转换路径,包括正常流程、异常回退以及重连触发条件。图中使用不同颜色区分状态节点与转换触发事件。

HSMS连接状态机转换图 HSMS 连接状态机转换图 Connected TCP连接已断开 Not Selected TCP已连接,未建立控制 Selected 正常通信状态 TCP连接建立成功 Select.req / Select.rsp 成功 Deselect / 对方Deselect TCP连接断开 / 心跳超时 TCP连接断开 / 心跳超时 说明: • 从Connected到Not Selected是唯一通过TCP连接建立触发的正向转换。 • 从Selected直接回退到Connected表示异常断开,需要触发重连流程。

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 状态机实现要点

  1. 状态锁定:状态转换必须是原子操作,避免多线程环境下状态竞争。建议使用互斥锁(Mutex)保护状态变量。
  2. 超时驱动:每个状态都应关联一个超时定时器。Connected状态使用连接超时;Not Selected使用Select超时;Selected使用心跳超时。
  3. 日志记录:每次状态转换都应记录时间戳、旧状态、新状态和触发事件,便于故障排查。
  4. 资源清理:从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。