10000 Process multiple messages from single response · blynkkk/lib-python@f4a3caa · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on May 7, 2025. It is now read-only.

Commit f4a3caa

Browse files
committed
Process multiple messages from single response
1 parent b2cc4f5 commit f4a3caa

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

blynklib_mp.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def _pack_msg(self, msg_type, *args, **kwargs):
7070

7171
def parse_response(self, rsp_data, msg_buffer):
7272
msg_args = []
73+
msg_tail = b''
7374
try:
7475
msg_type, msg_id, h_data = struct.unpack('!BHH', rsp_data[:self.MSG_HEAD_LEN])
7576
except Exception as p_err:
@@ -83,9 +84,10 @@ def parse_response(self, rsp_data, msg_buffer):
8384
elif msg_type in (self.MSG_HW, self.MSG_BRIDGE, self.MSG_INTERNAL, self.MSG_REDIRECT):
8485
msg_body = rsp_data[self.MSG_HEAD_LEN: self.MSG_HEAD_LEN + h_data]
8586
msg_args = [itm.decode('utf-8') for itm in msg_body.split(b'\0')]
87+
msg_tail = rsp_data[self.MSG_HEAD_LEN + h_data:]
8688
else:
8789
raise BlynkError("Unknown message type: '{}'".format(msg_type))
88-
return msg_type, msg_id, h_data, msg_args
90+
return msg_type, msg_id, h_data, msg_args, msg_tail
8991

9092
def heartbeat_msg(self, heartbeat, rcv_buffer):
9193
return self._pack_msg(self.MSG_INTERNAL, 'ver', __version__, 'buff-in', rcv_buffer, 'h-beat', heartbeat,
@@ -214,7 +216,7 @@ def _authenticate(self):
214216
rsp_data = self.receive(self.rcv_buffer, self.SOCK_MAX_TIMEOUT)
215217
if not rsp_data:
216218
raise BlynkError('Auth stage timeout')
217-
msg_type, _, status, args = self.parse_response(rsp_data, self.rcv_buffer)
219+
msg_type, _, status, args, _ = self.parse_response(rsp_data, self.rcv_buffer)
218220
if status != self.STATUS_OK:
219221
if status == self.STATUS_INVALID_TOKEN:
220222
raise BlynkError('Invalid Auth Token')
@@ -229,7 +231,7 @@ def _set_heartbeat(self):
229231
rcv_data = self.receive(self.rcv_buffer, self.SOCK_MAX_TIMEOUT)
230232
if not rcv_data:
231233
raise BlynkError('Heartbeat stage timeout')
232-
_, _, status, _ = self.parse_response(rcv_data, self.rcv_buffer)
234+
_, _, status, _, _ = self.parse_response(rcv_data, self.rcv_buffer)
233235
if status != self.STATUS_OK:
234236
raise BlynkError('Set heartbeat returned code={}'.format(status))
235237
self.log('Heartbeat = {} sec. MaxCmdBuffer = {} bytes'.format(self.heartbeat, self.rcv_buffer))
@@ -353,8 +355,9 @@ def read_response(self, timeout=0.5):
353355
rsp_data = self.receive(self.rcv_buffer, self.SOCK_TIMEOUT)
354356
if rsp_data:
355357
self._last_rcv_time = ticks_ms()
356-
msg_type, msg_id, h_data, msg_args = self.parse_response(rsp_data, self.rcv_buffer)
357-
self.process(msg_type, msg_id, h_data, msg_args)
358+
while rsp_data:
359+
msg_type, msg_id, h_data, msg_args, rsp_data = self.parse_response(rsp_data, self.rcv_buffer)
360+
self.process(msg_type, msg_id, h_data, msg_args)
358361

359362
def run(self):
360363
if not self.connected():

0 commit comments

Comments
 (0)
0