msg.payload.split завершается с ошибкой для mqtt в python. Как исправить? - PullRequest
0 голосов
/ 14 февраля 2020

Я создал класс MQTT. Он подключается нормально и публикует сообщение «Онлайн» при подключении. Однако что-то не так с методом on_message, так как он запускается, но застревает при разделении полезной нагрузки

class mqtt_function():
    def __init__(self):
        self.mqttc = mqtt.Client()
        # MQTT settings here
        self.mqttc.loop_forever()
    def on_connect(self, client, userdata,flags, rc):
        message = "connected with rc: " + str(rc)
        self.mqttc.subscribe(self.topic, 2)
        print("subscribed to ", self.topic)
        self.mqttc.publish(self.topicStatus, "Online", 1, True)
    def on_message(self, client, obj, msg):
        print("on_message method started")
        print(msg.payload)
        info = msg.payload.split(",")
        print("message was split")

возвращает

subscribed to commands/home
on_message method started
b'60,1581638400'

Ожидание: msg.payload.split должен был отделить полезное сообщение через запятую в список с именем info. Однако этого не происходит.

1 Ответ

0 голосов
/ 14 февраля 2020

Проблема заключается в понимании формата msg.payload.

Хотя print (msg.payload) возвращает читаемый текст, msg.payload - это не строка, а код ASCII. После преобразования msg.payload из ASCII в строку можно использовать функцию .split. Вот рабочее преобразование для полезной нагрузки mqtt.

    def on_message(self, client, obj, msg):
        characters = [chr(ascii) for ascii in msg.payload] # Convert ASCII to char
        chars_joined = ''.join(characters) # Join chars to a string
        received_message = chars_joined.split(",")     # Split string by comma
...