社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

bipster • 4 年前 • 428 次点击  

新人在这里。

我有一个简单的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
 
428 次点击  
文章 [ 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'))

希望能有帮助!