文章目录
- 1、消息快
- 1.1、选择 请求
- 1.2、选择响应
- 1.3、取消选择请求
- 1.4、取消选择响应
- 1.5、Linktest 请求
- 1.6、Linktest 响应
- 1.7、拒绝请求
- 1.8、单独请求
- 1.9、数据消息
- 2、 协议
- 2.1、 事件
SEMI E37
HSMS 定义主机和设备之间通过 TCP 协议的通信。 它指定用于启动和终止连接的数据包,检查链路是否仍处于活动状态并传输实际数据。
1、消息快
一个 HSMS 消息 {py:class}secsgem.hsms.HsmsMessage
由一个头部 {py:class}secsgem.hsms.HsmsHeader
和一个块列表 {py:class}secsgem.hsms.HsmsBlock
组成。
它初始化时会有一个数据字段,该字段用于自动生成数据块。
这些数据块是数据字段的一部分,会进行传输。
对于 HSMS 数据而言,在一条消息中只存在一个数据块,因为该消息无需分割。
>>> secsgem.hsms.HsmsMessage(secsgem.hsms.HsmsLinktestReqHeader(2), b"")
HsmsMessage({'header': HsmsLinktestReqHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x05, system:0x00000002, require_response:False}), 'data': ''})
每个头部都有一个系统标识符,用于匹配针对某一请求的响应。
系统标识符是 headers
构造函数的第一个参数。
连接会跟踪系统标识符,可以通过调用 {py:func}
secsgem.hsms.HsmsProtocol.get_next_system_counter
函数来请求一个新的系统标识符。
HSMS 块对象可以通过调用 {py:func}secsgem.hsms.HsmsBlock.encode
函数将自身编码为一个字节数组,该字节数组可以通过 TCP 连接进行传输。
>>> message = secsgem.hsms.HsmsMessage(secsgem.hsms.HsmsLinktestReqHeader(2), b"")
>>> secsgem.common.format_hex(message.blocks[0].encode())
'00:00:00:0a:ff:ff:00:00:00:05:00:00:00:02'
反过来讲,HSMS 块对象可以通过使用 {py:func}secsgem.hsms.HsmsBlock.decode
函数对字节数组进行处理来创建。
>>> secsgem.hsms.HsmsBlock.decode(packetData)
<secsgem.hsms.message.HsmsBlock object at 0x1082c4f80>
对于所有可用的 HSMS 数据包类型,都有从 {py:class}secsgem.hsms.HsmsHeader
继承而来的类:
Type | Class | SType |
---|---|---|
Select Request | {py:class}secsgem.hsms.HsmsSelectReqHeader | 1 |
Select Response | {py:class}secsgem.hsms.HsmsSelectRspHeader | 2 |
Deselect Request | {py:class}secsgem.hsms.HsmsDeselectReqHeader | 3 |
Deselect Response | {py:class}secsgem.hsms.HsmsDeselectRspHeader | 4 |
Linktest Request | {py:class}secsgem.hsms.HsmsLinktestReqHeader | 5 |
Linktest Response | {py:class}secsgem.hsms.HsmsLinktestRspHeader | 6 |
Reject Request | {py:class}secsgem.hsms.HsmsRejectReqHeader | 7 |
Separate Request | {py:class}secsgem.hsms.HsmsSeparateReqHeader | 9 |
Data Message | {py:class}secsgem.hsms.HsmsStreamFunctionHeader | 0 |
1.1、选择 请求
建立 HSMS 通信
>>> secsgem.hsms.HsmsSelectReqHeader(14)
HsmsSelectReqHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x01, system:0x0000000e, require_response:False})
1.2、选择响应
select 请求的结果
>>> secsgem.hsms.HsmsSelectRspHeader(24)
HsmsSelectRspHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x02, system:0x00000018, require_response:False})
1.3、取消选择请求
在断开连接之前关闭 HSMS 通信
>>> secsgem.hsms.HsmsDeselectReqHeader(1)
HsmsDeselectReqHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x03, system:0x00000001, require_response:False})
1.4、取消选择响应
取消选择请求的结果
>>> secsgem.hsms.HsmsDeselectRspHeader(1)
HsmsDeselectRspHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x04, system:0x00000001, require_response:False})
1.5、Linktest 请求
检查 HSMS 连接链接是否正常
>>> secsgem.hsms.HsmsLinktestReqHeader(2)
HsmsLinktestReqHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x05, system:0x00000002, require_response:False})
1.6、Linktest 响应
linktest 请求的结果
>>> secsgem.hsms.HsmsLinktestRspHeader(10)
HsmsLinktestRspHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x06, system:0x0000000a, require_response:False})
1.7、拒绝请求
对不支持的 HSMS 消息的响应
>>> secsgem.hsms.HsmsRejectReqHeader(17, secsgem.hsms.HsmsSType.DESELECT_REQ, 4)
HsmsRejectReqHeader({device_id:0xffff, stream:03, function:04, p_type:0x00, s_type:0x07, system:0x00000011, require_response:False})
1.8、单独请求
立即终止 HSMS 连接
>>> secsgem.hsms.HsmsSeparateReqHeader(17)
HsmsSeparateReqHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x09, system:0x00000011, require_response:False})
1.9、数据消息
秒流和函数消息
>>> secsgem.hsms.HsmsStreamFunctionHeader(22, 1, 1, True, 100)
HsmsStreamFunctionHeader({device_id:0x0064, stream:01, function:01, p_type:0x00, s_type:0x00, system:0x00000016, require_response:True})
2、 协议
{py:class}secsgem.hsms.protocol.HsmsProtocol
类内置了基本的 HSMS 连接处理功能。
它会自动选择和取消选择链路,并定期执行链路测试。
它还会自动回复诸如链路测试之类的来自 HSMS 的请求。
>>> def on_connect(event, data):
... print "Connected"
...
>>> client = secsgem.hsms.HsmsProtocol("10.211.55.33", 5000, False, 0, "test")
>>> client.events.connected += on_connect
>>> client.enable()
Connected
>>> client.protocol.send_linktest_req()
HsmsMessage({'header': HsmsHeader({device_id:0xffff, stream:00, function:00, p_type:0x00, s_type:0x06, system:0x75b78c48, require_response:False}), 'data': ''})
>>> client.disable()
该处理程序具备发送请求和响应以及等待特定响应的功能。
2.1、 事件
可以通过使用 secsgem.common.EventHandler
类来接收事件处理程序所引发的事件。该事件处理程序会发送以下事件:
Event name | Description |
---|---|
connected | Connection was established |
communicating | Connection was selected |
disconnected | Connection was terminated |
For an example on how to use these events see the code fragment above.