Teilen über


Tutorial: Entwickeln und Bereitstellen eines Python-IoT Edge-Moduls mit Linux-Containern

Gilt für:IoT Edge 1.4 Häkchen IoT Edge 1.4

Verwenden Sie Visual Studio Code zum Entwickeln von Python-Code, und stellen Sie ihn auf einem Gerät bereit, auf dem Azure IoT Edge ausgeführt wird.

Mithilfe von Azure IoT Edge-Modulen können Sie Code bereitstellen, der Ihre Geschäftslogik direkt auf Ihren IoT Edge-Geräten implementiert. In diesem Tutorial erfahren Sie Schritt für Schritt, wie Sie ein IoT Edge-Modul erstellen und bereitstellen, das Sensordaten auf dem in der Schnellstartanleitung eingerichteten IoT Edge-Gerät filtert. In diesem Tutorial lernen Sie Folgendes:

  • Erstellen eines IoT Edge-Python-Moduls mit Visual Studio Code
  • Erstellen und Veröffentlichen eines Docker-Images in Ihrer Registrierung unter Verwendung von Visual Studio Code und Docker
  • Bereitstellen des Moduls auf Ihrem IoT Edge-Gerät
  • Anzeigen generierter Daten

Das IoT Edge-Modul, das Sie in diesem Tutorial erstellen, filtert die von Ihrem Gerät generierten Temperaturdaten. Es leitet Nachrichten nur dann an nachgeschaltete Geräte weiter, wenn die Temperatur einen angegebenen Schwellenwert überschreitet. Diese Art der Analyse auf Edge-Ebene trägt zur Verringerung der Datenmenge bei, die an die Cloud übermittelt und dort gespeichert wird.

Sollten Sie über kein Azure-Abonnement verfügen, können Sie zunächst ein kostenloses Azure-Konto erstellen.

Voraussetzungen

In diesem Tutorial wird gezeigt, wie Sie ein Modul in Python mit Visual Studio Code entwickeln und auf einem IoT Edge-Gerät bereitstellen.

IoT Edge unterstützt keine Python-Module mit Windows-Containern.

Informieren Sie sich anhand der nachstehenden Tabelle über Ihre Optionen zum Entwickeln und Bereitstellen von Python-Modulen mit Linux-Containern:

Python Visual Studio Code Visual Studio 2017/2019
Linux AMD64 Verwenden von Visual Studio Code für Python-Module unter Linux AMD64
Linux ARM32 Verwenden von Visual Studio Code für Python-Module unter Linux ARM32
Linux ARM64 Verwenden von Visual Studio Code für Python-Module unter Linux ARM64

Bevor Sie mit diesem Tutorial beginnen, sollten Sie das vorhergehende Tutorial durchgearbeitet haben, um Ihre Entwicklungsumgebung für die Entwicklung von Linux-Containern einzurichten: Tutorial: Entwickeln von IoT Edge-Modulen für Linux-Geräte. Nach Abschluss dieses Tutorials sollten Sie die folgenden Voraussetzungen eingerichtet haben:

Um ein IoT Edge-Modul in Python zu entwickeln, installieren Sie die folgenden zusätzlichen Voraussetzungen auf Ihrem Entwicklungscomputer:

  • Python-Erweiterung für Visual Studio Code
  • Python.
  • Pip zum Installieren von Python-Paketen (normalerweise in der Python-Installation enthalten).

Hinweis

Stellen Sie sicher, dass sich der Ordner bin im Pfad für Ihre Plattform befindet. In der Regel ist dies ~/.local/ für UNIX und macOS bzw. %APPDATA%\Python unter Windows.

Erstellen eines Modulprojekts

Die folgenden Schritte dienen zum Erstellen eines IoT Edge-Python-Moduls unter Verwendung von Visual Studio Code und der Azure IoT Edge-Erweiterung.

Erstellen eines neuen Projekts

Erstellen Sie eine Python-Lösungsvorlage, die Sie mit eigenem Code anpassen können.

  1. Klicken Sie in Visual Studio Code auf Ansicht>Befehlspalette, um die Visual Studio Code-Befehlspalette zu öffnen.

  2. Geben Sie in der Befehlspalette den Befehl Azure: Sign in ein, und führen Sie ihn aus, und befolgen Sie die Anweisungen zum Anmelden bei Ihrem Azure-Konto. Falls Sie bereits angemeldet sind, können Sie diesen Schritt überspringen.

  3. Geben Sie in der Befehlspalette den folgenden Befehl ein, und führen Sie ihn aus: Azure IoT Edge: New IoT Edge Solution (Azure IoT Edge: Neue IoT Edge-Projektmappe) ein, und führen Sie ihn aus. Folgen Sie den Anweisungen, und geben Sie die folgenden Informationen an, um Ihre Projektmappe zu erstellen:

    Feld Wert
    Ordner auswählen Wählen Sie den Speicherort auf Ihrem Entwicklungscomputer aus, an dem Visual Studio Code die Projektmappendateien erstellen soll.
    Provide a solution name (Projektmappennamen angeben) Geben Sie für Ihre Projektmappe einen aussagekräftigen Namen ein, oder übernehmen Sie den Standardnamen EdgeSolution.
    Select module template (Modulvorlage auswählen) Wählen Sie Python-Modul aus.
    Provide a module name (Modulname angeben) Nennen Sie das Modul PythonModule.
    Provide Docker image repository for the module (Docker-Imagerepository für das Modul angeben) Ein Imagerepository enthält den Namen Ihrer Containerregistrierung und den Namen Ihres Containerimages. Für das Containerimage wird der von Ihnen im vorherigen Schritt angegebene Name übernommen. Ersetzen Sie localhost:5000 durch den Wert für Anmeldeserver aus Ihrer Azure-Containerregistrierung. Den Anmeldeserver können Sie im Azure-Portal auf der Übersichtsseite Ihrer Containerregistrierung ermitteln.

    Das endgültige Imagerepository sieht wie folgt aus: <Registrierungsname>.azurecr.io/pythonmodule.

    Bereitstellen eines Docker-Imagerepositorys

Hinzufügen von Registrierungsanmeldeinformationen

Die Umgebungsdatei speichert die Anmeldeinformationen für Ihr Containerrepository und gibt sie an die IoT Edge-Runtime weiter. Die Runtime benötigt diese Anmeldeinformationen, um Ihre privaten Images per Pull auf das IoT Edge-Gerät zu übertragen.

Die IoT Edge-Erweiterung versucht, Ihre Anmeldeinformationen für die Containerregistrierung per Pullvorgang aus Azure abzurufen und in die Umgebungsdatei einzufügen. Überprüfen Sie, ob Ihre Anmeldeinformationen bereits enthalten sind. Fügen Sie sie jetzt hinzu, wenn dies nicht der Fall ist:

  1. Öffnen Sie die ENV-Datei im Visual Studio Code-Explorer.
  2. Aktualisieren Sie die Felder mit den Werten für Benutzername und Kennwort, die Sie aus der Azure-Containerregistrierung kopiert haben.
  3. Speichern Sie die ENV-Datei.

Hinweis

In diesem Tutorial werden die Administratoranmeldeinformationen für die Azure Container Registry verwendet, die für Entwicklungs- und Testszenarien geeignet sind. Wenn Sie für die Produktionsszenarien bereit sind, empfehlen wir Ihnen, eine Authentifizierungsoption mit den geringstmöglichen Rechten, z. B. Dienstprinzipale, auszuwählen. Weitere Informationen finden Sie unter Verwalten des Zugriffs auf die Containerregistrierung.

Auswählen Ihrer Zielarchitektur

Mit Visual Studio Code können derzeit Python-Module für Linux AMD64- und Linux ARM32v7-Geräte entwickelt werden. Sie müssen bei jeder Projektmappe auswählen, welche Architektur Sie als Ziel verwenden möchten, weil der Container für jeden Architekturtyp unterschiedlich erstellt und ausgeführt wird. Der Standardwert ist „Linux AMD64“.

  1. Öffnen Sie die Befehlspalette, und suchen Sie nach Azure IoT Edge: Set Default Target Platform for Edge Solution (Standardzielplattform für Edge-Projektmappe festlegen), oder wählen Sie das Verknüpfungssymbol in der Seitenleiste unten im Fenster aus.

  2. Wählen Sie in der Befehlspalette die Zielarchitektur aus der Liste mit Optionen aus. Weil in diesem Tutorial ein virtueller Ubuntu-Computer als IoT Edge-Gerät verwendet wird, behalten Sie den Standardwert amd64 bei.

Aktualisieren des Moduls mit benutzerdefiniertem Code

Jede Vorlage enthält Beispielcode, der simulierte Sensordaten aus dem Modul SimulatedTemperatureSensor an den IoT-Hub weiterleitet. Fügen Sie in diesem Abschnitt den Code hinzu, der pythonModule erweitert, um die Nachrichten vor dem Senden zu analysieren.

  1. Öffnen Sie im Visual Studio Code-Explorer Module>PythonModule>main.py.

  2. Importieren Sie oben in der Datei main.py die Bibliothek json:

    import json
    
  3. Fügen Sie globale Definitionen für die Variablen TEMPERATURE_THRESHOLD, RECEIVED_MESSAGES und TWIN_CALLBACKS hinzu. Der Temperaturschwellenwert legt den Wert fest, den die gemessene Computertemperatur übersteigen muss, damit die Daten an die IoT Hub-Instanz gesendet werden.

    # global counters
    TEMPERATURE_THRESHOLD = 25
    TWIN_CALLBACKS = 0
    RECEIVED_MESSAGES = 0
    
  4. Ersetzen Sie die Funktion create_client durch den folgenden Code:

    def create_client():
        client = IoTHubModuleClient.create_from_edge_environment()
    
        # Define function for handling received messages
        async def receive_message_handler(message):
            global RECEIVED_MESSAGES
            print("Message received")
            size = len(message.data)
            message_text = message.data.decode('utf-8')
            print("    Data: <<<{data}>>> & Size={size}".format(data=message.data, size=size))
            print("    Properties: {}".format(message.custom_properties))
            RECEIVED_MESSAGES += 1
            print("Total messages received: {}".format(RECEIVED_MESSAGES))
    
            if message.input_name == "input1":
                message_json = json.loads(message_text)
                if "machine" in message_json and "temperature" in message_json["machine"] and message_json["machine"]["temperature"] > TEMPERATURE_THRESHOLD:
                    message.custom_properties["MessageType"] = "Alert"
                    print("ALERT: Machine temperature {temp} exceeds threshold {threshold}".format(
                        temp=message_json["machine"]["temperature"], threshold=TEMPERATURE_THRESHOLD
                    ))
                    await client.send_message_to_output(message, "output1")
    
        # Define function for handling received twin patches
        async def receive_twin_patch_handler(twin_patch):
            global TEMPERATURE_THRESHOLD
            global TWIN_CALLBACKS
            print("Twin Patch received")
            print("     {}".format(twin_patch))
            if "TemperatureThreshold" in twin_patch:
                TEMPERATURE_THRESHOLD = twin_patch["TemperatureThreshold"]
            TWIN_CALLBACKS += 1
            print("Total calls confirmed: {}".format(TWIN_CALLBACKS))
    
        try:
            # Set handler on the client
            client.on_message_received = receive_message_handler
            client.on_twin_desired_properties_patch_received = receive_twin_patch_handler
        except:
            # Cleanup if failure occurs
            client.shutdown()
            raise
    
        return client
    
  5. Speichern Sie die Datei „main.py“.

  6. Öffnen Sie im Visual Studio Code-Explorer die Datei deployment.template.json im Arbeitsbereich für Ihre IoT Edge-Lösung.

  7. Fügen Sie dem Bereitstellungsmanifest den Modulzwilling PythonModule hinzu. Fügen Sie am Ende des Abschnitts moduleContent nach dem Modulzwilling $edgeHub den folgenden JSON-Inhalt ein:

        "PythonModule": {
            "properties.desired":{
                "TemperatureThreshold":25
            }
        }
    

    Hinzufügen des Modulzwillings zur Bereitstellungsvorlage

  8. Speichern Sie die Datei „deployment.template.json“.

Erstellen und Pushen Ihres Moduls

Im vorherigen Abschnitt haben Sie eine IoT Edge-Projektmappe erstellt und dem „PythonModule“ Code hinzugefügt, der Nachrichten herausfiltert, bei denen die gemeldete Computertemperatur innerhalb der zulässigen Grenzwerte liegt. Nun müssen Sie die Projektmappe als Containerimage erstellen und per Push an die Containerregistrierung übertragen.

  1. Öffnen Sie das in Visual Studio Code integrierte Terminal, indem Sie Ansicht>Terminal wählen.

  2. Melden Sie sich bei Docker an. Geben Sie dazu den nachstehenden Befehl im Terminal ein. Melden Sie sich mit dem Benutzernamen, Kennwort und Anmeldeserver aus Ihrer Azure-Containerregistrierung an. Diese Werte finden Sie im Azure-Portal im Abschnitt Zugriffsschlüssel Ihrer Registrierung.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Möglicherweise wird Ihnen in einem Sicherheitshinweis die Verwendung von --password-stdin empfohlen. Diese bewährte Methode wird für Produktionsszenarien empfohlen, aber sie ist nicht Gegenstand dieses Tutorials. Weitere Informationen finden Sie in der docker login-Referenz.

  3. Klicken Sie im Visual Studio Code-Explorer mit der rechten Maustaste auf die Datei deployment.template.json, und klicken Sie anschließend auf Build and Push IoT Edge solution (IoT Edge-Projektmappe erstellen und übertragen).

    Der Befehl zum Erstellen und Übertragen per Push startet drei Vorgänge. Zuerst erstellt er in der Projektmappe einen neuen Ordner mit dem Namen config. Darin ist das vollständige Bereitstellungsmanifest gespeichert, das aus Informationen in der Bereitstellungsvorlage und anderen Projektmappendateien erstellt wurde. Danach führt er docker build zum Erstellen des Containerimages aus, das auf der entsprechenden Dockerfile-Datei für Ihre Zielarchitektur basiert. Und schließlich führt er docker push aus, um das Imagerepository per Push in Ihre Containerregistrierung zu übertragen.

    Dieser Vorgang kann beim ersten Mal einige Minuten dauern, aber er ist bei der nächsten Ausführung von Befehlen schon schneller.

Bereitstellen von Modulen auf dem Gerät

Verwenden Sie den Visual Studio Code-Explorer und die Azure IoT Edge-Erweiterung, um das Modulprojekt auf Ihrem IoT Edge-Gerät bereitzustellen. Sie haben schon ein Bereitstellungsmanifest für Ihr Szenario vorbereitet: die Datei deployment.amd64.json im Ordner „config“. Nun müssen Sie nur noch ein Gerät auswählen, um die Bereitstellung zu empfangen.

Sorgen Sie dafür, dass Ihr IoT Edge-Gerät ordnungsgemäß ausgeführt wird.

  1. Erweitern Sie im Visual Studio Code-Explorer im Abschnitt Azure IoT Hub den Bereich Geräte, um Ihre IoT-Geräteliste anzuzeigen.

  2. Klicken Sie mit der rechten Maustaste auf den Namen Ihres IoT Edge-Geräts, und klicken Sie dann auf Create Deployment for Single Device (Bereitstellung für einzelnes Gerät erstellen).

  3. Wählen Sie im Konfigurationsordner (config) die Datei deployment.amd64.json aus, und klicken Sie auf Select Edge Deployment Manifest (Edge-Bereitstellungsmanifest auswählen). Verwenden Sie nicht die Datei „deployment.template.json“.

  4. Erweitern Sie unter Ihrem Gerät den Bereich Module, um eine Liste mit bereitgestellten und ausgeführten Modulen anzuzeigen. Klicken Sie auf die Schaltfläche „Aktualisieren“. Nun sollte das neue PythonModule-Modul zusammen mit dem SimulatedTemperatureSensor-Modul sowie mit $edgeAgent und $edgeHub ausgeführt werden.

    Es dauert ggf. einige Minuten, bis die Module gestartet werden. Die IoT Edge-Runtime muss das neue Bereitstellungsmanifest empfangen, die Modulimages per Pullvorgang aus der Containerruntime abrufen und dann jedes neue Modul starten.

Anzeigen der generierten Daten

Sobald Sie das Bereitstellungsmanifest auf Ihr IoT Edge-Gerät angewendet haben, erfasst die IoT Edge-Runtime auf dem Gerät die neuen Bereitstellungsinformationen und verwendet sie bei der Ausführung. Alle auf dem Gerät ausgeführten Module, die nicht im Bereitstellungsmanifest enthalten sind, werden beendet. Module, die auf dem Gerät fehlen, werden gestartet.

Der Status Ihres IoT Edge-Geräts wird im Abschnitt Azure IoT Hub Devices (Azure IoT Hub-Geräte) des Visual Studio Code-Explorers angezeigt. Erweitern Sie die Details Ihres Geräts, um eine Liste mit den bereitgestellten und ausgeführten Modulen anzuzeigen.

  1. Klicken Sie im Visual Studio Code-Explorer mit der rechten Maustaste auf den Namen Ihres IoT Edge-Geräts, und wählen Sie Start Monitoring Built-in Event Endpoint (Überwachung des integrierten Ereignisendpunkts starten) aus.

  2. Zeigen Sie die Nachrichten an, die auf Ihrem IoT-Hub eintreffen. Es kann eine Weile dauern, bis die Nachrichten eintreffen. Das IoT Edge-Gerät muss die neue Bereitstellung erhalten und alle Module starten. Danach wird bei den am Code von „PythonModule“ vorgenommenen Änderungen gewartet, bis die Maschinentemperatur 25 Grad erreicht hat, bevor Nachrichten gesendet werden. Außerdem fügt das Gerät allen Nachrichten, die diesen Temperaturschwellenwert erreichen, den Nachrichtentyp Alert (Warnung) hinzu.

Bearbeiten des Modulzwillings

Sie haben den Modulzwilling „PythonModule“ im Bereitstellungsmanifest verwendet, um den Temperaturschwellenwert auf 25 Grad festzulegen. Mithilfe des Modulzwillings können Sie die Funktionalität ändern, ohne den Modulcode aktualisieren zu müssen.

  1. Erweitern Sie in Visual Studio Code die Details unter Ihrem IoT Edge-Gerät, um die derzeit ausgeführten Module anzuzeigen.

  2. Klicken Sie mit der rechten Maustaste auf PythonModule, und wählen Sie Modulzwilling bearbeiten aus.

  3. Suchen Sie TemperatureThreshold in den gewünschten Eigenschaften. Ändern Sie den Wert auf eine neue Temperatur, die 5 bis 10 Grad höher als die zuletzt gemeldete Temperatur ist.

  4. Speichern Sie die Modulzwillingsdatei.

  5. Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im Bearbeitungsbereich für Modulzwillinge, und wählen Sie Modulzwilling aktualisieren aus.

  6. Überwachen Sie die eingehenden D2C-Nachrichten (Device-to-Cloud, Gerät-zu-Cloud). Jetzt sollten die Nachrichten so lange gestoppt werden, bis der neue Temperaturschwellenwert erreicht wird.

Bereinigen von Ressourcen

Falls Sie mit dem nächsten empfohlenen Artikel fortfahren möchten, können Sie die erstellten Ressourcen und Konfigurationen beibehalten und wiederverwenden. Sie können auch dasselbe IoT Edge-Gerät als Testgerät weiter nutzen.

Andernfalls können Sie die in diesem Artikel verwendeten lokalen Konfigurationen und die Azure-Ressourcen löschen, um Kosten zu vermeiden.

Löschen von Azure-Ressourcen

Das Löschen von Azure-Ressourcen und -Ressourcengruppen kann nicht rückgängig gemacht werden. Achten Sie daher darauf, dass Sie nicht versehentlich die falsche Ressourcengruppe oder die falschen Ressourcen löschen. Wenn Sie den IoT-Hub in einer bereits vorhandenen Ressourcengruppe erstellt haben, die Ressourcen enthält, die Sie behalten möchten, löschen Sie nicht die Ressourcengruppe, sondern nur die IoT-Hub-Ressource.

So löschen Sie die Ressourcen:

  1. Melden Sie sich beim Azure-Portal an, und wählen Sie anschließend Ressourcengruppen aus.

  2. Wählen Sie den Namen der Ressourcengruppe aus, die Ihre IoT Edge-Testressourcen enthält.

  3. Überprüfen Sie die Liste der Ressourcen, die in Ihrer Ressourcengruppe enthalten sind. Wenn Sie alle löschen möchten, klicken Sie auf Ressourcengruppe löschen. Wenn Sie nur einige Ressourcen löschen möchten, klicken Sie auf die jeweiligen Ressourcen, um sie einzeln zu löschen.

Nächste Schritte

In diesem Tutorial haben Sie ein IoT Edge-Modul erstellt, das Code zum Filtern von Rohdaten enthält, die von Ihrem IoT Edge-Gerät generiert wurden.

Sie können die nächsten Tutorials durcharbeiten, um zu erfahren, wie Ihnen Azure IoT Edge bei der Bereitstellung von Azure-Clouddiensten helfen kann, um Daten auf Edge-Ebene zu verarbeiten und zu analysieren.