Senden von C2D-Nachrichten mit IoT Hub (Python)
Azure IoT Hub ist ein vollständig verwalteter Dienst, der eine zuverlässige und sichere bidirektionale Kommunikation zwischen Millionen von Geräten und einem Lösungs-Back-End ermöglicht.
In diesem Artikel lernen Sie Folgendes:
Senden von Cloud-zu-Gerät (C2D)-Nachrichten von Ihrem Lösungs-Back-End an ein einzelnes Gerät über IoT Hub
Empfangen von Cloud-zu-Gerät-Nachrichten auf einem Gerät
Hinweis
Die in diesem Artikel beschriebenen Features stehen nur im Standard-Tarif von IoT Hub zur Verfügung. Weitere Informationen zu den IoT Hub-Tarifen „Basic“ und „Standard/Free“ finden Sie unter Wählen des richtigen IoT Hub-Tarifs für Ihre Lösung.
Am Ende dieses Artikels führen Sie zwei Python-Konsolen-Apps aus:
SimulatedDevice.py: Simuliert ein Gerät, das eine Verbindung mit Ihrem IoT-Hub herstellt und Cloud-zu-Gerät-Nachrichten empfängt.
SendCloudToDeviceMessage.py: sendet Cloud-zu-Gerät-Nachrichten über IoT Hub an die simulierte Geräte-App.
Weitere Informationen zu Cloud-zu-Gerät-Nachrichten finden Sie unter Senden von Cloud-zu-Gerät-Nachrichten von einem IoT-Hub.
Hinweis
IoT Hub bietet durch die Azure IoT-Geräte-SDKs Unterstützung für zahlreiche Geräteplattformen und Sprachen, (C, Java, Python und JavaScript).
Voraussetzungen
Ein aktives Azure-Konto. (Wenn Sie nicht über ein Konto verfügen, können Sie in nur wenigen Minuten ein kostenloses Konto erstellen.)
Einen IoT Hub. Erstellen Sie einen mit der CLI oder dem Azure-Portal.
Ein registriertes Gerät. Registrieren Sie eins im Azure-Portal.
Empfohlen wird Python, Version 3.7 oder höher. Stellen Sie je nach Einrichtung sicher, dass die 32-Bit- bzw. die 64-Bit-Installation verwendet wird. Fügen Sie Python Ihrer plattformspezifischen Umgebungsvariablen hinzu, wenn Sie während der Installation dazu aufgefordert werden.
Stellen Sie sicher, dass der Port 8883 in Ihrer Firewall geöffnet ist. Das Beispielgerät in diesem Artikel verwendet das MQTT-Protokoll, das über Port 8883 kommuniziert. In einigen Netzwerkumgebungen von Unternehmen oder Bildungseinrichtungen ist dieser Port unter Umständen blockiert. Weitere Informationen und Problemumgehungen finden Sie unter Herstellen einer Verbindung mit IoT Hub (MQTT).
Empfangen von Nachrichten in der simulierten Geräte-App
In diesem Abschnitt erstellen Sie eine Python-Konsolen-App zum Simulieren eines Geräts und empfangen Cloud-zu-Gerät-Nachrichten vom IoT Hub.
Installieren Sie über eine Eingabeaufforderung in Ihrem Arbeitsverzeichnis das Azure IoT Hub Device SDK für Python:
pip install azure-iot-device
Erstellen Sie in einem Text-Editor eine Datei namens SimulatedDevice.py.
Fügen Sie am Anfang der Datei SimulatedDevice.py die folgenden
import
-Anweisungen und -Variablen hinzu:import time from azure.iot.device import IoTHubDeviceClient RECEIVED_MESSAGES = 0
Fügen Sie der Datei SimulatedDevice.py dann folgenden Code hinzu. Ersetzen Sie den Platzhalterwert „
{deviceConnectionString}
“ durch die Verbindungszeichenfolge für das registrierte Gerät unter Voraussetzungen:CONNECTION_STRING = "{deviceConnectionString}"
Definieren Sie die folgende Funktion, die verwendet wird, um empfangene Nachrichten an der Konsole auszugeben:
def message_handler(message): global RECEIVED_MESSAGES RECEIVED_MESSAGES += 1 print("") print("Message received:") # print data from both system and application (custom) properties for property in vars(message).items(): print (" {}".format(property)) print("Total calls received: {}".format(RECEIVED_MESSAGES))
Fügen Sie den folgenden Code hinzu, um den Client zu initialisieren und auf den Empfang der C2D-Nachricht zu warten:
def main(): print ("Starting the Python IoT Hub C2D Messaging device sample...") # Instantiate the client client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING) print ("Waiting for C2D messages, press Ctrl-C to exit") try: # Attach the handler to the client client.on_message_received = message_handler while True: time.sleep(1000) except KeyboardInterrupt: print("IoT Hub C2D Messaging device sample stopped") finally: # Graceful exit print("Shutting down IoT Hub Client") client.shutdown()
Fügen Sie die folgende main-Funktion hinzu:
if __name__ == '__main__': main()
Speichern und schließen Sie die Datei SimulatedDevice.py.
Ausführlichere Informationen zum Lebenszyklus von Cloud-zu-Gerät-Nachrichten und zur Weise, in der IoT Hub Cloud-zu-Gerät-Nachrichten verarbeitet, finden Sie unter Senden von C2D-Nachrichten von einem IoT Hub.
Abrufen der IoT-Hub-Verbindungszeichenfolge
In diesem Artikel erstellen Sie einen Back-End-Dienst, um Cloud-zu-Gerät-Nachrichten über Ihren IoT Hub zu senden. Damit Ihr Dienst Cloud-zu-Gerät-Nachrichten senden kann, muss er über die Berechtigung Dienstverbindung verfügen. Standardmäßig wird jeder IoT-Hub mit einer SAS-Richtlinie namens service erstellt, die diese Berechtigung erteilt.
Führen Sie zum Abrufen der IoT-Hub-Verbindungszeichenfolge für die Richtlinie service die folgenden Schritte aus:
Wählen Sie im Azure-Portal die Option Ressourcengruppen aus. Wählen Sie die Ressourcengruppe aus, in der sich der Hub befindet, und wählen Sie dann in der Liste der Ressourcen Ihren Hub aus.
Wählen Sie im linken Bereich Ihres IoT-Hubs Freigegebene Zugriffsrichtlinien aus.
Wählen Sie in der Liste der Richtlinien die Richtlinie service aus.
Kopieren Sie die primäre Verbindungszeichenfolge und speichern Sie den Wert.
Weitere Informationen zu SAS-Richtlinien und Berechtigungen für IoT-Hubs finden Sie unter Access Control und Berechtigungen.
Senden einer C2D-Nachricht
In diesem Abschnitt erstellen Sie eine Python-Konsolen-App, die C2D-Nachrichten an die simulierte Geräte-App sendet. Sie benötigen die Geräte-ID Ihres Geräts und die Verbindungszeichenfolge Ihres IoT Hubs.
Öffnen Sie in Ihrem Arbeitsverzeichnis eine Eingabeaufforderung, und installieren Sie das Azure IoT Hub Service SDK für Python.
pip install azure-iot-hub
Erstellen Sie in einem Text-Editor eine Datei namens SendCloudToDeviceMessage.py.
Fügen Sie am Anfang der Datei SendCloudToDeviceMessage.py die folgenden
import
-Anweisungen und -Variablen hinzu:import random import sys from azure.iot.hub import IoTHubRegistryManager MESSAGE_COUNT = 2 AVG_WIND_SPEED = 10.0 MSG_TXT = "{\"service client sent a message\": %.2f}"
Fügen Sie der Datei SendCloudToDeviceMessage.py dann folgenden Code hinzu. Ersetzen Sie die Platzhalterwerte
{iot hub connection string}
und{device id}
durch die IoT-Hub-Verbindungszeichenfolge bzw. durch die Geräte-ID, die Sie zuvor notiert haben:CONNECTION_STRING = "{IoTHubConnectionString}" DEVICE_ID = "{deviceId}"
Fügen Sie den folgenden Code hinzu, um Nachrichten an Ihr Gerät zu senden:
def iothub_messaging_sample_run(): try: # Create IoTHubRegistryManager registry_manager = IoTHubRegistryManager(CONNECTION_STRING) for i in range(0, MESSAGE_COUNT): print ( 'Sending message: {0}'.format(i) ) data = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2)) props={} # optional: assign system properties props.update(messageId = "message_%d" % i) props.update(correlationId = "correlation_%d" % i) props.update(contentType = "application/json") # optional: assign application properties prop_text = "PropMsg_%d" % i props.update(testProperty = prop_text) registry_manager.send_c2d_message(DEVICE_ID, data, properties=props) try: # Try Python 2.xx first raw_input("Press Enter to continue...\n") except: pass # Use Python 3.xx in the case of exception input("Press Enter to continue...\n") except Exception as ex: print ( "Unexpected error {0}" % ex ) return except KeyboardInterrupt: print ( "IoT Hub C2D Messaging service sample stopped" )
Fügen Sie die folgende main-Funktion hinzu:
if __name__ == '__main__': print ( "Starting the Python IoT Hub C2D Messaging service sample..." ) iothub_messaging_sample_run()
Speichern und schließen Sie die Datei SendCloudToDeviceMessage.py.
Ausführen der Anwendungen
Sie können nun die Anwendungen ausführen.
Führen Sie an der Eingabeaufforderung in Ihrem Arbeitsverzeichnis den folgenden Befehl aus, um auf C2D-Nachrichten zu lauschen:
python SimulatedDevice.py
Öffnen Sie eine neue Eingabeaufforderung in Ihrem Arbeitsverzeichnis, und führen Sie den folgenden Befehl aus, um C2D-Nachrichten zu senden:
python SendCloudToDeviceMessage.py
Beachten Sie die vom Gerät empfangene Nachricht.
Nächste Schritte
In diesem Artikel haben Sie gelernt, wie C2D-Nachrichten gesendet und empfangen werden.
Weitere Informationen zu Cloud-zu-Gerät-Nachrichten finden Sie unter Senden von Cloud-zu-Gerät-Nachrichten von einem IoT-Hub.
Weitere Informationen zu IoT Hub-Nachrichtenformaten finden Sie unter Erstellen und Lesen von IoT Hub-Nachrichten.