Python2 против Python3 - разбор JSON - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь читать сообщения MQTT, используя Python. В целях отладки я уменьшил программу до минимума.

import paho.mqtt.client as mqtt
import json

def on_connect(client, userdata, flags, rc):
    print("Connected with code  " + str(rc))
    client.subscribe("temperature")

def on_message(client, userdata, message):
    if message.topic == "temperature":
        print("New message received")        
        dhtreadings_json = json.loads(message.payload)
        temperature = dhtreadings_json['temperature']
        print(temperature)

mqttc = mqtt.Client()
mqttc.username_pw_set("user","password")                  
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.connect("192.168.1.133",1883,60)
mqttc.loop_forever()

Под Python 2 все отлично работает:

Output in Python2

В Python3 я получил сообщение об установлении соединения, и мне сообщили, что получено новое сообщение, и это все. Больше этого нет другого выхода после:

Output in Python3

Среда: Последняя версия Raspbian на Raspberry Pi 3B +

Как и предполагалось, я заменил на печать («Новое сообщение получено», message.payload). Message.payload одинаков в Python2 и Python3.

python2:

Print message.payload in Python2

Python3:

Print message.payload in Python3

Спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Это будет потому, что в Python3 message.payload является байтовым массивом, а в Python2 - строкой. (это можно увидеть на изображениях, которые вы разместили, потому что строки Python3 обрабатываются с b'...)

Изменение заключается в том, чтобы приблизиться к спецификации MQTT, которая рассматривает все полезные нагрузки MQTT как просто байты набора, а также не делает никаких предположений о том, какой набор символов следует использовать для преобразования полезной нагрузки в строку.

Следующее должно работать с Python3 (при условии, что исходный json закодирован в utf-8)

dhtreadings_json = json.loads(message.payload.decode("utf-8"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...