继《一文搞懂SECS/GEM(一)》继续补充
HSMS (High-Speed SECS Message Services)属于传输协议标准,描述数据是如何通过物理层在设备与主机之间进行传输的。HSMS定义了使用 TCP/IP 为物理传输媒质时的通信接口。HSMS 可以作为 SECS-I以及其他一些高级通信环境的替代,HSMS 又包括了两个子标准,分别是:
HSMS-SS 对母标准中的操进行了简化,以便于实际应用。HSMS-GS 定义了使用 HSMS 访问多个子实体的操作。
HSMS可以使用任何标准 TCP/IP API 进行开发。使用标准的 TCP/IP 寻址,默认的端口号为 5000。
*好,总结一下,其实它就是个TCP通信,只不过它规定了1种消息格式、2种连接模式、4种状态、5个计时器和6种消息类型,通过这些东西完成状态的转化和消息的通信,下文对这些内容做依次讲解
HSMS将通信实体分为两种,Passive Mode(被动模式)和 Active Mode(主动模式)。
建立连接的过程如下图所示:
Passive Mode(被动模式)建立连接过程:
Active Mode(主动模式)建立连接过程:
这6类消息细分的话又分成两类,Data Message是数据消息,其他的都是HSMS的控制消息
Select Procedure用于在TCP/IP连接上建立HSMS通信。
Select.req和Select.rsp消息:是实体由 Not Selected 状态转换为 Selected 状态所使用的消息 。
Initiator(发起方)的发起过程:
Responding Entity(回应方)的响应过程:
同时进行的Select Procedure:如果附加标准没有限制,则有可能两个实体同时启动具有相同控制标识的Select Procedure。在这种情况下,每个实体将通过使用Select.rsp响应来接受其他实体的选择请求。
只要连接处于Selected状态,任何一个实体都可以发起HSMS数据消息。当不处于Selected状态时,接收数据消息将导致Reject Procedure。
数据消息可以进一步定义为消息事务的一部分,即Primary Message 或 Reply Message。
发起者向响应实体发送一条Primary Message。如果Primary Message指示需要响应,则响应实体将发送 Reply Message 响应。
下图为两种类型的消息事务:
消息的具体内容由应用层确定,并服从其他标准(例如,使用SECS-II编码消息的GEM设备的E5和E30)。
适用的上层标准由消息类型来标识。该类型由HSMS定义的特定格式确定。HSMS消息的正常类型是SECS-II文本。
Delesect Procedure用于在断开TCP/IP连接之前,为一个实体提供一个优雅的HSMS通信终止;
HSMS要求使用该Procedure时连接处于Selected状态;
Deselect.req/Deselect.rsp在双方协议终止通信时使用,发起通信终止的一端发送Deselect.req。
Initiator的发起过程:
Responding Entity的响应过程:
同时进行的Select Procedure:如果附加标准没有限制,则有可能两个实体同时启动具有相同控制标识的Select Procedure。在这种情况下,每个实体将通过使用Select.rsp响应来接受其他实体的选择请求。
Linktest Procedure 用于确定TCP/IP和HSMS通信的完整性。只要连接处于Selected状态,可以随时使用。
Linktest.req/Linktest.rsp:用于通信状态的确认, 如果没有应答则转换为Not Connected 状态;
Initiator的发起过程:
Responding Entity的响应过程:
Separate Producure用于在断开TCP/IP连接之前突然终止实体的HSMS通信。
HSMS要求使用该Procedure时连接处于Selected状态。
Separate.req:在单方面通知通信终止时发送;
Reject Procedure用于响应在不适当的上下文中收到的其他有效的HSMS消息,即接收到消息的接收方不支持该消息或认为无效的消息;
Recject.req:在收到无效消息时发送。
状态说明:
NOT CONNECTED:开始监听,但尚未建立任何连接或以前建立的TCP/IP连接都已终止;
CONNECTED:已建立了一个TCP/IP连接。此状态有两个子状态——NOT SELECTED 和 SELECTED;
NOT SELECTED:没有建立HSMS会话或先前建立的HSMS会话已结束;
SELECTED:至少建立了一个HSMS会话,这是HSMS的通常状态,数据消息可以在此状态下进行交换。
Message Length:一个4字节的无符号整数,表示其后Message Header加上Message Text的总字节数,其最小值为10字节。
Message Header:消息头的长度固定为10字节,格式如下图所示:
0 | upper Session ID |
---|---|
1 | lower Session ID |
2 | Header Byte 2 |
3 | Header Byte 3 |
4 | PType |
5 | SType |
6~9 | System Bytes |
Session ID:又叫Device ID,是16位无符号整数。用于标识通信实体的连接;此外,对于有回复的消息,ReplyMessage 的 Session ID 应与其对应回复的PrymaryMessage的Session ID相同。
Header Byte 2:对于不同的HSMS消息,有不同的取值,参考如下表格:
消息类型 | Header Byte 2 | 说明 |
---|---|---|
Data Message | W-bit and SECS Stream | DataMeaages的Head Byte2由高1位的W-bit和低7位的SECS Stream组成。 W-Bit:指示Primary Message是否需要Reply Message,期望应答则设置为1,不期望应答则设置为0。Reply Message应该始终将W-bit设置为0。 SECS Stream:是一个7位无符号整数值,位于低阶7位(第6-0位)。SECS Stream表示消息的一个主题,它的使用在SEMIE5(SECS-II)中定义。 |
Select.req | 0 | |
Select.rsp | 0 | |
Deselect.req | 0 | |
Deselect.rsp | 0 | |
Linktest.req | 0 | |
Linktest.rsp | 0 | |
Reject.req | PType or SType | 如果不支持PType,该位设置成被拒绝的消息的PType。否则,设置成被拒绝的消息中的SType的值 |
Separate.req | 0 |
Header Byte 3:对于不同的HSMS消息,有不同的取值,参考如下表格:
消息类型 | Header Byte 3 | 说明 |
---|---|---|
Data Message | SECS Function | SECS Function:功能是一个8位的无符号整数值,用于标识消息的一个次要话题,偶数是Primary消息,奇数是Replay消息。它的使用以及和Stream的关系在SEMIE5(SECS-II)中定义。 |
Select.req | 0 | |
Select.rsp | Seclect Status | 0 - Select操作成功; 1 - 通信已激活。之前的Select已经操作成功过了 2 - 连接未就绪。连接尚未准备好接受Select请求。 3 - 连接已用光。该连接已被接受,但该实体已在为一个单独的TCP/IP连接提供服务,并且无法在任何给定时间为多个连接提供服务。 4~127 - 子标准保留 128~255 - 保留,未使用 |
Deselect.req | 0 | |
Deselect.rsp | Deseclect Status | 0 - 通信结束,Deselect操作成功 1 - 通信未建立。HSMS通信尚未通过选择建立,或先前Deselect已经操作成功过了。 2 - 通信繁忙。会话仍在由响应实体使用,因此它还不能优雅地放弃会话。在这种情况下,如果请求者一定要终止通信的话,则应使用Separate.req。 3~127 - 子标准保留 128~255 - 保留,未使用 |
Linktest.req | 0 | |
Linktest.rsp | 0 | |
Reject.req | Reason Code | 1 - 收到的SType不支持 2 - 收到的PType不支持 3 - 交易未打开。当没有对应的未处理的请求消息时,收到响应控制消息。例如:发送方发送了Select.req后,收到了两条Select.rsp,对于第一条Select.rsp正常处理,对于第二条Select.rsp就回应Reject.req,Reason Code为3 4 - 未处于SELECTED状态时收到一条数据消息 5~127 - 子标准保留 128~255 - 保留,未使用 |
Separate.req | 0 |
PType:表示类型(Presentation Type),8位无符号整型,使用枚举表示层消息类型,即MessageHeader和MessageText是如何编码的,取值如下:
取值 | 描述 |
---|---|
0 | SECS-II 编码 |
1~127 | 子标准保留 |
128~255 | 保留,未使用 |
SType:会话类型(Session Type),8位无符号整数,表示此消息是何类消息,取值类型如下表:
取值 | 描述 |
---|---|
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 | 子标准保留 |
128~255 | 保留,未使用 |
System Bytes:四字节无符号整数,用于唯一标识一次消息交互,一定要具备唯一性。此外,ReplyMessage 的 SystemBytes 应与其对应回复的PrymaryMessage的SystemBytes相同。
Message Test:消息文本。格式由Message Header的PType字段决定。
下表总结了6种消息的Message Header(清晰明了,重点看一下!)如下:
计时器 | 名字 | 范围 | 建议值 | 描述 |
---|---|---|---|---|
T3 | 回复超时(Reply Timeout) | 1~120s | 45s | 一个实体等待回复消息的最长时间,如果T3超时则取消这次会话事务但不断开 TCP/IP 连接 |
T5 | 连接间隔时间(Connect SeparationTimeout) | 1~240s | 10s | 定义两个连接请求之间的时间间隔。 频繁的向一个未准备好连接的实体发起连接请求,会加重 TCP/IP 的操作负荷。因此,当一个主动模式实体发起的连接操作终止后(不论是成功结束还是被远端实体拒绝),该实体必须等待 T5 时间再后发起下一次连接请求。 |
T6 | 控制会话超时(Transaction Timeout) | 1~240s | 5s | 定义了一个控制事务所能保持开启的最长时间,超过该时间就认为这次通信失败。 当发送.req控制信息时T6计时器开启,若在T6超时之前收到了响应的.rsp消息则计时器关闭,否则控制消息的发起者将关闭这次会话,并认为出现一个通信故障 |
T7 | Not Select状态超时(Not Select Timeout) | 1~240s | 10s | 表示当建立了 TCP/IP 连接之后通信处于 Not Selected 状态的最长时间,通信必须在该时间完成 Selecte操作,否则将会断开 TCP/IP 连接 |
T8 | 网络字符超时(Network Intercharacter Timeout) | 1~120s | 5s | 表示成功接收到单个HSMS消息的字符之间的最大时间间隔。由于TCP/IP时面向流的通信协议,因此一个HSMS通信消息可能被分为若干个TCP/IP消息进行传送,若T8计时器超时则认为这次传输失败。 |
注:计时器数值的最小分辨率是1秒,不能使用小数
以上这些,基于工作经验和SECS标准手册整理而来,由问题和纰漏请多多指正,感谢~~~