Hochladen von Dateien von Ihrem Gerät in die Cloud mit Azure IoT Hub (Python)

In diesem Artikel wird gezeigt, wie eine Datei mithilfe von Python und den Dateiuploadfunktionen von IoT Hub in Azure Blob Storage hochgeladen wird.

Die Schnellstartartikel Senden von Telemetriedaten von einem Gerät an einen IoT Hub und Senden von Cloud-zu-Gerät-Nachrichten mit IoT Hub zeigen die grundlegende Gerät-zu-Cloud- und Cloud-zu-Gerät-Funktionalität von IoT Hub. Im Tutorial Konfigurieren der Nachrichtenweiterleitung mit IoT Hub wird eine Möglichkeit für das zuverlässige Speichern von Gerät-zu-Cloud-Nachrichten in Microsoft Azure Blob Storage gezeigt. In einigen Szenarien können Sie jedoch nicht einfach die von Ihren Geräten gesendeten Daten den relativ kleinen Gerät-zu-Cloud-Nachrichten zuordnen, die IoT Hub akzeptiert. Beispiel:

  • Videos
  • Große Dateien, die Bilder enthalten
  • Vibrationsdaten, die mit hoher Häufigkeit als Stichproben erfasst werden
  • Eine Form vorverarbeiteter Daten.

Diese Dateien werden normalerweise als Batch in der Cloud mit Tools wie Azure Data Factory oder dem Hadoop-Stapel verarbeitet. Wenn Sie Dateien von einem Gerät hochladen müssen, können Sie weiterhin die Sicherheit und Zuverlässigkeit des IoT Hub nutzen. In diesem Artikel erfahren Sie, welche Schritte erforderlich sind.

Am Ende dieses Artikels führen Sie die Python-Konsolen-App FileUpload.py aus, die eine Datei mithilfe des Python-Geräte-SDKs in den Speicher hochlädt.

Hinweis

IoT Hub unterstützt über Azure IoT-Geräte-SDKs viele Geräteplattformen und Sprachen (darunter C, Java, Python und JavaScript). Im Azure IoT Developer Center finden Sie Informationen zum Herstellen einer Verbindung Ihres Geräts mit Azure IoT Hub.

Wichtig

Die Funktion zum Hochladen von Dateien auf Geräten, die die Authentifizierung der X.509-Zertifizierungsstelle verwenden, befindet sich in der öffentlichen Vorschau, und der Vorschaumodus muss aktiviert werden. Sie ist allgemein verfügbar auf Geräten, die die Authentifizierung per X.509-Fingerabdruck oder den X.509-Zertifikatnachweis mit dem Azure Device Provisioning Service verwenden. Weitere Informationen zur X.509-Authentifizierung mit IoT Hub finden Sie unter Unterstützte X.509-Zertifikate.

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.

  • Der Port 8883 muss in Ihrer Firewall geöffnet sein. 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).

Zuweisen eines Azure Storage-Kontos zu IoT Hub

Wenn Sie Dateien von einem Gerät hochladen möchten, müssen Sie ein Azure Storage-Konto und einen Azure Blob Storage-Container haben, die Ihrem IoT-Hub zugeordnet wurden. Sobald Sie das Speicherkonto und den Container Ihrem IoT-Hub zugeordnet haben, kann der IoT-Hub die Elemente eines SAS-URI bereitstellen, wenn sie von einem Gerät angefordert werden. Das Gerät kann dann mithilfe dieser Elemente den SAS-URI erstellen, den es zum Authentifizieren bei Azure Storage und zum Hochladen von Dateien in den Blobcontainer verwendet.

So ordnen Sie Ihrem IoT-Hub ein Azure Storage-Konto zu:

  1. Wählen Sie im linken Bereich des IoT-Hubs unter Hubeinstellungen die Option Dateiupload aus.

    Screenshot: Auswahl von Einstellungen für den Dateiupload im Portal

  2. Wählen Sie im Bereich Dateiupload die Option Azure Storage-Container aus. Für diesen Artikel wird empfohlen, dass sich Ihr Speicherkonto und IoT Hub in derselben Region befinden.

    • Wenn Sie bereits ein Speicherkonto haben, das Sie nutzen möchten, wählen Sie es in der Liste aus.

    • Wählen Sie zum Erstellen eines neuen Speicherkontos + Speicherkonto aus. Geben Sie einen Namen für das Speicherkonto an, und stellen Sie sicher, dass Speicherort auf dieselbe Region wie Ihr IoT-Hub festgelegt wird. Wählen Sie dann OK aus. Das neue Konto wird in derselben Ressourcengruppe wie Ihr IoT-Hub erstellt. Wählen Sie nach Abschluss der Bereitstellung das Speicherkonto in der Liste aus.

    Nachdem Sie das Speicherkonto ausgewählt haben, wird der Bereich Container geöffnet.

  3. Wählen Sie im Bereich Container den Blobcontainer aus.

    • Wenn Sie bereits einen Blobcontainer haben, den Sie nutzen möchten, wählen Sie ihn in der Liste aus, und klicken Sie auf Auswählen.

    • Wählen Sie dann + Container aus, um einen neuen Blobcontainer zu erstellen. Geben Sie einen Namen für den neuen Container an. Für die Zwecke dieses Artikels können Sie bei allen anderen Feldern die Standardwerte beibehalten. Klicken Sie auf Erstellen. Wählen Sie nach Abschluss der Bereitstellung den Container in der Liste aus, und klicken Sie auf Auswählen.

  4. Vergewissern Sie sich im Bereich Dateiupload, dass für Dateibenachrichtigungen On (Aktiviert) festgelegt wurde. Bei allen anderen Einstellungen können Sie die Standardwerte beibehalten. Wählen Sie Speichern aus, und warten Sie, bis die Einstellungen abgeschlossen sind, bevor Sie mit dem nächsten Abschnitt weitermachen.

    Screenshot: Einstellungen zum Bestätigen des Dateiuploads im Portal

Ausführlichere Anleitungen zum Erstellen eines Azure Storage-Kontos finden Sie unter Erstellen eines Speicherkontos. Ausführlichere Anleitungen zum Zuordnen eines Speicherkontos und Blobcontainers zu einem IoT-Hub finden Sie unter Konfigurieren des Dateiuploads im Azure-Portal.

Hochladen einer Datei von einer Geräte-App

In diesem Abschnitt erstellen Sie die Geräte-App zum Hochladen einer Datei in IoT Hub.

  1. Führen Sie an der Eingabeaufforderung den folgenden Befehl aus, um das Paket azure-iot-device zu installieren. Sie verwenden dieses Paket zur Koordination des Dateiuploads mit Ihrem IoT-Hub.

    pip install azure-iot-device
    
  2. Führen Sie an der Eingabeaufforderung den folgenden Befehl aus, um das Paket azure.storage.blob zu installieren. Sie verwenden dieses Paket, um den Dateiupload durchzuführen.

    pip install azure.storage.blob
    
  3. Erstellen Sie eine Testdatei zum Hochladen in den Blobspeicher.

  4. Erstellen Sie mit einem Text-Editor in Ihrem Arbeitsordner die Datei FileUpload.py.

  5. Fügen Sie am Anfang der Datei FileUpload.py die folgenden import-Anweisungen und Variablen hinzu.

    import os
    from azure.iot.device import IoTHubDeviceClient
    from azure.core.exceptions import AzureError
    from azure.storage.blob import BlobClient
    
    CONNECTION_STRING = "[Device Connection String]"
    PATH_TO_FILE = r"[Full path to local file]"
    
  6. Ersetzen Sie in Ihrer Datei [Device Connection String] durch die Verbindungszeichenfolge Ihres IoT Hub-Geräts. Ersetzen Sie [Full path to local file] durch den Pfad zu der erstellten Testdatei oder einer Datei auf Ihrem Gerät, die Sie hochladen möchten.

  7. Erstellen Sie eine Funktion, um die Datei in den Blobspeicher hochzuladen:

    def store_blob(blob_info, file_name):
        try:
            sas_url = "https://{}/{}/{}{}".format(
                blob_info["hostName"],
                blob_info["containerName"],
                blob_info["blobName"],
                blob_info["sasToken"]
            )
    
            print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))
    
            # Upload the specified file
            with BlobClient.from_blob_url(sas_url) as blob_client:
                with open(file_name, "rb") as f:
                    result = blob_client.upload_blob(f, overwrite=True)
                    return (True, result)
    
        except FileNotFoundError as ex:
            # catch file not found and add an HTTP status code to return in notification to IoT Hub
            ex.status_code = 404
            return (False, ex)
    
        except AzureError as ex:
            # catch Azure errors that might result from the upload operation
            return (False, ex)
    

    Diese Funktion analysiert die an sie übergebene Struktur blob_info und erstellt damit eine URL, über die sie einen azure.storage.blob.BlobClient initialisiert. Anschließend lädt sie Ihre Datei mithilfe dieses Clients in Azure Blob Storage hoch.

  8. Fügen Sie den folgenden Code hinzu, um eine Verbindung mit dem Client herzustellen und die Datei hochzuladen:

    def run_sample(device_client):
        # Connect the client
        device_client.connect()
    
        # Get the storage info for the blob
        blob_name = os.path.basename(PATH_TO_FILE)
        storage_info = device_client.get_storage_info_for_blob(blob_name)
    
        # Upload to blob
        success, result = store_blob(storage_info, PATH_TO_FILE)
    
        if success == True:
            print("Upload succeeded. Result is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)
            )
    
        else :
            # If the upload was not successful, the result is the exception object
            print("Upload failed. Exception is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], False, result.status_code, str(result)
            )
    
    def main():
        device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        try:
            print ("IoT Hub file upload sample, press Ctrl-C to exit")
            run_sample(device_client)
        except KeyboardInterrupt:
            print ("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            device_client.shutdown()
    
    
    if __name__ == "__main__":
        main()
    

    Dieser Code erstellt einen IoTHubDeviceClient und verwendet die folgenden APIs, um den Dateiupload mit Ihrem IoT-Hub zu verwalten:

    • get_storage_info_for_blob ruft Informationen von Ihrem IoT-Hub über das zuvor erstellte verknüpfte Speicherkonto ab. Zu diesen Informationen gehören der Hostname, der Containername, der Blobname und ein SAS-Token. Die Speicherinformationen werden an die Funktion store_blob (die im vorherigen Schritt erstellt wurde) übermittelt, sodass sich der BlobClient in dieser Funktion bei Azure Storage authentifizieren kann. Die get_storage_info_for_blob-Methode gibt auch eine correlation_id zurück, die in der notify_blob_upload_status-Methode verwendet wird. Über die correlation_id gibt IoT Hub an, an welchem Blob Sie arbeiten.

    • notify_blob_upload_status benachrichtigt IoT Hub über den Status Ihres Blobspeichervorgangs. Sie übergeben die von der get_storage_info_for_blob-Methode abgerufene correlation_id. Mit ihr benachrichtigt IoT Hub Dienste, die möglicherweise nach einer Benachrichtigung über den Status der Dateiuploadaufgabe lauschen.

  9. Speichern und schließen Sie die Datei FileUpload.py.

Ausführen der Anwendung

Jetzt können Sie die Anwendung ausführen.

  1. Führen Sie an der Eingabeaufforderung in Ihrem Arbeitsordner den folgenden Befehl aus:

    python FileUpload.py
    
  2. Der folgende Screenshot zeigt die Ausgabe der App FileUpload:

    Screenshot, der die Ausgabe nach Ausführung der App „FileUpload“ zeigt.

  3. Sie können das Verwaltungsportal verwenden, um die hochgeladene Datei im Speichercontainer anzuzeigen, den Sie konfiguriert haben:

    Screenshot des Containers im Azure-Portal, der die hochgeladene Datei zeigt.

Nächste Schritte

In diesem Artikel haben Sie gelernt, wie Sie das IoT Hub-Feature zum Hochladen von Dateien nutzen, um Dateiuploads von Geräten zu vereinfachen. In den folgenden Artikeln können Sie mehr zu diesem Feature erfahren:

Unter folgenden Links finden Sie weitere Informationen zu Azure Blob Storage: