文章目錄
- 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.