20240621
2. [openapi.py] 修改了封包的规则,使之更加明晰,封包操作没有实现分包功能,目前看实际场景用不到 3. [openapi.py] 定义 MAX_FRAME_SIZE 常量(1024),替换socket接收以及响应数据处理相关部分 4. [openapi.py] ʹÓ int.to_bytes ºÍint.from_bytes Ì»» binascii ģ¿é¹¦Ä
This commit is contained in:
		| @@ -248,10 +248,11 @@ v0.1.6.3(2024/06/18) | |||||||
|  |  | ||||||
| v0.1.7.0(2024/06/29) | v0.1.7.0(2024/06/29) | ||||||
| 1. [openapi.py] 初步搭建起框架,完成了新老协议的封包/解包/异步采集日志的操作(未充分测试,但基本无问题) | 1. [openapi.py] 初步搭建起框架,完成了新老协议的封包/解包/异步采集日志的操作(未充分测试,但基本无问题) | ||||||
| 2.  | 2. [openapi.py] 修改了封包的规则,使之更加明晰,封包操作没有实现分包功能,目前看实际场景用不到 | ||||||
|  | 3. [openapi.py] 定义 MAX_FRAME_SIZE 常量(1024),替换socket接收以及响应数据处理相关部分 | ||||||
|  | 4. [openapi.py] 使用 int.to_bytes 和 int.from_bytes 替换 binascii 模块的功能 | ||||||
|  |  | ||||||
| > **关于HMI接口** | > **关于HMI接口** | ||||||
| > - 封包解包顺序:帧长度二字节/包长度四字节/协议二字节/预留二字节,\x04\x00:\x00\x00\tR:\x02:\x00 | > - 封包解包顺序:帧长度二字节/包长度四字节/协议二字节/预留二字节,\x04\x00:\x00\x00\tR:\x02:\x00 | ||||||
| > - 帧长度和包长度没有必然关系,单帧的时候是帧长度减去包长度等于6,包长度指的是所有内容的长度 | > - 帧长度和包长度没有必然关系,单帧的时候是帧长度减去包长度等于6,包长度指的是所有内容的长度 | ||||||
| > - HMI内部每次发送1024个字节,进行分包,内容长度规则是:第一帧1024-6=1018,第二帧(包含)及之后的帧,帧长度即是数据长度 | > - HMI内部每次发送1024个字节,进行分包,内容长度规则是:第一帧1024-6=1018(帧大小减去包头长度),第二帧(包含)及之后的帧,帧长度即是数据长度 | ||||||
| > -  |  | ||||||
|   | |||||||
| @@ -3,10 +3,12 @@ import socket | |||||||
| import threading | import threading | ||||||
| import selectors | import selectors | ||||||
| import time | import time | ||||||
| import binascii |  | ||||||
| import sys | import sys | ||||||
|  |  | ||||||
|  |  | ||||||
|  | MAX_FRAME_SIZE = 1024 | ||||||
|  |  | ||||||
|  |  | ||||||
| class HmiRequest(object): | class HmiRequest(object): | ||||||
|  |  | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
| @@ -34,14 +36,13 @@ class HmiRequest(object): | |||||||
|         self.leftover = 0 |         self.leftover = 0 | ||||||
|         self.flag_xs = 0 |         self.flag_xs = 0 | ||||||
|         self.response_xs = '' |         self.response_xs = '' | ||||||
|         self.leftover_xs = 0 |  | ||||||
|  |  | ||||||
|     def __header_check(self, index, data): |     def __header_check(self, index, data): | ||||||
|         try: |         try: | ||||||
|             _frame_size = int(binascii.b2a_hex(data[index:index+2]).decode(), 16) |             _frame_size = int.from_bytes(data[index:index+2], byteorder='big') | ||||||
|             _pkg_size = int(binascii.b2a_hex(data[index+2:index+6]).decode(), 16) |             _pkg_size = int.from_bytes(data[index+2:index+6], byteorder='big') | ||||||
|             _protocol = int(binascii.b2a_hex(data[index+6:index+7]).decode(), 16) |             _protocol = int.from_bytes(data[index+6:index+7], byteorder='big') | ||||||
|             _reserved = int(binascii.b2a_hex(data[index+7:index+8]).decode(), 16) |             _reserved = int.from_bytes(data[index+7:index+8], byteorder='big') | ||||||
|  |  | ||||||
|             if _reserved == 0 and _protocol == 2: |             if _reserved == 0 and _protocol == 2: | ||||||
|                 return index+8, _frame_size, _pkg_size |                 return index+8, _frame_size, _pkg_size | ||||||
| @@ -79,8 +80,8 @@ class HmiRequest(object): | |||||||
|                     # 说有有分包的情况发生了,需要flag=1的处理 |                     # 说有有分包的情况发生了,需要flag=1的处理 | ||||||
|                     self.flag = 1 |                     self.flag = 1 | ||||||
|                     self.response = data[_index:].decode() |                     self.response = data[_index:].decode() | ||||||
|                     self.leftover = _frame_size - 6 - (len(data) - _index)  # 其实就是常量 2 |                     self.leftover = _frame_size - 6 - (len(data) - _index)  # 其实就是常量 2,其中 6 就是六个字节的包头 | ||||||
|                     _index += _pkg_size  # 也可以换成 break,效果都是退出循环 |                     break | ||||||
|  |  | ||||||
|             elif self.flag == 1: |             elif self.flag == 1: | ||||||
|                 # 处理完之后,将flag重置为0 |                 # 处理完之后,将flag重置为0 | ||||||
| @@ -88,31 +89,30 @@ class HmiRequest(object): | |||||||
|                 self.response += data[:_index].decode() |                 self.response += data[:_index].decode() | ||||||
|                 _index += 2 |                 _index += 2 | ||||||
|  |  | ||||||
|                 try: |                 _frame_size = int.from_bytes(data[_index - 2:_index], byteorder='big') | ||||||
|                     _frame_size = int.from_bytes(data[_index-2:_index]) |                 if _frame_size == 0: | ||||||
|                 except: |  | ||||||
|                     self.__msg_storage(flag=0, response=self.response) |                     self.__msg_storage(flag=0, response=self.response) | ||||||
|                     self.flag = 0 |                     self.flag = 0 | ||||||
|                     self.response = '' |                     self.response = '' | ||||||
|                     self.leftover = 0 |                     self.leftover = 0 | ||||||
|                     break |                     break | ||||||
|  |  | ||||||
|                 if _frame_size == 1024: |                 if _frame_size == MAX_FRAME_SIZE: | ||||||
|                     self.leftover = 1024 - (len(data) - _index) |                     self.leftover = MAX_FRAME_SIZE - (len(data) - _index) | ||||||
|                     self.response += data[_index:].decode() |                     self.response += data[_index:].decode() | ||||||
|                     break |                     break | ||||||
|                 else: |                 else: | ||||||
|                     if _index+_frame_size <= 1024: |                     if _index+_frame_size <= MAX_FRAME_SIZE: | ||||||
|                         self.response += data[_index:_index+_frame_size].decode() |                         self.response += data[_index:_index+_frame_size].decode() | ||||||
|                         self.__msg_storage(flag=0, response=self.response) |                         self.__msg_storage(flag=0, response=self.response) | ||||||
|  |  | ||||||
|                         self.flag = 0 |                         self.flag = 0 | ||||||
|                         self.response = '' |                         self.response = '' | ||||||
|                         self.leftover = 0 |                         self.leftover = 0 | ||||||
|                         break |                         break | ||||||
|                     else: |                     else: | ||||||
|                         self.response += data[_index:].decode() |                         self.response += data[_index:].decode() | ||||||
|                         self.leftover = _index + _frame_size - 1024 |                         self.leftover = _index + _frame_size - MAX_FRAME_SIZE | ||||||
|  |                         break | ||||||
|  |  | ||||||
|     def __get_response_xs(self, data): |     def __get_response_xs(self, data): | ||||||
|         if self.flag_xs == 0: |         if self.flag_xs == 0: | ||||||
| @@ -159,22 +159,20 @@ class HmiRequest(object): | |||||||
|             print(f'无法查询到{msg_id}对应的响应') |             print(f'无法查询到{msg_id}对应的响应') | ||||||
|  |  | ||||||
|     def __package(self, cmd): |     def __package(self, cmd): | ||||||
|         pkg_size = str(hex(len(cmd)+6))[2:].rjust(4, '0') |         _frame_head = (len(cmd)+6).to_bytes(length=2, byteorder='big') | ||||||
|         package = binascii.a2b_hex(pkg_size)      # 包的长度 |         _pkg_head = len(cmd).to_bytes(length=4, byteorder='big') | ||||||
|         reserved = chr(0) + chr(0)                # 保留字段 |         _protocol = int(2).to_bytes(length=1, byteorder='big') | ||||||
|         frame_size = str(hex(len(cmd)))[2:].rjust(4, '0') |         _reserved = int(0).to_bytes(length=1, byteorder='big') | ||||||
|         frame = binascii.a2b_hex(frame_size)      # 帧的长度 |         return _frame_head + _pkg_head + _protocol + _reserved + cmd.encode() | ||||||
|         protocol = chr(2) + chr(0)                # 协议类型 |  | ||||||
|         return package + reserved.encode() + frame + protocol.encode() + cmd.encode() |  | ||||||
|  |  | ||||||
|     def __package_xs(self, cmd): |     def __package_xs(self, cmd): | ||||||
|         return f"{json.dumps(cmd, separators=(',', ':'))}\r".encode() |         return f"{json.dumps(cmd, separators=(',', ':'))}\r".encode() | ||||||
|  |  | ||||||
|     def __unpackage(self, sock): |     def __unpackage(self, sock): | ||||||
|         def to_read(conn): |         def to_read(conn): | ||||||
|             data = conn.recv(1024)  # Should be ready |             data = conn.recv(MAX_FRAME_SIZE) | ||||||
|             if data: |             if data: | ||||||
|                 print(data) |                 # print(data) | ||||||
|                 self.__get_response(data) |                 self.__get_response(data) | ||||||
|             else: |             else: | ||||||
|                 print('closing', sock) |                 print('closing', sock) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user