完善了解包分帧的情况,现在测试基本无问题

This commit is contained in:
gitea 2024-06-20 20:48:03 +08:00
parent 14f269b570
commit 8975d8a37c
3 changed files with 58 additions and 73 deletions

View File

@ -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第二帧包含及之后的帧帧长度即是数据长度
> -

View File

@ -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))

View File

@ -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')