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:
parent
8975d8a37c
commit
ff4b0cc04c
@ -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