【问题标题】:Python paho-MQTT connection with azure IoT-HubPython paho-MQTT 与 azure IoT-Hub 的连接
【发布时间】:2021-11-02 14:49:07
【问题描述】:

我正在尝试使用 MQTT 连接 Azure IoT-Hub 并发送和接收消息。

我正在关注here给出的官方文档

但它总是与结果代码断开连接:1,尽管它永远不会进入 on_connect 函数。 但是如果我尝试在函数之外发布它(连接字符串后注释掉的行),它会进入 on_publish 方法。

我在这里使用的设备是我在 Azure IoT Suite 中创建的模拟设备

这是我正在使用的代码

from paho.mqtt import client as mqtt


def on_connect(client, userdata, flags, rc):
    print "Connected with result code: %s" % rc
    client.subscribe("devices/MyTestDevice02/messages/devicebound/#")
    client.publish("devices/MyTestDevice02/messages/events", "Hello World!")


def on_disconnect(client, userdata, rc):
    print "Disconnected with result code: %s" % rc


def on_message(client, userdata, msg):
    print " - ".join((msg.topic, str(msg.payload)))
    client.publish("devices/MyTestDevice02/messages/events", "REPLY", qos=1)


def on_publish(client, userdata, mid):
    print "Sent message"


client = mqtt.Client("MyTestDevice02", mqtt.MQTTv311)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.on_publish = on_publish
client.username_pw_set(username="USERNAME.azure-devices.net/MyTestDevice02",
                       password="SharedAccessSignature=SharedAccessSignature sr=USERNAME.azure-devices.net%2fdevices%2fMyTestDevice02&sig=xxxxxx5rRr7c%3d&se=1492318301")
client.tls_insecure_set(True) # You can also set the proper certificate using client.tls_set()
client.connect("USERNAME.azure-devices.net", port=8883)
#client.publish("devices/MyTestDevice02/messages/events", "Hello World!")
client.loop_forever()

感谢任何帮助。 而且我不想使用 sdk,这就是我尝试直接发布它的原因。

【问题讨论】:

    标签: python azure mqtt mosquitto azure-iot-hub


    【解决方案1】:

    您尚未启用 TLS - 您需要使用 tls_set() 将 CA 证书传递给信任。单独使用 tls_insecure_set() 没有任何作用。

    【讨论】:

    • 谢谢,但我找不到 CA 证书。能否请您指导我完成整个过程,或者可能是解释它的链接。
    • 我已经生成证书并将其与我的 azure 订阅相关联,遵循此 link 在 tls_set() 中,我已经给出了本地计算机中证书位置的路径,它正在抛出错误“证书验证失败”
    【解决方案2】:

    MS TechNet https://social.technet.microsoft.com/Forums/en-US/0c2cc683-c50f-428c-90ca-eeff132ba5e9/python-azure-iot-hub-mqtt-direct-with-basic-library?forum=windowsazuredevelopment 有一个类似的帖子。

    我建议您可以尝试使用其他支持 Azure IoTHub 的语言,例如 Node.js 或 Java。

    同时,您可以参考我在 SO 线程 Python MQTT connection to Azure Iot Hub 中使用 Azure IoTHub 和 Python 的建议,通过使用其他支持语言扩展 Python。

    如有任何疑问,请随时告诉我。

    【讨论】:

    • 谢谢,但第一个链接没有任何问题的答案,第二个你建议使用SDK,我不想这样做,因为SDK很重,我想将代码加载到重量非常轻的机器上,比如内存非常有限的机器。 Azure 已经发布了适用于 python 的 SDK,我可以在 python 中使用它来连接和发送数据。不幸的是,这对我来说不是一个可行的选择。
    • @aladeen 你想支持什么场景?你的重量很轻的机器是什么?众所周知,一些设备有足够的内存来使用 SDK,例如 Raspberry Pi、BeagleBoard,甚至是 Intel Edison。但是,对于 Arduino 以太网或 Arduino Yun,我认为使用 Arduino 的 HTTP 客户端库或 MQTT 客户端库更适合有限的内存。有任何问题,请随时告诉我。
    • @aladeen 使用HTTP REST API,可以参考msdn.microsoft.com/en-us/library/azure/mt548492.aspx
    • 我正在使用 Arduino 以太网
    • 我正在为 adruino 使用 MQTT 客户端库,但通常我无法连接到集线器,正如我在问题中所解释的那样。您能否提供他们使用简单 MQTT 实现这一目标的任何示例。感谢您的努力
    【解决方案3】:

    终于解决了这个问题。 这是设置 tls 的问题,由于某种原因我无法在 python 中做到这一点,所以我使用了 C#,

    这是一个简单的版本。

    client = new MqttClient("MyTestHub.azure-devices.net", 8883, true, MqttSslProtocols.TLSv1_0, null, null);
    byte code = client.Connect("MyDevice1", "MyTestHub.azure-devices.net/MyDevice123","Use My SAS token");
    ushort msgId = client.Publish("devices/MyDevice1/messages/events/", Encoding.UTF8.GetBytes("Test Message"), 1, false);
    

    我为 MQTT 使用了 Nuget 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多