3. HSMS协议详解:TCP/IP物理层、连接建立与断开、消息格式、会话管理
HSMS(High-Speed SECS Message Services)是SECS/GEM协议栈中负责在TCP/IP网络上传输SECS-II消息的通信层。它定义了如何将SECS-II数据块封装成标准化的消息格式,并通过可靠的TCP连接在主机(Host)与设备(Equipment)之间进行交换。本章将深入剖析HSMS协议的物理层依赖、连接生命周期、消息结构以及会话管理机制。
3.1 TCP/IP物理层与端口约定
HSMS完全依赖于TCP/IP协议栈作为其底层传输载体。与传统的RS-232串口SECS-I不同,HSMS利用TCP的面向连接、可靠传输特性,实现了更高的通信速率和更远的传输距离。
| 特性 | HSMS (TCP/IP) | SECS-I (RS-232) |
|---|---|---|
| 传输层协议 | TCP | 串行通信 |
| 物理介质 | 以太网 | 串口线 |
| 默认端口 | 5000 (主机监听) | N/A |
| 连接方式 | 主动/被动建立 | 点对点直连 |
| 传输速率 | 10/100/1000 Mbps | 9600 bps 典型 |
| 可靠性 | 内置重传与校验 | 需应用层校验 |
下图展示了HSMS在TCP/IP协议栈中的位置以及物理层连接的基本拓扑:
3.2 连接建立与断开
HSMS的连接管理分为两个层面:TCP连接的建立与断开,以及HSMS会话的建立与断开。TCP连接是基础,HSMS会话则是在TCP连接之上通过特定的控制消息进行协商。
3.2.1 连接建立流程
标准的HSMS连接建立遵循“主动-被动”模式。设备(Equipment)作为TCP客户端主动连接主机(Host)的监听端口。连接建立后,设备发送 Select.req 消息请求建立HSMS会话,主机回复 Select.rsp 确认。
- TCP三次握手: 设备向主机的IP:Port发起TCP连接请求。
- HSMS Select请求: TCP连接建立后,设备发送
Select.req消息,请求激活HSMS会话。 - HSMS Select响应: 主机处理请求,回复
Select.rsp,其中包含响应代码(0表示成功)。 - 会话激活: 双方进入“已选择(Selected)”状态,可以开始收发SECS-II消息。
Select.req/rsp 握手后,通信双方才正式进入可通信状态。这是HSMS区别于普通TCP应用的重要特征。
下图展示了完整的连接建立与断开序列:
3.2.2 连接断开方式
HSMS连接的断开分为正常断开和异常断开两种:
- 正常断开: 通过
Deselect.req/rsp消息对,双方协商关闭HSMS会话,随后关闭TCP连接。 - 异常断开: 一方检测到TCP连接中断(如网络故障、设备断电),另一方通过TCP的RST或超时机制检测到连接丢失,并清理会话状态。
- 链路测试: HSMS定义了
Linktest.req/rsp消息用于定期检测连接活性。如果一方在超时时间内未收到响应,则认为连接已断开。
3.3 消息格式详解
HSMS消息由消息头(Header)和数据块(Data Block)两部分组成。消息头固定为10字节,数据块为可选的SECS-II数据内容。
3.3.1 消息头结构
| 字节偏移 | 字段名称 | 长度 | 描述 |
|---|---|---|---|
| 0 | Length | 4字节 | 消息总长度(包含Header + Data),大端序 |
| 4 | Device ID | 2字节 | 设备ID,bit15为控制位(0=数据消息,1=控制消息) |
| 6 | Stream/Function | 2字节 | bit15-8: Stream编号;bit7-0: Function编号 |
| 8 | P/B Type | 1字节 | bit7: P位(Primary=1);bit6: B位(Block=1);bit5-0: 保留 |
| 9 | System Bytes | 1字节 | 系统字节,用于消息配对(高8位) |
| 10-13 | System Bytes (续) | 4字节 | 系统字节(低32位),与字节9共同构成4字节System ID |
- Length: 整个消息的字节数,包括10字节Header和后续Data。例如,一个无数据的控制消息Length=10。
- Device ID: 用于标识消息的目标设备。bit15为1时表示该消息是HSMS控制消息(如Select.req),为0时表示是SECS-II数据消息。
- P/B Type: P位指示消息是否为Primary消息(请求);B位指示是否为Block消息(用于长消息分片)。
- System Bytes: 用于匹配请求与响应。Primary消息设置一个唯一的System ID,对应的Secondary消息必须使用相同的System ID。
3.3.2 消息类型分类
HSMS消息分为两大类:控制消息和数据消息。控制消息用于会话管理,数据消息用于承载SECS-II内容。
| 类别 | 消息名称 | S/F代码 | 方向 | 用途 |
|---|---|---|---|---|
| 控制消息 | Select.req | N/A | 设备→主机 | 请求建立HSMS会话 |
| Select.rsp | N/A | 主机→设备 | 响应Select请求 | |
| Deselect.req | N/A | 设备→主机 | 请求断开HSMS会话 | |
| Deselect.rsp | N/A | 主机→设备 | 响应Deselect请求 | |
| 控制消息 | Linktest.req | N/A | 任意方向 | 链路活性测试 |
| Linktest.rsp | N/A | 任意方向 | 链路测试响应 | |
| 数据消息 | Primary/Secondary | SxFy | 双向 | 承载SECS-II数据 |
以下是一个典型的HSMS数据消息(Primary消息)的字节序列示例:
// 示例:S1F1 (Are You There) 的HSMS封装
// 假设 Device ID = 10, System ID = 0x12345678
字节 0-3: 00 00 00 14 // Length = 20 (10字节Header + 10字节Data)
字节 4-5: 00 0A // Device ID = 10 (bit15=0, 数据消息)
字节 6-7: 01 01 // Stream=1, Function=1 (S1F1)
字节 8: 80 // P/B Type: P=1 (Primary), B=0 (非分片)
字节 9-12: 12 34 56 78 // System Bytes = 0x12345678
字节 13-22: [SECS-II Data Block] // 实际SECS-II内容
3.4 会话管理
HSMS会话管理定义了通信双方的状态转换规则,确保消息的有序交换和资源的正确释放。会话状态机是HSMS实现的核心。
3.4.1 会话状态
HSMS定义了三种基本会话状态:
- 未选择(Not Selected): TCP连接已建立,但尚未完成HSMS Select握手。此时只能收发控制消息(Select.req/rsp)。
- 已选择(Selected): Select握手成功,双方可以收发数据消息和控制消息(如Linktest、Deselect)。
- 已断开(Disconnected): TCP连接已关闭或尚未建立。此时无法进行任何HSMS通信。
3.4.2 状态转换规则
下图展示了HSMS会话状态机的主要转换路径:
3.4.3 会话管理最佳实践
- 超时处理: 建议设置
T3定时器(默认45秒)用于等待回复消息。超时后应重试或断开连接。 - 链路检测: 定期发送
Linktest.req(例如每60秒),若连续3次无响应则判定连接断开。 - 并发控制: 同一TCP连接上,HSMS会话是单线程的。不要同时发送多个未配对的Primary消息,应等待前一个回复后再发下一个。
- 资源清理: 当检测到连接断开时,主机和设备都应立即清理与该会话相关的所有资源(如待发送队列、事务状态)。
3.5 本章小结
HSMS协议通过TCP/IP提供了可靠、高效的SECS-II消息传输通道。理解其物理层依赖、连接建立与断开流程、精确的消息头格式以及会话状态机,是实现稳定GEM通信的基础。在实际开发中,应重点关注超时处理、链路检测和状态转换的正确实现,以确保通信的健壮性。