Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def dataReceived(self, data):
''' Callback when we receive any data
:param data: The data sent by the client
'''
if _logger.isEnabledFor(logging.DEBUG):
_logger.debug(' '.join([hex(byte2int(x)) for x in data]))
if not self.factory.control.ListenOnly:
self.framer.processIncomingPacket(data, self._execute)
def decode(self, data):
''' Decodes the incoming request
:param data: The data to decode into the address
'''
count, self.records = 1, []
byte_count = byte2int(data[0])
while count < byte_count:
decoded = struct.unpack('>BHHH', data[count:count+7])
response_length = decoded[3] * 2
count += response_length + 7
record = FileRecord(record_length=decoded[3],
file_number=decoded[1], record_number=decoded[2],
record_data=data[count - response_length:count])
if decoded[0] == 0x06: self.records.append(record)
def computeCRC(data):
""" Computes a crc16 on the passed in string. For modbus,
this is only used on the binary serial protocols (in this
case RTU).
The difference between modbus's crc16 and a normal crc16
is that modbus starts the crc value out at 0xffff.
:param data: The data to create a crc16 of
:returns: The calculated CRC
"""
crc = 0xffff
for a in data:
idx = __crc16_table[(crc ^ byte2int(a)) & 0xff]
crc = ((crc >> 8) & 0xff) ^ idx
swapped = ((crc << 8) & 0xff00) | ((crc >> 8) & 0x00ff)
return swapped
def callback(*args):
LOGGER.debug("in callback - {}".format(request.transaction_id))
while True:
waiting = self.stream.connection.in_waiting
if waiting:
data = self.stream.connection.read(waiting)
LOGGER.debug(
"recv: " + " ".join([hex(byte2int(x)) for x in data]))
self.framer.processIncomingPacket(
data,
self._handle_response,
tid=request.transaction_id
)
break
def decode(self, data):
''' Decodes a the response
:param data: The packet data to decode
'''
length = byte2int(data[0])
status = struct.unpack('>H', data[1:3])[0]
self.status = (status == ModbusStatus.Ready)
self.event_count = struct.unpack('>H', data[3:5])[0]
self.message_count = struct.unpack('>H', data[5:7])[0]
self.events = []
for e in range(7, length + 1):
self.events.append(byte2int(data[e]))
def populateHeader(self, data=None):
"""
Try to set the headers `uid`, `len` and `crc`.
This method examines `self._buffer` and writes meta
information into `self._header`. It calculates only the
values for headers that are not already in the dictionary.
Beware that this method will raise an IndexError if
`self._buffer` is not yet long enough.
"""
data = data if data else self._buffer
self._header['uid'] = byte2int(data[0])
func_code = byte2int(data[1])
pdu_class = self.decoder.lookupPduClass(func_code)
size = pdu_class.calculateRtuFrameSize(data)
self._header['len'] = size
self._header['crc'] = data[size - 2:size]
def hexlify_packets(packet):
"""
Returns hex representation of bytestring recieved
:param packet:
:return:
"""
if not packet:
return ''
return " ".join([hex(byte2int(x)) for x in packet])
# --------------------------------------------------------------------------- #
read_min = self.client.framer.recvPacket(min_size)
if len(read_min) != min_size:
raise InvalidMessageReceivedException(
"Incomplete message received, expected at least %d bytes "
"(%d received)" % (min_size, len(read_min))
)
if read_min:
if isinstance(self.client.framer, ModbusSocketFramer):
func_code = byte2int(read_min[-1])
elif isinstance(self.client.framer, ModbusRtuFramer):
func_code = byte2int(read_min[-1])
elif isinstance(self.client.framer, ModbusAsciiFramer):
func_code = int(read_min[3:5], 16)
elif isinstance(self.client.framer, ModbusBinaryFramer):
func_code = byte2int(read_min[-1])
else:
func_code = -1
if func_code < 0x80: # Not an error
if isinstance(self.client.framer, ModbusSocketFramer):
# Ommit UID, which is included in header size
h_size = self.client.framer._hsize
length = struct.unpack(">H", read_min[4:6])[0] - 1
expected_response_length = h_size + length
if expected_response_length is not None:
expected_response_length -= min_size
total = expected_response_length + min_size
else:
expected_response_length = exception_length - min_size
total = expected_response_length + min_size
else:
elif isinstance(self.client.framer, ModbusAsciiFramer):
min_size = 5
elif isinstance(self.client.framer, ModbusBinaryFramer):
min_size = 3
else:
min_size = expected_response_length
read_min = self.client.framer.recvPacket(min_size)
if len(read_min) != min_size:
raise InvalidMessageReceivedException(
"Incomplete message received, expected at least %d bytes "
"(%d received)" % (min_size, len(read_min))
)
if read_min:
if isinstance(self.client.framer, ModbusSocketFramer):
func_code = byte2int(read_min[-1])
elif isinstance(self.client.framer, ModbusRtuFramer):
func_code = byte2int(read_min[-1])
elif isinstance(self.client.framer, ModbusAsciiFramer):
func_code = int(read_min[3:5], 16)
elif isinstance(self.client.framer, ModbusBinaryFramer):
func_code = byte2int(read_min[-1])
else:
func_code = -1
if func_code < 0x80: # Not an error
if isinstance(self.client.framer, ModbusSocketFramer):
# Ommit UID, which is included in header size
h_size = self.client.framer._hsize
length = struct.unpack(">H", read_min[4:6])[0] - 1
expected_response_length = h_size + length
if expected_response_length is not None: