【问题标题】:Python Paho MQTT og IBM Watson IoTPython Paho MQTT 和 IBM Watson IoT
【发布时间】:2017-10-10 10:49:44
【问题描述】:

我正在尝试使用 Python 2.7 和 Paho MQTT 1.3.1 将 JSON 数据推送到 IBM Watson IoT 平台。

它可以与 IBM 的 Github 的 IoT Python 客户端配合使用,但我的设备环境不允许此扩展。

我在测试时禁用了 IBM Watson IoT 中的 TLS 加密。

这是我的代码:

import json
import paho.mqtt.client as mqtt

client = mqtt.Client('d:ORG-ID:DEVICE-TYPE:DEVICE-ID')

client.username_pw_set('use-token-auth', 'TOKEN')
client.connect('ORG-ID.messaging.internetofthings.ibmcloud.com', 1883, 60)

payload = { 'temperature': 20 }
client.publish('iot-2/evt/test/fmt/json', json.dumps(payload))

client.disconnect()

我没有收到错误,我的 IBM Watson IoT 仪表板确实显示:

Connected on Tuesday, October 10, 2017 at 12:42:26 PM from MY-IP with an insecure connection

但是数据没有显示出来……

【问题讨论】:

    标签: python ibm-cloud mqtt paho


    【解决方案1】:

    您需要运行 MQTT 网络循环以确保在发布之后和断开连接之前发送数据。有几种方法可以做到这一点。

    最简单的就是在发布和断开调用之间添加client.loop()调用:

    import json
    import paho.mqtt.client as mqtt
    
    client = mqtt.Client('d:ORG-ID:DEVICE-TYPE:DEVICE-ID')
    
    client.username_pw_set('use-token-auth', 'TOKEN')
    client.connect('ORG-ID.messaging.internetofthings.ibmcloud.com', 1883, 60)
    
    payload = { 'temperature': 20 }
    client.publish('iot-2/evt/test/fmt/json', json.dumps(payload))
    
    client.loop()
    
    client.disconnect()
    

    另一种是使用一次性发布调用,一次完成连接、发布和断开连接。

    single(topic, payload=None, qos=0, retain=False, hostname="localhost",
    port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,
    protocol=mqtt.MQTTv311)
    

    有关单发方法的完整详细信息,请参见文档here

    【讨论】:

      【解决方案2】:

      您需要更改有效载荷格式,如下所示

      payload = {'d':{'temperature':20}}
      

      【讨论】: