完善了解包分帧的情况,现在测试基本无问题
This commit is contained in:
parent
14f269b570
commit
8975d8a37c
@ -247,5 +247,11 @@ v0.1.6.3(2024/06/18)
|
|||||||
> !!WARNING:目前版本的电机电流程序还支持DriverMaster采集的数据处理,等明确后,将不再支持,也即所有的电机电流数据(工业+协作),都是用诊断曲线来采集
|
> !!WARNING:目前版本的电机电流程序还支持DriverMaster采集的数据处理,等明确后,将不再支持,也即所有的电机电流数据(工业+协作),都是用诊断曲线来采集
|
||||||
|
|
||||||
v0.1.7.0(2024/06/29)
|
v0.1.7.0(2024/06/29)
|
||||||
1. [openapi.py] 初步搭建起框架,完成了新老协议的封包/解包/异步采集日志的操作(未充分测试),其中解包操作未实现分帧的情况,因为暂无适应场景,也无测试实例,而且目前来看,不可能有消息超过文档中返回数据大小定义的上限(65535),故可以暂不做实现
|
1. [openapi.py] 初步搭建起框架,完成了新老协议的封包/解包/异步采集日志的操作(未充分测试,但基本无问题)
|
||||||
2.
|
2.
|
||||||
|
|
||||||
|
> **关于HMI接口**
|
||||||
|
> - 封包解包顺序:帧长度二字节/包长度四字节/协议二字节/预留二字节,\x04\x00:\x00\x00\tR:\x02:\x00
|
||||||
|
> - 帧长度和包长度没有必然关系,单帧的时候是帧长度减去包长度等于6,包长度指的是所有内容的长度
|
||||||
|
> - HMI内部每次发送1024个字节,进行分包,内容长度规则是:第一帧1024-6=1018,第二帧(包含)及之后的帧,帧长度即是数据长度
|
||||||
|
> -
|
@ -24,5 +24,5 @@ hr = openapi.hr
|
|||||||
|
|
||||||
_id = hr.excution('device.get_params')
|
_id = hr.excution('device.get_params')
|
||||||
print(hr.get_from_id(_id))
|
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))
|
# print(hr.get_from_id(_id))
|
||||||
|
@ -5,7 +5,6 @@ import selectors
|
|||||||
import time
|
import time
|
||||||
import binascii
|
import binascii
|
||||||
import sys
|
import sys
|
||||||
import inspect
|
|
||||||
|
|
||||||
|
|
||||||
class HmiRequest(object):
|
class HmiRequest(object):
|
||||||
@ -39,21 +38,12 @@ class HmiRequest(object):
|
|||||||
|
|
||||||
def __header_check(self, index, data):
|
def __header_check(self, index, data):
|
||||||
try:
|
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)
|
_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)
|
_pkg_size = int(binascii.b2a_hex(data[index+2:index+6]).decode(), 16)
|
||||||
print('--------')
|
_protocol = int(binascii.b2a_hex(data[index+6:index+7]).decode(), 16)
|
||||||
_protocol = 2 # int(binascii.b2a_hex(data[index+6:index+7]).decode(), 16)
|
|
||||||
print('--------')
|
|
||||||
_reserved = int(binascii.b2a_hex(data[index+7:index+8]).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}")
|
if _reserved == 0 and _protocol == 2:
|
||||||
print(f"protocol = {_protocol}")
|
|
||||||
print(f"reserved = {_reserved}")
|
|
||||||
if _reserved == 0 and _protocol == 2 and True:
|
|
||||||
return index+8, _frame_size, _pkg_size
|
return index+8, _frame_size, _pkg_size
|
||||||
else:
|
else:
|
||||||
print("数据有误,需要确认")
|
print("数据有误,需要确认")
|
||||||
@ -63,87 +53,89 @@ class HmiRequest(object):
|
|||||||
print("无法读取数据,需要确认")
|
print("无法读取数据,需要确认")
|
||||||
exit(10)
|
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):
|
def __get_response(self, data):
|
||||||
_index = 0
|
_index = 0
|
||||||
while _index < len(data):
|
while _index < len(data):
|
||||||
if self.flag == 0:
|
if self.flag == 0:
|
||||||
print(f"===========index = {_index}")
|
|
||||||
_index, _frame_size, _pkg_size = self.__header_check(_index, data)
|
_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()
|
self.response = data[_index:_index+_pkg_size].decode()
|
||||||
if len(self.c_msg) < 1000:
|
self.__msg_storage(flag=0, response=self.response)
|
||||||
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 += _pkg_size
|
_index += _pkg_size
|
||||||
self.flag = 0
|
self.flag = 0
|
||||||
self.response = ''
|
self.response = ''
|
||||||
self.leftover = 0
|
self.leftover = 0
|
||||||
elif len(data) - _index < _pkg_size:
|
elif _pkg_size > len(data) - _index:
|
||||||
# 说有有分包的情况发生了,需要flag=1的处理
|
# 说有有分包的情况发生了,需要flag=1的处理
|
||||||
self.flag = 1
|
self.flag = 1
|
||||||
self.response = data[_index:].decode()
|
self.response = data[_index:].decode()
|
||||||
self.leftover = _pkg_size - (len(data) - _index)
|
self.leftover = _frame_size - 6 - (len(data) - _index) # 其实就是常量 2
|
||||||
_index += _pkg_size
|
_index += _pkg_size # 也可以换成 break,效果都是退出循环
|
||||||
|
|
||||||
elif self.flag == 1:
|
elif self.flag == 1:
|
||||||
# 处理完之后,将flag重置为0
|
# 处理完之后,将flag重置为0
|
||||||
if self.leftover <= len(data):
|
_index = self.leftover
|
||||||
self.response += data[:self.leftover].decode()
|
self.response += data[:_index].decode()
|
||||||
if len(self.c_msg) < 1000:
|
_index += 2
|
||||||
self.c_msg.insert(0, self.response)
|
|
||||||
else:
|
try:
|
||||||
self.c_msg.insert(0, self.response)
|
_frame_size = int.from_bytes(data[_index-2:_index])
|
||||||
while len(self.c_msg) > 1000:
|
except:
|
||||||
self.c_msg.pop()
|
self.__msg_storage(flag=0, response=self.response)
|
||||||
_index += self.leftover
|
|
||||||
self.flag = 0
|
self.flag = 0
|
||||||
self.response = ''
|
self.response = ''
|
||||||
self.leftover = 0
|
self.leftover = 0
|
||||||
|
break
|
||||||
|
|
||||||
|
if _frame_size == 1024:
|
||||||
|
self.leftover = 1024 - (len(data) - _index)
|
||||||
|
self.response += data[_index:].decode()
|
||||||
|
break
|
||||||
else:
|
else:
|
||||||
_index += self.leftover
|
if _index+_frame_size <= 1024:
|
||||||
self.flag = 1
|
self.response += data[_index:_index+_frame_size].decode()
|
||||||
self.response += data.decode()
|
self.__msg_storage(flag=0, response=self.response)
|
||||||
self.leftover -= len(data)
|
|
||||||
|
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):
|
def __get_response_xs(self, data):
|
||||||
if self.flag_xs == 0:
|
if self.flag_xs == 0:
|
||||||
if data[-1].decode() == '\r':
|
if data[-1].decode() == '\r':
|
||||||
_responses = data.decode().split('\r')
|
_responses = data.decode().split('\r')
|
||||||
for _response in _responses:
|
for _response in _responses:
|
||||||
if len(self.c_msg_xs) < 1000:
|
self.__msg_storage(flag=1, response=_response)
|
||||||
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()
|
|
||||||
else:
|
else:
|
||||||
_responses = data.decode().split('\r')
|
_responses = data.decode().split('\r')
|
||||||
for _response in _responses[:-1]:
|
for _response in _responses[:-1]:
|
||||||
if not _response:
|
if not _response:
|
||||||
break
|
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.response_xs = _responses[-1]
|
||||||
self.flag_xs = 1
|
self.flag_xs = 1
|
||||||
else:
|
else:
|
||||||
if data[-1].decode() == '\r':
|
if data[-1].decode() == '\r':
|
||||||
_responses = (self.response_xs.encode() + data).decode().split('\r')
|
_responses = (self.response_xs.encode() + data).decode().split('\r')
|
||||||
for _response in _responses:
|
for _response in _responses:
|
||||||
if len(self.c_msg_xs) < 1000:
|
self.__msg_storage(flag=1, response=_response)
|
||||||
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 = ''
|
self.response_xs = ''
|
||||||
self.flag_xs = 0
|
self.flag_xs = 0
|
||||||
else:
|
else:
|
||||||
@ -151,13 +143,8 @@ class HmiRequest(object):
|
|||||||
for _response in _responses[:-1]:
|
for _response in _responses[:-1]:
|
||||||
if not _response:
|
if not _response:
|
||||||
break
|
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.response_xs = _responses[-1]
|
||||||
self.flag_xs = 1
|
self.flag_xs = 1
|
||||||
|
|
||||||
@ -207,7 +194,7 @@ class HmiRequest(object):
|
|||||||
def to_read(conn):
|
def to_read(conn):
|
||||||
data = conn.recv(1024) # Should be ready
|
data = conn.recv(1024) # Should be ready
|
||||||
if data:
|
if data:
|
||||||
print(data)
|
# print(data)
|
||||||
self.__get_response_xs(data)
|
self.__get_response_xs(data)
|
||||||
else:
|
else:
|
||||||
print('closing', sock)
|
print('closing', sock)
|
||||||
@ -254,15 +241,7 @@ class HmiRequest(object):
|
|||||||
|
|
||||||
|
|
||||||
hr = HmiRequest()
|
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')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user