Соединение Python paho-MQTT с Azure IoT-Hub

Я пытаюсь подключиться к Azure IoT-Hub с помощью MQTT и отправлять и получать сообщения.

Я следую официальной документации, приведенной здесь

Но он всегда отключается с кодом результата: 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, поэтому я пытаюсь опубликовать его напрямую.


person aladeen    schedule 16.04.2016    source источник


Ответы (3)


Вы не включили TLS - вам нужно использовать tls_set(), чтобы передать сертификаты CA в доверительное управление. Использование tls_insecure_set() само по себе ничего не дает.

person ralight    schedule 16.04.2016
comment
Спасибо, но я не могу найти сертификаты ЦС. Не могли бы вы провести меня через процесс, или может быть ссылка, объясняющая это. - person aladeen; 18.04.2016
comment
Я сгенерировал сертификат и связал его с моей подпиской на Azure, следуя этой ссылке. tls_set (), я указал путь к местоположению сертификата на моем локальном компьютере, и он выдает ошибку проверки сертификата. - person aladeen; 18.04.2016

Есть похожая ветка из 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.

Между тем, вы можете сослаться на мое предложение по использованию Azure IoTHub с Python в потоке SO Подключение Python MQTT к Azure Iot Hub путем расширения Python с помощью других языков поддержки.

Если возникнут какие-либо вопросы, пожалуйста, дайте мне знать.

person Peter Pan    schedule 19.04.2016
comment
Спасибо, но по первой ссылке нет ответа на вопрос, а во второй вы предлагаете использовать SDK, чего я не хочу, так как SDK тяжелый, и я хочу загрузить код с очень легким весом. машина, вроде то у которой очень ограниченная память. Azure выпустила SDK для Python, и я могу подключаться и отправлять данные, используя его в Python. К сожалению, для меня это не вариант. - person aladeen; 19.04.2016
comment
@aladeen Какой сценарий вы хотите поддержать? Какая у вас очень легкая машина? Как известно, у некоторых устройств достаточно памяти для использования SDK, например Raspberry Pi, BeagleBoard, даже Intel Edison. Однако для Arduino Ethernet или Arduino Yun я думаю, что использование клиентской библиотеки HTTP или клиентской библиотеки MQTT для Arduino лучше при ограниченной памяти. Если возникнут какие-либо вопросы, пожалуйста, дайте мне знать. - person Peter Pan; 19.04.2016
comment
@aladeen Для использования HTTP REST API вы можете обратиться к msdn.microsoft. ru / en-us / library / azure / mt548492.aspx. - person Peter Pan; 19.04.2016
comment
Я использую Arduino Ethernet - person aladeen; 19.04.2016
comment
Я использую клиентскую библиотеку MQTT для adruino, но в целом я не могу подключиться к концентратору, как я объяснил в своем вопросе. Не могли бы вы привести какой-нибудь пример, в котором они достигли этого с помощью простого MQTT. Спасибо за попытку - person aladeen; 19.04.2016
comment
@aladeen У меня есть только образец кода для использования REST API в Python для отправки с устройства на- облачное сообщение. Я не думаю, что Python может работать на Arduino Ethernet. Я предлагаю вам попробовать использовать простой HTTP-клиент для C / Arduino. - person Peter Pan; 19.04.2016
comment
Спасибо. Да, python не может быть запущен на Arduino, но концепция остается такой же, как и в части MQTT. - person aladeen; 19.04.2016
comment
Могу ли я просмотреть сообщения, отправленные на хаб, в пакете iot ?? - person aladeen; 19.04.2016
comment
@aladeen Похоже, вы можете получить эти сообщения из IoTHub для просмотра. Есть обновления? - person Peter Pan; 13.05.2016
comment
@ peter-pan-msft Да, я могу получать сообщения в IoTHub, отправляя их по HTTP, но мне все равно не повезло с mqtt - person aladeen; 13.05.2016

Наконец решил проблему. Это была проблема с настройкой 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);

Я использовал библиотеку Nuget для MQTT.

person aladeen    schedule 16.05.2016