2016-04-16 2 views
0

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

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

Но всегда получают отсоединен с кодом результата: 1, хотя он никогда не идет в on_connect функции. Но если я попытаюсь опубликовать его вне функций (прокомментированная строка после строки подключения), она войдет внутрь метода on_publish.

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

ответ

0

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

1

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

+0

Спасибо, но я не могу найти сертификаты CA. Можете ли вы, пожалуйста, пройти через процесс, или может быть ссылка, объясняющая это. – aladeen

+0

Я сгенерировал и связал сертификат с моей подпиской на лазурную подписку, ссылаясь на эту ссылку [https://www.veritas.com/support/en_US/article.TECH217325) И в tls_set() я дал путь к расположение сертификата на моей локальной машине, и он бросает ошибку «проверка сертификата не удалась» – aladeen

0

Существует аналогичная нить из 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 connection to Azure Iot Hub через расширение Python с другими языками поддержки.

Любые проблемы, пожалуйста, не стесняйтесь, дайте мне знать.

+0

Спасибо, но первая ссылка не имеет ответа на вопрос, а во втором вы предлагаете использовать SDK, который я Не хочу, чтобы SDK был тяжелым, и я хочу загрузить код на очень легкую машину, например, что-то, что имеет очень ограниченную память. Azure выпустил SDK для python, и я могу подключать и отправлять данные, используя его в python. К сожалению, это не жизнеспособный вариант для меня. – aladeen

+0

@aladeen Какой сценарий вы хотите поддержать? Какая у вас машина с очень легким весом? Как известно, некоторые устройства имеют достаточно памяти для использования SDK, таких как Raspberry Pi, BeagleBoard, даже Intel Edison. Однако для Arduino Ethernet или Arduino Yun я думаю, что использование клиентской библиотеки HTTP или клиентской библиотеки MQTT для Arduino лучше для ограниченной памяти. Любое беспокойство, пожалуйста, не стесняйтесь, дайте мне знать. –

+0

@aladeen Для использования HTTP REST API вы можете обратиться к https://msdn.microsoft.com/en-us/library/azure/mt548492.aspx. –

Смежные вопросы