2016-04-16 16 views
0

Ich versuche, mit Azure IoT-Hub mit MQTT zu verbinden und Nachrichten zu senden und zu empfangen.Python paho-MQTT-Verbindung mit azurem IoT-Hub

Ich verfolge die offizielle Dokumentation gegeben here

Aber es immer mit Code die Verbindung unterbrochen wird: 1, obwohl sie nie in der on_connect Funktion geht. Aber wenn ich versuche, es außerhalb der Funktionen (die auskommentierte Zeile nach der Verbindungszeichenfolge) zu veröffentlichen, geht es in die Methode on_publish.

Die deivce ich hier bin mit einem simulierten Gerät, das ich in der Azure IoT Suite erstellt

Hier wird der Code I

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() 

bin mit Jeder Hilfe sehr geschätzt wird. Und ich möchte nicht die SDK verwenden, weshalb ich versuche, es direkt zu veröffentlichen.

Antwort

0

Endlich das Problem gelöst. Es war das Problem mit der Einstellung Tls und ich konnte das nicht in Python aus irgendeinem Grund, so habe ich C#,

Hier ist eine einfache Version davon.

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); 

benutzte ich Nuget Bibliothek für MQTT.

1

Sie haben TLS nicht aktiviert - Sie müssen tls_set() verwenden, um die CA-Zertifikate als vertrauenswürdig zu übergeben. Die Verwendung von tls_insecure_set() alleine macht nichts.

+0

Vielen Dank, aber ich kann die CA-Zertifikate nicht finden. Können Sie mich bitte durch den Prozess führen, oder Link sein, der es erklärt. – aladeen

+0

Ich habe das Zertifikat mit meinem Azure-Abonnement erstellt und verknüpft, nachdem ich dieses [link] (https://www.veritas.com/support/de_DE/article.TECH217325) Und in der tls_set() habe ich den Pfad angegeben der Ort des Zertifikats in meinem lokalen Rechner und es wirft den Fehler "Zertifikat Überprüfung fehlgeschlagen" – aladeen

0

Es gibt einen ähnlichen Thread von 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.

Ich schlage vor, dass Sie versuchen können, andere Unterstützungssprachen für Azure IoTHub wie Node.js oder Java zu verwenden.

In der Zwischenzeit können Sie auf meinen Vorschlag für die Verwendung von Azure IoTHub mit Python im SO-Thread Python MQTT connection to Azure Iot Hub über die Erweiterung von Python mit anderen Support-Sprachen verweisen.

Jede Sorge, bitte zögern Sie nicht, lassen Sie es mich wissen.

+0

Vielen Dank, aber der erste Link hat keine Antwort für die Frage, und in der zweiten Sie vorschlagen, das SDK, das ich verwenden nicht wollen, da das SDK schwer ist und ich den Code auf eine sehr leichte Maschine laden möchte, wie etwas, das sehr begrenzten Speicher hat. Azure hat SDK für Python veröffentlicht und ich kann Daten verbinden und senden, indem ich es in Python benutze. Leider ist das keine praktikable Option für mich. – aladeen

+0

@aladeen Welches Szenario möchten Sie unterstützen? Was ist Ihre sehr leichte Maschine? Wie bekannt, haben einige Geräte genug Speicher für die Verwendung des SDK, wie Raspberry Pi, BeagleBoard, sogar Intel Edison. Für Arduino Ethernet oder Arduino Yun halte ich jedoch die Verwendung der HTTP-Client-Bibliothek oder der MQTT-Client-Bibliothek für Arduino für begrenzten Speicher für besser. Jede Sorge, bitte zögern Sie nicht mich wissen zu lassen. –

+0

@aladeen Zur Verwendung der HTTP-REST-API können Sie auf https://msdn.microsoft.com/en-us/library/azure/mt548492.aspx verweisen. –