Skip to content

Commit 2096009

Browse files
fix: Solve the index issue of MQTT read message method (#5)
1 parent 17c7c04 commit 2096009

File tree

2 files changed

+50
-55
lines changed

2 files changed

+50
-55
lines changed

core/modules/mqtt.py

Lines changed: 8 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44

55
from core.utils.status import Status
6-
from core.utils.helpers import get_parameter, get_desired_data_from_response
6+
from core.utils.helpers import get_parameter, extract_messages
77

88
class MQTT:
99
"""
@@ -546,43 +546,6 @@ def publish_message(self, payload, topic=None, qos=1, retain=0, message_id=1, ci
546546
return result
547547
return {"response": "Missing parameter", "status": Status.ERROR}
548548

549-
def check_messages(self, cid=0):
550-
"""
551-
Function for receiving MQTT messages.
552-
553-
Parameters
554-
----------
555-
cid : int
556-
MQTT Client ID (range 0:5) (default=0)
557-
558-
Returns
559-
-------
560-
(status, modem_response, buffer_indexes) : tuple
561-
status : int
562-
Status of the command.
563-
modem_response : str
564-
Response of the modem.
565-
buffer_indexes : list
566-
List of indexes of the received messages.
567-
"""
568-
buffer_indexes = []
569-
result = self.atcom.send_at_comm("AT+QMTRECV?","+QMTRECV:")
570-
571-
if result["status"] == Status.SUCCESS:
572-
prefix = f"+QMTRECV: {cid},"
573-
buffer = get_desired_data_from_response(
574-
result["response"],
575-
prefix,
576-
separator=",",
577-
data_index=[0,1,2,3,4]
578-
) or []
579-
580-
for index in buffer:
581-
if index != "" or index is not None:
582-
buffer_indexes.append(int(index))
583-
584-
result["buffer_indexes"] = buffer_indexes
585-
return result
586549

587550
def read_messages(self, cid=0):
588551
"""
@@ -600,25 +563,15 @@ def read_messages(self, cid=0):
600563
Status of the command.
601564
modem_response : str
602565
Response of the modem.
603-
messages : list ["client_idx,message_id,topic,payload_len,payload", ...]
566+
messages : list ["client_idx,topic,payload"]
604567
List of messages.
605568
"""
606569
messages = []
607-
608-
result = self.check_messages(cid)
609-
buffer_indexes = result["buffer_indexes"] or []
570+
result = self.atcom.send_at_comm("AT+QMTRECV?","+QMTRECV:")
610571

611572
if result["status"] == Status.SUCCESS:
612-
for index in buffer_indexes:
613-
if buffer_indexes[index] == 1:
614-
result = self.atcom.send_at_comm(f'AT+QMTRECV={cid},{index}',"OK")
615-
if result["status"] == Status.SUCCESS:
616-
messages.append(result["response"])
617-
618-
result.pop("buffer_indexes")
619-
result["messages"] = messages
620-
return result
621-
else:
622-
result.pop("buffer_indexes")
623-
result["messages"] = messages
624-
return result
573+
prefix = f"+QMTRECV: {cid},"
574+
messages = extract_messages(result["response"], prefix)
575+
576+
result["messages"] = messages
577+
return result

core/utils/helpers.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,48 @@ def write_json_file(file_path, data):
3030
return data
3131

3232

33+
def extract_messages(whole_message, prefix, remove_nones=True):
34+
"""_Function for extracting meaningful messages as an array
35+
from the response of +QMTRECV.
36+
37+
Args:
38+
whole_message (str): The response from the "+QMTRECV" command.
39+
prefix (str): The prefix string for each meaningful message.
40+
remove_nones (bool, optional): Delete None messages. Defaults to True.
41+
42+
Returns:
43+
array: Array of messages arrays.
44+
"""
45+
messages = []
46+
start_pos = 0
47+
end_pos = 0
48+
49+
# Pre-processing the string.
50+
whole_message = whole_message.replace("\r","\n").replace('"','')
51+
52+
while True:
53+
start_pos = whole_message.find(prefix, start_pos)
54+
55+
# If there is no, exit the function.
56+
if start_pos == -1:
57+
return messages
58+
59+
# Find the end
60+
end_pos = whole_message.find("\n", start_pos)
61+
62+
# Extract the non-relational information.
63+
if "0,0,0,0,0,0" not in whole_message[start_pos:end_pos] and remove_nones is True:
64+
# Extract and clean the unformatted string.
65+
message = whole_message[(start_pos + len(prefix)) : end_pos]
66+
message_as_array = message.split(",")
67+
message_as_array[0] = int(message_as_array[0])
68+
# Save it to the array.
69+
messages.append(message_as_array)
70+
71+
# Increase the searching position.
72+
start_pos += len(prefix)
73+
74+
3375
def get_desired_data_from_response(response, prefix, separator="\n", data_index=0):
3476
"""Function for getting actual data from response"""
3577
debug.debug(response)

0 commit comments

Comments
 (0)