From ff4b0cc04ca7f4db7cc1ceba6269ed36b4817ada Mon Sep 17 00:00:00 2001 From: gitea Date: Fri, 21 Jun 2024 08:13:51 +0800 Subject: [PATCH] =?UTF-8?q?20240621=202.=20[openapi.py]=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BA=86=E5=B0=81=E5=8C=85=E7=9A=84=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E4=B9=8B=E6=9B=B4=E5=8A=A0=E6=98=8E=E6=99=B0?= =?UTF-8?q?=EF=BC=8C=E5=B0=81=E5=8C=85=E6=93=8D=E4=BD=9C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=88=86=E5=8C=85=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E7=9B=AE=E5=89=8D=E7=9C=8B=E5=AE=9E=E9=99=85=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E7=94=A8=E4=B8=8D=E5=88=B0=203.=20[openapi.py]=20=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=20MAX=5FFRAME=5FSIZE=20=E5=B8=B8=E9=87=8F=EF=BC=88102?= =?UTF-8?q?4=EF=BC=89=EF=BC=8C=E6=9B=BF=E6=8D=A2socket=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=93=8D=E5=BA=94=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=9B=B8=E5=85=B3=E9=83=A8=E5=88=86=204.=20[openapi.p?= =?UTF-8?q?y]=20=CA=B9=C3=93=20int.to=5Fbytes=20=C2=BA=C3=8Dint.from=5Fbyt?= =?UTF-8?q?es=20=C3=8C=C2=BB=C2=BB=20binascii=20=C4=A3=C2=BF=C3=A9=C2=B9?= =?UTF-8?q?=C2=A6=C3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 7 +++-- aio/code/automatic_test/openapi.py | 48 ++++++++++++++---------------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/aio/README.md b/aio/README.md index 540a3bb..335924f 100644 --- a/aio/README.md +++ b/aio/README.md @@ -248,10 +248,11 @@ v0.1.6.3(2024/06/18) v0.1.7.0(2024/06/29) 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接口** > - 封包解包顺序:帧长度二字节/包长度四字节/协议二字节/预留二字节,\x04\x00:\x00\x00\tR:\x02:\x00 > - 帧长度和包长度没有必然关系,单帧的时候是帧长度减去包长度等于6,包长度指的是所有内容的长度 -> - HMI内部每次发送1024个字节,进行分包,内容长度规则是:第一帧1024-6=1018,第二帧(包含)及之后的帧,帧长度即是数据长度 -> - \ No newline at end of file +> - HMI内部每次发送1024个字节,进行分包,内容长度规则是:第一帧1024-6=1018(帧大小减去包头长度),第二帧(包含)及之后的帧,帧长度即是数据长度 diff --git a/aio/code/automatic_test/openapi.py b/aio/code/automatic_test/openapi.py index 271ce73..0da6865 100644 --- a/aio/code/automatic_test/openapi.py +++ b/aio/code/automatic_test/openapi.py @@ -3,10 +3,12 @@ import socket import threading import selectors import time -import binascii import sys +MAX_FRAME_SIZE = 1024 + + class HmiRequest(object): def __init__(self): @@ -34,14 +36,13 @@ class HmiRequest(object): self.leftover = 0 self.flag_xs = 0 self.response_xs = '' - self.leftover_xs = 0 def __header_check(self, index, data): try: - _frame_size = int(binascii.b2a_hex(data[index:index+2]).decode(), 16) - _pkg_size = int(binascii.b2a_hex(data[index+2:index+6]).decode(), 16) - _protocol = int(binascii.b2a_hex(data[index+6:index+7]).decode(), 16) - _reserved = int(binascii.b2a_hex(data[index+7:index+8]).decode(), 16) + _frame_size = int.from_bytes(data[index:index+2], byteorder='big') + _pkg_size = int.from_bytes(data[index+2:index+6], byteorder='big') + _protocol = int.from_bytes(data[index+6:index+7], byteorder='big') + _reserved = int.from_bytes(data[index+7:index+8], byteorder='big') if _reserved == 0 and _protocol == 2: return index+8, _frame_size, _pkg_size @@ -79,8 +80,8 @@ class HmiRequest(object): # 说有有分包的情况发生了,需要flag=1的处理 self.flag = 1 self.response = data[_index:].decode() - self.leftover = _frame_size - 6 - (len(data) - _index) # 其实就是常量 2 - _index += _pkg_size # 也可以换成 break,效果都是退出循环 + self.leftover = _frame_size - 6 - (len(data) - _index) # 其实就是常量 2,其中 6 就是六个字节的包头 + break elif self.flag == 1: # 处理完之后,将flag重置为0 @@ -88,31 +89,30 @@ class HmiRequest(object): self.response += data[:_index].decode() _index += 2 - try: - _frame_size = int.from_bytes(data[_index-2:_index]) - except: + _frame_size = int.from_bytes(data[_index - 2:_index], byteorder='big') + if _frame_size == 0: self.__msg_storage(flag=0, response=self.response) self.flag = 0 self.response = '' self.leftover = 0 break - if _frame_size == 1024: - self.leftover = 1024 - (len(data) - _index) + if _frame_size == MAX_FRAME_SIZE: + self.leftover = MAX_FRAME_SIZE - (len(data) - _index) self.response += data[_index:].decode() break else: - if _index+_frame_size <= 1024: + if _index+_frame_size <= MAX_FRAME_SIZE: self.response += data[_index:_index+_frame_size].decode() self.__msg_storage(flag=0, response=self.response) - self.flag = 0 self.response = '' self.leftover = 0 break else: 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): if self.flag_xs == 0: @@ -159,22 +159,20 @@ class HmiRequest(object): print(f'无法查询到{msg_id}对应的响应') def __package(self, cmd): - pkg_size = str(hex(len(cmd)+6))[2:].rjust(4, '0') - package = binascii.a2b_hex(pkg_size) # 包的长度 - reserved = chr(0) + chr(0) # 保留字段 - frame_size = str(hex(len(cmd)))[2:].rjust(4, '0') - frame = binascii.a2b_hex(frame_size) # 帧的长度 - protocol = chr(2) + chr(0) # 协议类型 - return package + reserved.encode() + frame + protocol.encode() + cmd.encode() + _frame_head = (len(cmd)+6).to_bytes(length=2, byteorder='big') + _pkg_head = len(cmd).to_bytes(length=4, byteorder='big') + _protocol = int(2).to_bytes(length=1, byteorder='big') + _reserved = int(0).to_bytes(length=1, byteorder='big') + return _frame_head + _pkg_head + _protocol + _reserved + cmd.encode() def __package_xs(self, cmd): return f"{json.dumps(cmd, separators=(',', ':'))}\r".encode() def __unpackage(self, sock): def to_read(conn): - data = conn.recv(1024) # Should be ready + data = conn.recv(MAX_FRAME_SIZE) if data: - print(data) + # print(data) self.__get_response(data) else: print('closing', sock)