4. SECS/GEM 状态机模型:连接状态、通信状态、控制状态的转换

SECS/GEM 协议的核心在于其严谨的三层状态机模型。该模型定义了设备(Equipment)与主机(Host)之间从物理连接到业务控制的完整生命周期。理解这三层状态及其转换规则,是进行协议调试、工具选型以及故障定位的基础。

调试要点: 在抓包分析时,如果发现消息无响应或连接异常断开,首先应检查当前设备处于哪一层状态。状态不匹配是导致通信失败的最常见原因。

4.1 三层状态机总览

SECS/GEM 状态机由下至上分为三个层次:连接状态(Connection State)、通信状态(Communication State) 和 控制状态(Control State)。每一层状态都约束了上层状态的行为。

SECS/GEM 三层状态机模型 第一层:连接状态(Connection State) 物理 TCP/IP 连接是否建立? 第二层:通信状态(Communication State) S1F13 / S1F14 通信握手是否完成? 第三层:控制状态(Control State) 设备是否允许远程控制(ON-LINE / OFF-LINE)?

4.2 连接状态(Connection State)

连接状态是状态机的最底层,直接对应 TCP/IP 套接字的建立与断开。该层只有两个状态:NOT CONNECTED 和 CONNECTED。

状态名称 描述 触发条件
NOT CONNECTED 物理链路未建立,无任何消息可收发。 TCP 连接断开、超时、或主动关闭。
CONNECTED TCP 三次握手成功,链路层就绪。 设备或主机发起 TCP 连接请求并成功。
调试技巧: 在 Wireshark 中,如果看到 TCP RST 或 FIN 包,说明连接状态正在向 NOT CONNECTED 转换。此时应检查网络防火墙、端口可达性以及设备端的 TCP Keep-Alive 配置。
连接状态转换图 NOT CONNECTED CONNECTED TCP 连接建立 TCP 连接断开 / 超时

4.3 通信状态(Communication State)

当连接状态为 CONNECTED 后,设备与主机需要通过 S1F13 (Establish Communication Request) 和 S1F14 (Establish Communication Acknowledge) 完成通信握手。通信状态分为:COMMUNICATING 和 NOT COMMUNICATING。

状态名称 描述 触发条件
NOT COMMUNICATING TCP 已连接,但未完成 S1F13/14 握手。 连接建立后初始状态,或通信超时后回退。
COMMUNICATING 握手成功,设备与主机可以交换标准消息。 收到 S1F14 且内容正确。
常见问题: 很多调试场景中,TCP 连接是正常的(CONNECTED),但设备一直处于 NOT COMMUNICATING 状态。这通常是因为主机没有及时回复 S1F14,或者 S1F13 中的 MDLN(设备型号)和 SOFTREV(软件版本)不匹配。
通信状态转换与 S1F13/14 握手 NOT COMMUNICATING COMMUNICATING S1F13 → S1F14 成功 通信超时 / 链路中断 S1F13: MDLN, SOFTREV → S1F14: COMMACK

4.4 控制状态(Control State)

控制状态是 GEM 标准中最高层的状态,决定了设备是否接受主机的远程控制。该层包含三个核心状态:OFF-LINE、ON-LINE 和 ON-LINE (REMOTE)。其中,DISABLE 和 ENABLE 是控制状态下的子模式,用于控制具体事件报告和远程命令的使能。

状态名称 描述 转换条件
OFF-LINE 设备本地操作,不接受主机远程控制。 设备上电初始状态,或收到 S1F17 (OFF-LINE)。
ON-LINE 设备允许主机控制,但处于本地模式。 收到 S1F1 (ON-LINE) 或操作员切换。
ON-LINE (REMOTE) 设备完全由主机远程控制,本地操作被锁定。 主机发送 S2F17 (Remote Command) 或状态变更。
ENABLE / DISABLE 子模式: 在 ON-LINE 状态下,主机可以通过 S2F37 (Enable/Disable Event Report) 和 S2F35 (Enable/Disable Remote Command) 来控制具体功能的使能。例如,DISABLE 状态会阻止设备发送事件报告,但通信链路仍然保持。
控制状态转换图(含 ENABLE / DISABLE) OFF-LINE ON-LINE ON-LINE (REMOTE) S1F1 S2F17 S1F17 / 本地操作 ENABLE / DISABLE 子模式(在 ON-LINE 下生效) ENABLE: 允许事件报告和远程命令 DISABLE: 阻止事件报告,但保持通信 转换命令: S2F37 (Event Report) / S2F35 (Remote Command)

4.5 状态转换完整流程与调试对照

在实际调试中,状态转换的每一步都可以通过抓包工具观察到。以下是一个典型的完整状态转换流程,以及对应的抓包特征:

  1. 物理连接: 设备发起 TCP 连接(SYN → SYN-ACK → ACK),状态变为 CONNECTED。
  2. 通信握手: 设备发送 S1F13,主机回复 S1F14,状态变为 COMMUNICATING。
  3. 控制状态初始化: 设备默认进入 OFF-LINE 状态。
  4. 上线: 主机发送 S1F1,设备回复 S1F2,状态变为 ON-LINE。
  5. 远程控制: 主机发送 S2F17,设备进入 ON-LINE (REMOTE)。
  6. 事件使能: 主机发送 S2F37 设置 ENABLE,设备开始上报事件。
步骤 状态层 消息流 抓包特征
1 连接状态 TCP SYN / SYN-ACK / ACK 三次握手包,无 SECS 内容
2 通信状态 S1F13 → S1F14 Stream 1, Function 13/14
3 控制状态 S1F1 → S1F2 Stream 1, Function 1/2
4 控制状态 S2F17 → S2F18 Stream 2, Function 17/18
5 控制状态 S2F37 → S2F38 Stream 2, Function 37/38
调试工具建议: 使用 SECS/GEM 调试工具(如 SECSComm、GEMEdge)时,建议开启“状态机视图”功能。该功能可以实时显示当前的三层状态,并在状态转换时高亮显示,极大提升问题定位效率。

4.6 状态机调试常见问题与对策

现象 可能原因 排查方法
TCP 连接频繁断开 Keep-Alive 超时、防火墙策略 检查 TCP Keep-Alive 参数,抓包确认 RST 来源
S1F13 无响应 主机未启动、IP/Port 配置错误 确认主机端 SECS 服务是否监听,检查防火墙
S1F14 返回 COMMACK ≠ 0 MDLN 或 SOFTREV 不匹配 核对设备配置与主机端白名单
设备无法进入 ON-LINE 设备处于 OFF-LINE 且未收到 S1F1 手动发送 S1F1 或检查主机上线流程
事件报告不触发 控制状态为 DISABLE 发送 S2F37 设置 ENABLE,检查 CEID 配置
重要提醒: 在调试过程中,不要混淆“通信状态”和“控制状态”。即使设备处于 OFF-LINE 状态,它仍然可以接收 S1F1 消息。而如果设备处于 NOT COMMUNICATING 状态,则任何 S1F1 消息都会被忽略。务必按照状态机层级逐层排查。