【问题标题】:How to publish json data on mqtt broker in python?如何在 python 中在 mqtt 代理上发布 json 数据?
【发布时间】:2017-03-11 06:11:18
【问题描述】:

我正在尝试在 MQTT 代理主题上发布 JSON 数据。这是源代码,我试过了-

import paho.mqtt.client as mqtt
import json
# Define Variables
MQTT_HOST = "localhost"
MQTT_PORT = 1883
MQTT_KEEPALIVE_INTERVAL = 45
MQTT_TOPIC = "irisPayload"

MQTT_MSG=json.dumps({"sepalLength": "6.4","sepalWidth":  "3.2","petalLength": "4.5","petalWidth":  "1.5"});
# Define on_publish event function
def on_publish(client, userdata, mid):
    print "Message Published..."
# Initiate MQTT Client
mqttc = mqtt.Client()

# Register publish callback function
mqttc.on_publish = on_publish

# Connect with MQTT Broker
mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)        

# Publish message to MQTT Broker    
mqttc.publish(MQTT_TOPIC,MQTT_MSG)

# Disconnect from MQTT_Broker
mqttc.disconnect()

我只想发布不带 payload={jsondata} 格式的 JSON 数据,当我发布特定主题的数据时,如何删除每次收到的有效负载?

在日志中它显示这样的消息--- [payload={ "sepalLength": "6.4", "sepalWidth": "3.2", "petalLength": "4.5", "petalWidth": "1.5" } ]

【问题讨论】:

  • 您在哪里遇到了 'payload={jsondata}format' 的数据?
  • 在日志中它显示我的数据为 payload={"sepalLength": "6.4","sepalWidth": "3.2","petalLength": "4.5","petalWidth": "1.5 "}.
  • 我很确定“问题”出在您设置的代理方面以及您的代理的正常行为(无论您使用哪个)

标签: python mqtt paho


【解决方案1】:

我为您的代码添加了一些修改,然后您可以将 json 发布为字符串,然后接收字符串并转换为 json。

示例代码:

import paho.mqtt.client as mqtt
import json
# Define Variables
MQTT_HOST = "localhost"
MQTT_PORT = 1883
MQTT_KEEPALIVE_INTERVAL = 45
MQTT_TOPIC = "irisPayload"

MQTT_MSG=json.dumps({"sepalLength": "6.4","sepalWidth":  "3.2","petalLength": "4.5","petalWidth":  "1.5"});
# Define on_publish event function
def on_publish(client, userdata, mid):
    print "Message Published..."

def on_connect(client, userdata, flags, rc):
    client.subscribe(MQTT_TOPIC)
    client.publish(MQTT_TOPIC, MQTT_MSG)

def on_message(client, userdata, msg):
    print(msg.topic)
    print(msg.payload) # <- do you mean this payload = {...} ?
    payload = json.loads(msg.payload) # you can use json.loads to convert string to json
    print(payload['sepalWidth']) # then you can check the value
    client.disconnect() # Got message then disconnect

# Initiate MQTT Client
mqttc = mqtt.Client()

# Register publish callback function
mqttc.on_publish = on_publish
mqttc.on_connect = on_connect
mqttc.on_message = on_message

# Connect with MQTT Broker
mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)

# Loop forever
mqttc.loop_forever()

【讨论】:

    【解决方案2】:
    data = {"sepalLength": "6.4","sepalWidth":  "3.2","petalLength": "4.5","petalWidth":  "1.5"}
    print json.dumps(data)
    

    打印:

    {"sepalLength": "6.4","sepalWidth": "3.2","petalLength": "4.5","petalWidth": "1.5"}

    不是:

    payload={"sepalLength": "6.4","sepalWidth": "3.2","petalLength": "4.5","petalWidth": "1.5"}

    您在其他地方有一个描述该有效负载的操纵字符串 将不需要的密钥添加到消息中

    【讨论】:

    • @Asoul,是的,我正在谈论这个。 print(msg.payload) #
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多