@@ -70,8 +70,10 @@ def _pack_msg(self, msg_type, *args, **kwargs):
70
70
71
71
def parse_response (self , rsp_data , msg_buffer ):
72
72
msg_args = []
73
+ msg_len = 0
73
74
try :
74
75
msg_type , msg_id , h_data = struct .unpack ('!BHH' , rsp_data [:self .MSG_HEAD_LEN ])
76
+ msg_len = self .MSG_HEAD_LEN + h_data
75
77
except Exception as p_err :
76
78
raise BlynkError ('Message parse error: {}' .format (p_err ))
77
79
if msg_id == 0 :
@@ -81,11 +83,11 @@ def parse_response(self, rsp_data, msg_buffer):
81
83
elif msg_type in (self .MSG_RSP , self .MSG_PING ):
82
84
pass
83
85
elif msg_type in (self .MSG_HW , self .MSG_BRIDGE , self .MSG_INTERNAL , self .MSG_REDIRECT ):
84
- msg_body = rsp_data [self .MSG_HEAD_LEN : self . MSG_HEAD_LEN + h_data ]
86
+ msg_body = rsp_data [self .MSG_HEAD_LEN : msg_len ]
85
87
msg_args = [itm .decode ('utf-8' ) for itm in msg_body .split (b'\0 ' )]
86
88
else :
87
89
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_len
89
91
90
92
def heartbeat_msg (self , heartbeat , rcv_buffer ):
91
93
return self ._pack_msg (self .MSG_INTERNAL , 'ver' , __version__ , 'buff-in' , rcv_buffer , 'h-beat' , heartbeat ,
@@ -214,7 +216,7 @@ def _authenticate(self):
214
216
rsp_data = self .receive (self .rcv_buffer , self .SOCK_MAX_TIMEOUT )
215
217
if not rsp_data :
216
218
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 )
218
220
if status != self .STATUS_OK :
219
221
if status == self .STATUS_INVALID_TOKEN :
220
222
raise BlynkError ('Invalid Auth Token' )
@@ -229,7 +231,7 @@ def _set_heartbeat(self):
229
231
rcv_data = self .receive (self .rcv_buffer , self .SOCK_MAX_TIMEOUT )
230
232
if not rcv_data :
231
233
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 )
233
235
if status != self .STATUS_OK :
234
236
raise BlynkError ('Set heartbeat returned code={}' .format (status ))
235
237
self .log ('Heartbeat = {} sec. MaxCmdBuffer = {} bytes' .format (self .heartbeat , self .rcv_buffer ))
@@ -353,8 +355,10 @@ def read_response(self, timeout=0.5):
353
355
rsp_data = self .receive (self .rcv_buffer , self .SOCK_TIMEOUT )
354
356
if rsp_data :
355
357
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 , msg_len = self .parse_response (rsp_data , self .rcv_buffer )
360
+ self .process (msg_type , msg_id , h_data , msg_args )
361
+ rsp_data = rsp_data [msg_len :]
358
362
359
363
def run (self ):
360
364
if not self .connected ():
0 commit comments