From f4a3caa0b5c62c7981455dc9b8f2ca98f980bfcd Mon Sep 17 00:00:00 2001 From: icetomcat Date: Tue, 12 Jan 2021 23:57:05 +0700 Subject: [PATCH 1/2] Process multiple messages from single response --- blynklib_mp.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/blynklib_mp.py b/blynklib_mp.py index 6d30af3..9f44a86 100644 --- a/blynklib_mp.py +++ b/blynklib_mp.py @@ -70,6 +70,7 @@ def _pack_msg(self, msg_type, *args, **kwargs): def parse_response(self, rsp_data, msg_buffer): msg_args = [] + msg_tail = b'' try: msg_type, msg_id, h_data = struct.unpack('!BHH', rsp_data[:self.MSG_HEAD_LEN]) except Exception as p_err: @@ -83,9 +84,10 @@ def parse_response(self, rsp_data, msg_buffer): elif msg_type in (self.MSG_HW, self.MSG_BRIDGE, self.MSG_INTERNAL, self.MSG_REDIRECT): msg_body = rsp_data[self.MSG_HEAD_LEN: self.MSG_HEAD_LEN + h_data] msg_args = [itm.decode('utf-8') for itm in msg_body.split(b'\0')] + msg_tail = rsp_data[self.MSG_HEAD_LEN + h_data:] else: raise BlynkError("Unknown message type: '{}'".format(msg_type)) - return msg_type, msg_id, h_data, msg_args + return msg_type, msg_id, h_data, msg_args, msg_tail def heartbeat_msg(self, heartbeat, rcv_buffer): return self._pack_msg(self.MSG_INTERNAL, 'ver', __version__, 'buff-in', rcv_buffer, 'h-beat', heartbeat, @@ -214,7 +216,7 @@ def _authenticate(self): rsp_data = self.receive(self.rcv_buffer, self.SOCK_MAX_TIMEOUT) if not rsp_data: raise BlynkError('Auth stage timeout') - msg_type, _, status, args = self.parse_response(rsp_data, self.rcv_buffer) + msg_type, _, status, args, _ = self.parse_response(rsp_data, self.rcv_buffer) if status != self.STATUS_OK: if status == self.STATUS_INVALID_TOKEN: raise BlynkError('Invalid Auth Token') @@ -229,7 +231,7 @@ def _set_heartbeat(self): rcv_data = self.receive(self.rcv_buffer, self.SOCK_MAX_TIMEOUT) if not rcv_data: raise BlynkError('Heartbeat stage timeout') - _, _, status, _ = self.parse_response(rcv_data, self.rcv_buffer) + _, _, status, _, _ = self.parse_response(rcv_data, self.rcv_buffer) if status != self.STATUS_OK: raise BlynkError('Set heartbeat returned code={}'.format(status)) self.log('Heartbeat = {} sec. MaxCmdBuffer = {} bytes'.format(self.heartbeat, self.rcv_buffer)) @@ -353,8 +355,9 @@ def read_response(self, timeout=0.5): rsp_data = self.receive(self.rcv_buffer, self.SOCK_TIMEOUT) if rsp_data: self._last_rcv_time = ticks_ms() - msg_type, msg_id, h_data, msg_args = self.parse_response(rsp_data, self.rcv_buffer) - self.process(msg_type, msg_id, h_data, msg_args) + while rsp_data: + msg_type, msg_id, h_data, msg_args, rsp_data = self.parse_response(rsp_data, self.rcv_buffer) + self.process(msg_type, msg_id, h_data, msg_args) def run(self): if not self.connected(): From d42468b1742c98179d4b84c56dc20228586a8a8f Mon Sep 17 00:00:00 2001 From: icetomcat Date: Fri, 15 Jan 2021 23:34:30 +0700 Subject: [PATCH 2/2] Process multiple messages from single response --- blynklib_mp.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/blynklib_mp.py b/blynklib_mp.py index 9f44a86..46f8897 100644 --- a/blynklib_mp.py +++ b/blynklib_mp.py @@ -70,9 +70,10 @@ def _pack_msg(self, msg_type, *args, **kwargs): def parse_response(self, rsp_data, msg_buffer): msg_args = [] - msg_tail = b'' + msg_len = 0 try: msg_type, msg_id, h_data = struct.unpack('!BHH', rsp_data[:self.MSG_HEAD_LEN]) + msg_len = self.MSG_HEAD_LEN + h_data except Exception as p_err: raise BlynkError('Message parse error: {}'.format(p_err)) if msg_id == 0: @@ -82,12 +83,11 @@ def parse_response(self, rsp_data, msg_buffer): elif msg_type in (self.MSG_RSP, self.MSG_PING): pass elif msg_type in (self.MSG_HW, self.MSG_BRIDGE, self.MSG_INTERNAL, self.MSG_REDIRECT): - msg_body = rsp_data[self.MSG_HEAD_LEN: self.MSG_HEAD_LEN + h_data] + msg_body = rsp_data[self.MSG_HEAD_LEN: msg_len] msg_args = [itm.decode('utf-8') for itm in msg_body.split(b'\0')] - msg_tail = rsp_data[self.MSG_HEAD_LEN + h_data:] else: raise BlynkError("Unknown message type: '{}'".format(msg_type)) - return msg_type, msg_id, h_data, msg_args, msg_tail + return msg_type, msg_id, h_data, msg_args, msg_len def heartbeat_msg(self, heartbeat, rcv_buffer): return self._pack_msg(self.MSG_INTERNAL, 'ver', __version__, 'buff-in', rcv_buffer, 'h-beat', heartbeat, @@ -356,8 +356,9 @@ def read_response(self, timeout=0.5): if rsp_data: self._last_rcv_time = ticks_ms() while rsp_data: - msg_type, msg_id, h_data, msg_args, rsp_data = self.parse_response(rsp_data, self.rcv_buffer) + msg_type, msg_id, h_data, msg_args, msg_len = self.parse_response(rsp_data, self.rcv_buffer) self.process(msg_type, msg_id, h_data, msg_args) + rsp_data = rsp_data[msg_len:] def run(self): if not self.connected():