Py学习  »  Python

python 3 paho mqtt发布/订阅的json消息将不解析

bipster • 4 年前 • 426 次点击  

新人在这里。

我有一个简单的python代码,它应该订阅一个主题,并使用mqtt协议将json负载发布到同一个主题。但由于某些原因,我无法将负载加载为json!

我在这里做错什么了?

# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import json
mqtt_broker      = '192.168.1.111'
mqtt_topic_one   = 'mqtt_topic/tops_one'
mqtt_topic_two   = 'mqtt_topic/tops_two'

json_data_1      = '''{
    "this_json": "info",
    "data": {
        "multi_keyval": {
            "1": "1",
            "5": "5",
            "15": "15"
        },
        "single_keyval": {
            "single_key": "200"
        }
    }
}'''


def pass_to_func_and_pub(data_to_pub):
    print(data_to_pub)                # --------> This PRINTS
    print(json.loads(data_to_pub))    # --------> This DOES NOT PRINT

    # The following two lines don't work either.
    unpacked_json = json.loads(data_to_pub)
    client.publish(mqtt_topic_two, unpacked_json['this_json'])


def on_connect(client, userdata, flags, rc):
    client.subscribe(mqtt_topic_one)
    client.publish(mqtt_topic_one, json_data_1)


def on_message(client, userdata, msg):
    pass_to_func_and_pub(str(msg.payload))

client = mqtt.Client()

client.on_connect = on_connect
client.on_message = on_message

client.connect(mqtt_broker)
try:
    client.loop_forever()
except KeyboardInterrupt:
    client.disconnect()
    print('MQTT client disconnected, exiting now.')
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41267
 
426 次点击  
文章 [ 1 ]  |  最新文章 4 年前
declension miku
Reply   •   1 楼
declension miku    5 年前

这里有几个问题。

1。异常处理

你没有处理异常(paho实际上在处理程序中忽略了它们,我想是为了让客户机保持活力)。这意味着当 投掷 json.loads(data_to_pub) ,您从未看到此消息,但函数已退出,因为没有本地 except 块。

改进版

def pass_to_func_and_pub(data_to_pub):
    print("Raw data: ", data_to_pub)
    try:
        unpacked_json = json.loads(data_to_pub)
    except Exception as e:
        print("Couldn't parse raw data: %s" % data_to_pub, e)
    else:
        print("JSON:", unpacked_json)
        client.publish(mqtt_topic_two, unpacked_json['this_json'])

等等,什么例外?

运行此改进版本,我们现在可以看到:

Couldn't parse raw data: b'{\n "this_json": "info",\n "data": {\n "multi_keyval": {\n "1": "1",\n "5": "5",\n "15": "15"\n },\n "single_keyval": {\n "single_key": "200"\n }\n }\n}' Expecting value: line 1 column 1 (char 0)

嗯,那是什么 b' 在那里干什么?

2。编码问题

基本上你的问题归结为一条线

def on_message(client, userdata, msg):
    pass_to_func_and_pub(str(msg.payload))

通过呼叫 str payload 其中 MqttMessage , 哪个是 bytes 对象 在Python3中,您将得到这些字节的字符串化版本,例如。 b'foobar' .

这个 b ,当然,现在使其无效的json,因此 Expecting value: line 1 column 1 (char 0)

固定版本

不要打电话 STR ! Json.loads can handle bytes too . 所以:

def on_message(client, userdata, msg):
    pass_to_func_and_pub(msg.payload)

或者,假设使用utf-8编码,我们可以更明确地执行此操作(我更喜欢使用字符串):

def on_message(client, userdata, msg):
    pass_to_func_and_pub(msg.payload.decode('utf-8'))

希望能有帮助!