From 8975d8a37cefc7f6bffed68888c2e489a31f9d33 Mon Sep 17 00:00:00 2001 From: gitea Date: Thu, 20 Jun 2024 20:48:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E8=A7=A3=E5=8C=85?= =?UTF-8?q?=E5=88=86=E5=B8=A7=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E6=B5=8B=E8=AF=95=E5=9F=BA=E6=9C=AC=E6=97=A0=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 8 +- aio/code/automatic_test/do_brake.py | 2 +- aio/code/automatic_test/openapi.py | 121 ++++++++++++---------------- 3 files changed, 58 insertions(+), 73 deletions(-) diff --git a/aio/README.md b/aio/README.md index 9e69418..540a3bb 100644 --- a/aio/README.md +++ b/aio/README.md @@ -247,5 +247,11 @@ v0.1.6.3(2024/06/18) > !!WARNING:目前版本的电机电流程序还支持DriverMaster采集的数据处理,等明确后,将不再支持,也即所有的电机电流数据(工业+协作),都是用诊断曲线来采集 v0.1.7.0(2024/06/29) -1. [openapi.py] 初步搭建起框架,完成了新老协议的封包/解包/异步采集日志的操作(未充分测试),其中解包操作未实现分帧的情况,因为暂无适应场景,也无测试实例,而且目前来看,不可能有消息超过文档中返回数据大小定义的上限(65535),故可以暂不做实现 +1. [openapi.py] 初步搭建起框架,完成了新老协议的封包/解包/异步采集日志的操作(未充分测试,但基本无问题) 2. + +> **关于HMI接口** +> - 封包解包顺序:帧长度二字节/包长度四字节/协议二字节/预留二字节,\x04\x00:\x00\x00\tR:\x02:\x00 +> - 帧长度和包长度没有必然关系,单帧的时候是帧长度减去包长度等于6,包长度指的是所有内容的长度 +> - HMI内部每次发送1024个字节,进行分包,内容长度规则是:第一帧1024-6=1018,第二帧(包含)及之后的帧,帧长度即是数据长度 +> - \ No newline at end of file diff --git a/aio/code/automatic_test/do_brake.py b/aio/code/automatic_test/do_brake.py index f1aef39..3e9bdc9 100644 --- a/aio/code/automatic_test/do_brake.py +++ b/aio/code/automatic_test/do_brake.py @@ -24,5 +24,5 @@ hr = openapi.hr _id = hr.excution('device.get_params') print(hr.get_from_id(_id)) -# _id = hr.excution('state.switch_motor_on') +# _id = hr.excution('state.switch_manual') # print(hr.get_from_id(_id)) diff --git a/aio/code/automatic_test/openapi.py b/aio/code/automatic_test/openapi.py index 9b7f196..271ce73 100644 --- a/aio/code/automatic_test/openapi.py +++ b/aio/code/automatic_test/openapi.py @@ -5,7 +5,6 @@ import selectors import time import binascii import sys -import inspect class HmiRequest(object): @@ -39,21 +38,12 @@ class HmiRequest(object): def __header_check(self, index, data): try: - print(binascii.b2a_hex(data[index:index+2]).decode()) - print(binascii.b2a_hex(data[index+2:index+6]).decode()) - print(binascii.b2a_hex(data[index+6:index+7]).decode()) - print(binascii.b2a_hex(data[index+7:index+8]).decode()) _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) - print('--------') - _protocol = 2 # int(binascii.b2a_hex(data[index+6:index+7]).decode(), 16) - print('--------') + _protocol = int(binascii.b2a_hex(data[index+6:index+7]).decode(), 16) _reserved = int(binascii.b2a_hex(data[index+7:index+8]).decode(), 16) - print(f"frame size = {_frame_size}") - print(f"pkg size = {_pkg_size}") - print(f"protocol = {_protocol}") - print(f"reserved = {_reserved}") - if _reserved == 0 and _protocol == 2 and True: + + if _reserved == 0 and _protocol == 2: return index+8, _frame_size, _pkg_size else: print("数据有误,需要确认") @@ -63,87 +53,89 @@ class HmiRequest(object): print("无法读取数据,需要确认") exit(10) + def __msg_storage(self, response, flag=0): + messages = self.c_msg if flag == 0 else self.c_msg_xs + if len(messages) < 1000: + messages.insert(0, response) + else: + messages.insert(0, response) + while len(messages) > 1000: + messages.pop() + def __get_response(self, data): _index = 0 while _index < len(data): if self.flag == 0: - print(f"===========index = {_index}") _index, _frame_size, _pkg_size = self.__header_check(_index, data) - if len(data) - _index >= _pkg_size: + if _pkg_size <= len(data) - _index: # 说明剩余部分的数据正好就是完整的包数据 self.response = data[_index:_index+_pkg_size].decode() - if len(self.c_msg) < 1000: - self.c_msg.insert(0, self.response) - else: - self.c_msg.insert(0, self.response) - while len(self.c_msg) > 1000: - self.c_msg.pop() + self.__msg_storage(flag=0, response=self.response) _index += _pkg_size self.flag = 0 self.response = '' self.leftover = 0 - elif len(data) - _index < _pkg_size: + elif _pkg_size > len(data) - _index: # 说有有分包的情况发生了,需要flag=1的处理 self.flag = 1 self.response = data[_index:].decode() - self.leftover = _pkg_size - (len(data) - _index) - _index += _pkg_size + self.leftover = _frame_size - 6 - (len(data) - _index) # 其实就是常量 2 + _index += _pkg_size # 也可以换成 break,效果都是退出循环 elif self.flag == 1: # 处理完之后,将flag重置为0 - if self.leftover <= len(data): - self.response += data[:self.leftover].decode() - if len(self.c_msg) < 1000: - self.c_msg.insert(0, self.response) - else: - self.c_msg.insert(0, self.response) - while len(self.c_msg) > 1000: - self.c_msg.pop() - _index += self.leftover + _index = self.leftover + self.response += data[:_index].decode() + _index += 2 + + try: + _frame_size = int.from_bytes(data[_index-2:_index]) + except: + 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) + self.response += data[_index:].decode() + break else: - _index += self.leftover - self.flag = 1 - self.response += data.decode() - self.leftover -= len(data) + if _index+_frame_size <= 1024: + 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 def __get_response_xs(self, data): if self.flag_xs == 0: if data[-1].decode() == '\r': _responses = data.decode().split('\r') for _response in _responses: - if len(self.c_msg_xs) < 1000: - self.c_msg_xs.insert(0, _response) - else: - self.c_msg_xs.insert(0, _response) - while len(self.c_msg_xs) > 1000: - self.c_msg_xs.pop() + self.__msg_storage(flag=1, response=_response) + else: _responses = data.decode().split('\r') for _response in _responses[:-1]: if not _response: break + self.__msg_storage(flag=1, response=_response) - if len(self.c_msg_xs) < 1000: - self.c_msg_xs.insert(0, _response) - else: - self.c_msg_xs.insert(0, _response) - while len(self.c_msg_xs) > 1000: - self.c_msg_xs.pop() self.response_xs = _responses[-1] self.flag_xs = 1 else: if data[-1].decode() == '\r': _responses = (self.response_xs.encode() + data).decode().split('\r') for _response in _responses: - if len(self.c_msg_xs) < 1000: - self.c_msg_xs.insert(0, _response) - else: - self.c_msg_xs.insert(0, _response) - while len(self.c_msg_xs) > 1000: - self.c_msg_xs.pop() + self.__msg_storage(flag=1, response=_response) + self.response_xs = '' self.flag_xs = 0 else: @@ -151,13 +143,8 @@ class HmiRequest(object): for _response in _responses[:-1]: if not _response: break + self.__msg_storage(flag=1, response=_response) - if len(self.c_msg_xs) < 1000: - self.c_msg_xs.insert(0, _response) - else: - self.c_msg_xs.insert(0, _response) - while len(self.c_msg_xs) > 1000: - self.c_msg_xs.pop() self.response_xs = _responses[-1] self.flag_xs = 1 @@ -207,7 +194,7 @@ class HmiRequest(object): def to_read(conn): data = conn.recv(1024) # Should be ready if data: - print(data) + # print(data) self.__get_response_xs(data) else: print('closing', sock) @@ -254,15 +241,7 @@ class HmiRequest(object): hr = HmiRequest() -# id_test = hr.excution('device.get_params') -# time.sleep(2) -# print(hr.c_msg) -# print(hr.get_from_id(id_test)) -# hr.excution('state.switch_manual') -# time.sleep(2) -# hr.excution('state.switch_motor_on') -# time.sleep(2) -# hr.excution('state.switch_motor_off') +