Python paho MQTT与azure IoT集线器的连接

Python paho MQTT与azure IoT集线器的连接,python,azure,mqtt,mosquitto,azure-iot-hub,Python,Azure,Mqtt,Mosquitto,Azure Iot Hub,我正在尝试使用MQTT连接Azure IoT Hub并发送和接收消息 我遵循给出的官方文件 但它总是与结果代码1断开连接,尽管它从未进入on_connect函数。 但是如果我试图在函数之外发布它(连接字符串后面的注释行),它将进入on_publish方法内部 我在这里使用的设备是我在Azure IoT套件中创建的模拟设备 这是我正在使用的代码 from paho.mqtt import client as mqtt def on_connect(client, userdata, flags

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

我遵循给出的官方文件

但它总是与结果代码1断开连接,尽管它从未进入on_connect函数。 但是如果我试图在函数之外发布它(连接字符串后面的注释行),它将进入on_publish方法内部

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

这是我正在使用的代码

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,这就是我试图直接发布它的原因。

您尚未启用TLS-您需要使用
TLS\u set()
将CA证书传递给信任方。单独使用
tls\u unsecure\u set()
没有任何作用。

您尚未启用tls-您需要使用
tls\u set()
将CA证书传递给信任方。单独使用
tls\u unsecure\u set()
没有任何作用。

MS TechNet也有类似的线程

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

同时,您可以参考我的建议,通过使用其他支持语言扩展Python,在SO线程中将Azure IoTHub与Python结合使用


如有任何问题,请随时通知我。

MS TechNet也有类似的线程

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

同时,您可以参考我的建议,通过使用其他支持语言扩展Python,在SO线程中将Azure IoTHub与Python结合使用


如有任何问题,请随时通知我。

最终解决了问题。 这是设置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的库。

最终解决了这个问题。 这是设置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的库。

谢谢,但我找不到CA证书。请您引导我完成这个过程,或者是解释它的链接。我已经生成了证书并将其与我的azure订阅相关联,在tls_set()中,我已经给出了证书在我的本地计算机中的位置的路径,它正在抛出错误“证书验证失败”谢谢,但是我找不到CA证书。请您引导我完成这个过程,或者是解释它的链接。我已经生成了证书并将其与我的azure订阅相关联,在tls_set()中,我已经给出了证书在我的本地计算机中的位置的路径,它正在抛出错误“证书验证失败”谢谢,但是第一个链接没有任何问题的答案,在第二个链接中,你建议使用SDK,我不想这样做,因为SDK很重,我想将代码加载到一台非常轻的机器上,就像内存非常有限的机器一样。Azure已经发布了python SDK,我可以在python中使用它连接和发送数据。不幸的是,这对我来说不是一个可行的选择。@aladeen您想支持什么场景?你的超轻机器是什么?众所周知,一些设备有足够的内存来使用SDK,例如Raspberry Pi、BeagleBoard,甚至Intel Edison。然而,对于Arduino以太网或Arduino云,我认为对Arduino使用HTTP客户机库或MQTT客户机库更适合有限的内存。任何问题,请随时通知我。@aladeen关于使用HTTP REST API,您可以参考。我正在使用Arduino EthernetI我正在使用adruino的MQTT客户端库,但一般来说,我无法连接到集线器,正如我在问题中解释的那样。您能否提供他们使用简单MQTT实现这一点的任何示例。谢谢你的努力谢谢,但是第一个链接没有任何关于这个问题的答案,在第二个链接中,你建议使用SDK,我不想这样做,因为SDK很重,我想把代码加载到一个非常轻的机器上,比如内存非常有限的机器上。Azure已经发布了python SDK,我可以在python中使用它连接和发送数据。不幸的是,这对我来说不是一个可行的选择。@aladeen您想支持什么场景?你的超轻机器是什么?众所周知,一些设备有足够的内存来使用SDK,例如Raspberry Pi、BeagleBoard,甚至Intel Edison。然而,对于Arduino以太网或Arduino云,我认为对Arduino使用HTTP客户机库或MQTT客户机库更适合有限的内存。任何问题,请随时通知我。@aladeen关于使用HTTP REST API,您可以参考。我正在使用Arduino EthernetI我正在使用adruino的MQTT客户端库,但一般来说,我无法连接到集线器,正如我在问题中解释的那样。您能否提供他们使用简单MQTT实现这一点的任何示例。谢谢你的努力