Use struct module to pack net commands, send files with length

The struct module is more efficient than int.to_bytes.
piCtory and ReplaceIO file length in the first 4 bytes of transmission
This commit is contained in:
2020-03-08 20:53:57 +01:00
parent 3f28f0ae48
commit 245a5ac5cf

View File

@@ -5,6 +5,7 @@ import warnings
from configparser import ConfigParser from configparser import ConfigParser
from json import loads as jloads from json import loads as jloads
from re import compile from re import compile
from struct import pack, unpack
from threading import Event, Lock, Thread from threading import Event, Lock, Thread
from revpimodio2 import DeviceNotFoundError from revpimodio2 import DeviceNotFoundError
@@ -27,10 +28,11 @@ _syspictoryh = b'\x01PH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
# ReplaceIO Konfiguration laden # ReplaceIO Konfiguration laden
_sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17' _sysreplaceio = b'\x01RP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
_sysreplaceioh = b'\x01RH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17' _sysreplaceioh = b'\x01RH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17'
# Übertragene Bytes schreiben
_sysflush = b'\x01SD\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x17'
# Hashvalues # Hashvalues
HASH_FAIL = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' HASH_FAIL = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
# Header start/stop
HEADER_START = b'\x01'
HEADER_STOP = b'\x17'
class AclException(Exception): class AclException(Exception):
@@ -272,11 +274,11 @@ class NetFH(Thread):
self._slavesock.sendall(_sysdeldirty) self._slavesock.sendall(_sysdeldirty)
else: else:
# Nur bestimmte Dirtybytes löschen # Nur bestimmte Dirtybytes löschen
self._slavesock.sendall( # b CM ii xx c0000000 b = 16
b'\x01EY' + self._slavesock.sendall(pack(
position.to_bytes(length=2, byteorder="little") + "=c2sH2xc7xc",
b'\x00\x00\xFE\x00\x00\x00\x00\x00\x00\x00\x17' HEADER_START, b'EY', position, b'\xfe', HEADER_STOP
) ))
check = self._slavesock.recv(1) check = self._slavesock.recv(1)
if check != b'\x1e': if check != b'\x1e':
@@ -330,8 +332,11 @@ class NetFH(Thread):
raise ValueError("flush of closed file") raise ValueError("flush of closed file")
with self.__socklock: with self.__socklock:
self.__by_buff += _sysflush # b CM ii ii 00000000 b = 16
self._slavesock.sendall(self.__by_buff) self._slavesock.sendall(pack(
"=c2sHH8xc",
HEADER_START, b'FD', len(self.__by_buff), self.__int_buff, HEADER_STOP
) + self.__by_buff)
# Puffer immer leeren # Puffer immer leeren
self.__int_buff = 0 self.__int_buff = 0
@@ -405,13 +410,11 @@ class NetFH(Thread):
raise TypeError("arg must be <class 'bytes'>") raise TypeError("arg must be <class 'bytes'>")
with self.__socklock: with self.__socklock:
self._slavesock.sendall( # b CM xx ii iiii0000 b = 16
b'\x01IC' + self._slavesock.sendall(pack(
request.to_bytes(length=4, byteorder="little") + "=c2s2xHI4xc",
len(arg).to_bytes(length=2, byteorder="little") + HEADER_START, b'IC', len(arg), request, HEADER_STOP
b'\x00\x00\x00\x00\x00\x00\x17' + ) + arg)
arg
)
# Rückmeldebyte auswerten # Rückmeldebyte auswerten
blockok = self._slavesock.recv(1) blockok = self._slavesock.recv(1)
@@ -435,12 +438,11 @@ class NetFH(Thread):
raise ValueError("read of closed file") raise ValueError("read of closed file")
with self.__socklock: with self.__socklock:
self._slavesock.sendall( # b CM ii ii 00000000 b = 16
b'\x01DA' + self._slavesock.sendall(pack(
self.__position.to_bytes(length=2, byteorder="little") + "=c2sHH8xc",
length.to_bytes(length=2, byteorder="little") + HEADER_START, b'DA', self.__position, length, HEADER_STOP
b'\x00\x00\x00\x00\x00\x00\x00\x00\x17' ))
)
self.__position += length self.__position += length
@@ -476,18 +478,27 @@ class NetFH(Thread):
self._slavesock.sendall(_syspictory) self._slavesock.sendall(_syspictory)
self.__buff_recv.clear() self.__buff_recv.clear()
while not self.__sockend.is_set(): recv_lenght = 4
count = self._slavesock.recv_into(self.__buff_block, self.__buff_size) while recv_lenght > 0:
count = self._slavesock.recv_into(
self.__buff_block, recv_lenght
)
if count == 0: if count == 0:
self.__sockerr.set()
raise IOError("readpictory error on network") raise IOError("readpictory error on network")
self.__buff_recv += self.__buff_block[:count] self.__buff_recv += self.__buff_block[:count]
recv_lenght -= count
if b'\x04' in self.__buff_recv: recv_lenght = unpack("=I", self.__buff_recv)[0]
# Found EndOfText byte while recv_lenght > 0:
break count = self._slavesock.recv_into(
self.__buff_block, min(recv_lenght, self.__buff_size)
)
if count == 0:
raise IOError("readpictory error on network")
self.__buff_recv += self.__buff_block[:count]
recv_lenght -= count
return bytes(self.__buff_recv[:-1]) return bytes(self.__buff_recv[4:])
def readreplaceio(self) -> bytes: def readreplaceio(self) -> bytes:
""" """
@@ -507,18 +518,27 @@ class NetFH(Thread):
self._slavesock.sendall(_sysreplaceio) self._slavesock.sendall(_sysreplaceio)
self.__buff_recv.clear() self.__buff_recv.clear()
while not self.__sockend.is_set(): recv_lenght = 4
count = self._slavesock.recv_into(self.__buff_block, self.__buff_size) while recv_lenght > 0:
count = self._slavesock.recv_into(
self.__buff_block, recv_lenght
)
if count == 0: if count == 0:
self.__sockerr.set()
raise IOError("readreplaceio error on network") raise IOError("readreplaceio error on network")
self.__buff_recv += self.__buff_block[:count] self.__buff_recv += self.__buff_block[:count]
recv_lenght -= count
if b'\x04' in self.__buff_recv: recv_lenght = unpack("=I", self.__buff_recv)[0]
# Found EndOfText byte while recv_lenght > 0:
break count = self._slavesock.recv_into(
self.__buff_block, min(recv_lenght, self.__buff_size)
)
if count == 0:
raise IOError("readpictory error on network")
self.__buff_recv += self.__buff_block[:count]
recv_lenght -= count
return bytes(self.__buff_recv[:-1]) return bytes(self.__buff_recv[4:])
def run(self) -> None: def run(self) -> None:
"""Handler fuer Synchronisierung.""" """Handler fuer Synchronisierung."""
@@ -602,13 +622,11 @@ class NetFH(Thread):
try: try:
self.__socklock.acquire() self.__socklock.acquire()
self._slavesock.sendall( # b CM ii ii 00000000 b = 16
b'\x01EY' + self._slavesock.sendall(pack(
position.to_bytes(length=2, byteorder="little") + "=c2sHH8xc",
len(dirtybytes).to_bytes(length=2, byteorder="little") + HEADER_START, b'EY', position, len(dirtybytes), HEADER_STOP
b'\x00\x00\x00\x00\x00\x00\x00\x00\x17' + ) + dirtybytes)
dirtybytes
)
check = self._slavesock.recv(1) check = self._slavesock.recv(1)
if check != b'\x1e': if check != b'\x1e':
@@ -645,11 +663,11 @@ class NetFH(Thread):
try: try:
self.__socklock.acquire() self.__socklock.acquire()
self._slavesock.sendall( # b CM ii xx 00000000 b = 16
b'\x01CF' + self._slavesock.sendall(pack(
value.to_bytes(length=2, byteorder="little") + "=c2sH10xc",
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17' HEADER_START, b'CF', value, HEADER_STOP
) ))
check = self._slavesock.recv(1) check = self._slavesock.recv(1)
if check != b'\x1e': if check != b'\x1e':
raise IOError("set timeout error on network") raise IOError("set timeout error on network")
@@ -689,10 +707,8 @@ class NetFH(Thread):
self.__int_buff += 1 self.__int_buff += 1
# Datenblöcke mit Group Seperator in Puffer ablegen # Datenblöcke mit Group Seperator in Puffer ablegen
self.__by_buff += b'\x01SD' + \ self.__by_buff += self.__position.to_bytes(length=2, byteorder="little") + \
self.__position.to_bytes(length=2, byteorder="little") + \
len(bytebuff).to_bytes(length=2, byteorder="little") + \ len(bytebuff).to_bytes(length=2, byteorder="little") + \
b'\x1d\x00\x00\x00\x00\x00\x00\x00\x17' + \
bytebuff bytebuff
# TODO: Bufferlänge und dann flushen? # TODO: Bufferlänge und dann flushen?