Teilen über


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.

  1. Installieren Sie über eine Eingabeaufforderung in Ihrem Arbeitsverzeichnis das Azure IoT Hub Device SDK für Python:

    pip install azure-iot-device
    
  2. Erstellen Sie in einem Text-Editor eine Datei namens SimulatedDevice.py.

  3. 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
    
  4. 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}"
    
  5. 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))
    
  6. 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()
    
  7. Fügen Sie die folgende main-Funktion hinzu:

    if __name__ == '__main__':
        main()
    
  8. 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:

  1. 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.

  2. Wählen Sie im linken Bereich Ihres IoT-Hubs Freigegebene Zugriffsrichtlinien aus.

  3. Wählen Sie in der Liste der Richtlinien die Richtlinie service aus.

  4. Kopieren Sie die primäre Verbindungszeichenfolge und speichern Sie den Wert.

Screenshot, der das Abrufen der Verbindungszeichenfolge von Ihrem IoT Hub im Azure-Portal zeigt.

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.

  1. Öffnen Sie in Ihrem Arbeitsverzeichnis eine Eingabeaufforderung, und installieren Sie das Azure IoT Hub Service SDK für Python.

    pip install azure-iot-hub
    
  2. Erstellen Sie in einem Text-Editor eine Datei namens SendCloudToDeviceMessage.py.

  3. 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}"
    
  4. 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}"
    
  5. 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" )
    
  6. 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()
    
  7. Speichern und schließen Sie die Datei SendCloudToDeviceMessage.py.

Ausführen der Anwendungen

Sie können nun die Anwendungen ausführen.

  1. Führen Sie an der Eingabeaufforderung in Ihrem Arbeitsverzeichnis den folgenden Befehl aus, um auf C2D-Nachrichten zu lauschen:

    python SimulatedDevice.py
    

    Ausführen der simulierten Geräte-App

  2. Öffnen Sie eine neue Eingabeaufforderung in Ihrem Arbeitsverzeichnis, und führen Sie den folgenden Befehl aus, um C2D-Nachrichten zu senden:

    python SendCloudToDeviceMessage.py
    

    Ausführen der App zum Senden des C2D-Befehls

  3. Beachten Sie die vom Gerät empfangene Nachricht.

    Empfangene Nachricht

Nächste Schritte

In diesem Artikel haben Sie gelernt, wie C2D-Nachrichten gesendet und empfangen werden.