与SECS-I同为物理层消息传输协议,HSMS的区别在于使用了TCP/IP来实现协议。TCP/IP在多种场景中相较R - 232均表现更好,因而HSMS被用作SECS-I在高级通信环境中的上位替代。
笔者将以 TCP/IP简述、HSMS消息格式、HSMS状态 以及HSMS消息交换过程这四部分来介绍HSMS。
1. TCP/IP简述
HSMS可以按任何标准 TCP/IP API 进行开发(BSD Socket、TLI 等),并使用标准的 TCP/IP 寻址,默认的端口号 5000(Passive Local)。
1.1 TCP/IP寻址约定
① IP地址:连接到局域网(LAN)的每个物理TCP/IP连接都必须具有唯一的IP地址。IP地址必须在安装时进行可分配,并且HSMS的实现不能选择一个固定的IP地址
② TCP端口:HSMS的实现应该允许将TCP端口配置为所使用的TCP/IP实现的全部范围。
1.2 TCP/IP连接的建立
① 被动建立:
1) 获取一个连接端点,并将其绑定到指定的端口
2) 从端口侦听从远程实体发送的连接请求
3) 在收到连接请求后,确认该请求并表示接受连接
② 主动建立:
1) 获取一个连接端点
2) 向远程实体(被动)所指定的端口发起连接
3) 等待远程实体确认并接受请求
1.3 TCP/IP连接终止
处于连接状态中的任意一个实体都能发起终止连接,但HSMS只允许处于Connected子状态Not Selected(将在HSMS状态部分介绍)时真正终止连接。完成后,实体进入Not Connected状态,HSMS通信结束。
2. HSMS消息格式
2.1 HSMS消息结构
消息构成大致如下表所示:
字节数 |
内容 |
4 Bytes |
Length,用于描述Header和Message的长度 |
10 Bytes |
Message Header |
0-N Bytes |
Message Content(Message内部的数据格式被Header中的Ptype字节规定,例如Ptype==0时,使用SECS-II标准) |
< 1 > Length : 四字节无符号整数,用于指示Message header 以及Message 部分的字节长度。消息长度首先传输最高有效位(MSB),最后传输最低有效位(LSB)。
< 2 > Message Header:
Bytes |
Description |
0-1 |
Session ID(Device ID),用于表示通信实体的连接 |
2 |
根据SType不同,内容不同(Stream Byte),第一位为W-bit |
3 |
根据SType不同,内容不同(Function Byte) |
4 |
PType指示Message的编码格式 |
5 |
SType指示数据内容的类型 |
6-9 |
System Bytes |
该字段长为10字节,各个字节内容如上表所示。
其中PType指示着Message所使用的编码格式(协议):
Value |
Description |
0 |
SECS-II Coding |
1-127 |
Reserved for Subsidiary Standards |
128-255 |
Reserved, Not Use |
其中SType指示着数据内容的类型(数据消息 or 一些特定的控制消息):
Value |
Description |
0 |
Data Message |
1 |
Select.req |
2 |
Select.rsp |
3 |
Deselect.req |
4 |
Deselect.rsp |
5 |
LinkTest.req |
6 |
LinkTest.rsp |
7 |
Reject.req |
8 |
|
9 |
Separate.req |
10 |
|
11-127 |
Reserved for subsidiary standards |
128-255 |
Reserved, not used |
SType值为7 、 9的控制消息无需回复,因此8、10值并未使用。
使用不同SType值的消息样例如下表所示:
Message Header |
|
||||||
Message Type |
Bytes 0-1 |
Byte2 |
Byte 3 |
Byte 4 PType |
Byte 5 SType |
Byte 6-9 System Byte |
Message Text |
Data Message |
* |
W-bit and SECS Stream |
SECS Function |
0 |
0 |
Primary:Unique Reply:Same as primary |
none |
Select.req |
* |
0 |
0 |
0 |
1 |
Unique |
none |
Select.rsp |
Same as req |
0 |
Select Status |
0 |
2 |
Same as req |
none |
Deselect.req |
* |
0 |
0 |
0 |
3 |
Unique |
None |
Deselect.rsp |
Same as req |
0 |
Deselect Status |
0 |
4 |
Same as .req |
None |
LinkTest.req |
0xFFFF |
0 |
0 |
0 |
5 |
Unique |
None |
LinkTest.rsp |
0xFFFF |
0 |
0 |
0 |
6 |
Same as .req |
None |
Reject.req |
Same ad message being rejected |
PType or SType of message being rejected |
Reason Code |
0 |
7 |
Same as message rejected |
None |
Separate.req |
* |
0 |
0 |
0 |
9 |
Unique |
None |
3. HSMS连接状态
与SECS-I类似,为了确保传输可用等,HSMS要求设备在进行消息传输前进行一些类似握手的保障操作。HSMS连接状态由此而生,其内容大致如下图所示。
3.1 各状态定义
Not Connected:实体已准备号侦听或启动TCP/IP连接,但尚未建立任何连接 OR 所有以前建立的TCP/IP连接均已终止。
Connected:设备间已建立一个TCP/IP连接。该状态拥有两个子状态。
Not Selected:尚未建立HSMS会话或先前所有HSMS会话已结束;
Selected:为HSMS的通用操作状态,实体间至少建立了一个HSMS会话,并可在该状态下进行消息交换。
3.2 HSMS状态转换表
HSMS状态转换表描述了设备状态间互相转换的触发条件与执行实体等内容,具体如下表所示。
表2.1HSMS状态转换
当前状态 |
触发条件 |
新状态 |
操作 |
注 |
初始 |
准备建立TCP/IP连接 |
Not Connected |
本地实体专有 |
根据即将发生的被动或主动连接所作的操作 |
Not Connected |
建立HSMS通讯所需TCP/IP连接 |
Connected-Not Selected |
本地实体专有 |
|
Connected-Not Selected |
TCP连接中断 |
Not Connected |
本地实体专有 |
|
Not Selected |
完成HSMS的select过程(参见消息交换部分) |
Selected |
本地实体专有 |
HSMS通信已建立,可用于消息交换 |
Selected |
完成HSMS的Deselect或者Separate过程 (参见消息交换部分) |
Not connected |
本地实体专有 |
这个状态变换通常代表整个HSMS通讯的结束,所以需要立即发起进程断开对应的TCP连接 |
Not Selected |
T7超时 |
Not Connected |
本地实体专有 |
已建立TCP连接却不进行HSMS会话,搁置过久 |
4. HSMS消息交换过程
所有HSMS过程都涉及到HSMS的交换。这些消息以TCP/IP流的形式在先前建立的TCP/IP链路上进行消息的发送与接收。
4.1 Select Procedure
1) Initiator向responding entity发送select.req请求;
2) Responding entity 向Initiator发送Select.rsp 【Select.rsp为0或1,内容取决于该实体是否能够转为Select状态,1能,0不能】;
3) Initiator接收Select.rsp,如果内容为1,则状态转换成功,反之,未发生对应的转换。
4.2 Data Procedure
1)只要连接处于Selected状态,任何一个实体都可以发起HSMS数据消息。当不处于Selected状态时,接收数据消息将以Reject Procedure。
2)在消息事务中,事务的发起者向响应实体发送一条Primary Message。如果Primary Message指示需要响应,则响应实体将发送 Reply Message 响应。
4.3 Deselect Procedure
1) Initiator向responding entity发送deselect.req请求;
2) Responding entity 向Initiator发送deSelect.rsp 【Select.rsp为0或1,内容取决于该实体是否能够转换Deselect状态,0能,非0不能,同时,该步骤也会发生超时情况T6】;
3) Initiator接收Select.rsp,如果内容为0,则状态转换成功,反之,未发生对应的转换。
4.4 Linktest Procedure
1) Initiator向responding entity发送LinkTest.req请求;
2) Responding entity 向Initiator发送Deselect.rsp【该步骤可能发生T6超时】;
3) Initiator接收Select.rsp,测试成功。
4.5 Reject Procedure
1) Initiator向responding entity发送了一条错误消息;
2) Responding entity 向Initiator发送Reject.rsp消息;
3) Initiator接收Reject.rsp,报错。
4.6 Separate Procedure
连接处于Selected状态时,任一实体可通过Separate Producure在断开TCP/IP连接之前突然终止实体的HSMS通信(单方面通知通信终止)。
5. 一些超时事件及其定义
5.1 回复超时T3 - Reply Timeout
定义一个实体等待回复消息的最长时间,如果T3超时则取消这次会话事务但并不断开 TCP/IP 连接。
5.2 连接间隔时间T5 - Connect Separation Time
定义两个连接请求之间的时间间隔。频繁的向一个未准备好连接的实体发起连接请求,会加重 TCP/IP 的操作负荷。因此,当一个主动模式实体发起的连接操作终止后(不论是成功结束还是被远端实体拒绝),该实体必须等待 T5 时间再后发起下一次连接请求。
5.3 控制事务超时T6 - Control Transactions Control Timeout
从发送所需的请求消息到收到响应消息,事务一直被认为是开启的,T6定义了一个控制事务(许多控制消息是消息交换或事务过程的一部分:发送者发送<xx>.req,接收方接收<xx>.req并以<xx>.rsp作为响应。)所能保持开启的最长时间,超过该时间就认为这次通信失败。
在发起控制事务时,本地实体应启动一个持续时间等于T6的计时器。如果事务在计时器到时之前被正确关闭,则应该取消计时器。如果定时器在事务未结束之前就到时了,则该事务应被发起者视为已结束,HSMS通信失败。
5.4 未选择状态超时T7 - Not Selected Timeout
定义当建立了 TCP/IP 连接之后通信处于 Not Selected 状态的最长时间,通信必须在该时间完成 Selected Procedure,否则将会断开 TCP/IP 连接。
5.5 网络字符超时T8 - Network Intercharacter Timeout
定义成功接收到单个HSMS 消息的字符之间的最大时间间隔。
因为TCP/IP是面向流的通信,所以所有作为单个HSMS消息的一部分的字节可能在单独的TCP/IP消息中传输,一个HSMS 通信消息可能被分为若干个 TCP/IP 消息进行传输。若 T8 超时则认为这次传输失败。
下一节:半导体基础SECS协议(SECS - II)