Dela via


Ladda upp filer från enheten till molnet med Azure IoT Hub (Python)

Den här artikeln visar hur du filuppladdningsfunktioner i IoT Hub laddar upp en fil till Azure Blob Storage med hjälp av Python.

I artiklarna Skicka telemetri från en enhet till en IoT Hub-snabbstart och Skicka meddelanden från moln till enhet med IoT Hub visas de grundläggande funktionerna för meddelanden från enhet till moln och från moln till enhet i IoT Hub. Självstudien Konfigurera meddelanderoutning med IoT Hub visar ett sätt att på ett tillförlitligt sätt lagra meddelanden från enhet till moln i Microsoft Azure Blob Storage. I vissa scenarier kan du dock inte enkelt mappa de data som dina enheter skickar till de relativt små enhets-till-moln-meddelanden som IoT Hub accepterar. Till exempel:

  • Videoklipp
  • Stora filer som innehåller bilder
  • Vibrationsdata samplas med hög frekvens
  • Någon form av förbearbetade data.

Dessa filer bearbetas vanligtvis i molnet med hjälp av verktyg som Azure Data Factory eller Hadoop-stacken. När du behöver ladda upp filer från en enhet kan du fortfarande använda IoT Hubs säkerhet och tillförlitlighet. Den här artikeln visar hur.

I slutet av den här artikeln kör du Python-konsolappen FileUpload.py, som laddar upp en fil till lagring med hjälp av Python Device SDK.

Kommentar

IoT Hub stöder många enhetsplattformar och språk (inklusive C, Java, Python och JavaScript) via Azure IoT-enhets-SDK:er. Mer information om hur du ansluter din enhet till Azure IoT Hub finns i Azure IoT Developer Center .

Viktigt!

Filuppladdningsfunktioner på enheter som använder X.509-certifikatutfärdarautentisering (CA) är i offentlig förhandsversion och förhandsgranskningsläget måste vara aktiverat. Det är allmänt tillgängligt på enheter som använder X.509 tumavtrycksautentisering eller X.509-certifikatattestering med Azure Device Provisioning Service. Mer information om X.509-autentisering med IoT Hub finns i X.509-certifikat som stöds.

Förutsättningar

  • Ett aktivt Azure-konto. (Om du inte har något konto kan du skapa ett kostnadsfritt konto på bara några minuter.)

  • En IoT-hubb. Skapa en med CLI eller Azure-portalen.

  • En registrerad enhet. Registrera en i Azure-portalen.

  • Python version 3.7 eller senare rekommenderas. Se till att använda en 32-bitars eller 64-bitars installation beroende på vad som krävs för din konfiguration. Se till att du lägger till Python i den plattformsspecifika miljövariabeln när du uppmanas att göra det under installationen.

  • Port 8883 bör vara öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar via port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Anslut ing to IoT Hub (MQTT).

Associera ett Azure Storage-konto med IoT Hub

Om du vill ladda upp filer från en enhet måste du ha ett Azure Storage-konto och en Azure Blob Storage-container som är associerad med din IoT-hubb. När du har associerat lagringskontot och containern med din IoT-hubb kan din IoT-hubb tillhandahålla elementen i en SAS-URI när en enhet begär det. Enheten kan sedan använda dessa element för att konstruera den SAS-URI som den använder för att autentisera med Azure Storage och ladda upp filer till blobcontainern.

Så här associerar du ett Azure Storage-konto med din IoT-hubb:

  1. Under Hubbinställningar väljer du Filuppladdning i den vänstra rutan i din IoT-hubb.

    Skärmbild som visar välj inställningar för filuppladdning från portalen.

  2. I fönstret Filuppladdning väljer du Azure Storage Container. I den här artikeln rekommenderar vi att ditt lagringskonto och IoT Hub finns i samma region.

    • Om du redan har ett lagringskonto som du vill använda väljer du det i listan.

    • Om du vill skapa ett nytt lagringskonto väljer du +Lagringskonto. Ange ett namn för lagringskontot och kontrollera att platsen är inställd på samma region som din IoT-hubb och välj sedan OK. Det nya kontot skapas i samma resursgrupp som din IoT-hubb. När distributionen är klar väljer du lagringskontot i listan.

    När du har valt lagringskontot öppnas fönstret Containrar .

  3. I fönstret Containrar väljer du blobcontainern.

    • Om du redan har en blobcontainer som du vill använda väljer du den i listan och klickar på Välj.

    • Om du vill skapa en ny blobcontainer väljer du + Container. Ange ett namn för den nya containern. I den här artikeln kan du lämna alla andra fält som standard. Välj Skapa. När distributionen är klar väljer du containern i listan och klickar på Välj.

  4. Gå tillbaka till fönstret Filuppladdning och se till att filmeddelanden är inställda på På. Du kan lämna alla andra inställningar som standard. Välj Spara och vänta tills inställningarna har slutförts innan du går vidare till nästa avsnitt.

    Skärmbild som visar inställningarna för bekräftad filuppladdning i portalen.

Mer detaljerade anvisningar om hur du skapar ett Azure Storage-konto finns i Skapa ett lagringskonto. Mer detaljerade anvisningar om hur du associerar ett lagringskonto och en blobcontainer med en IoT-hubb finns i Konfigurera filuppladdningar med Hjälp av Azure-portalen.

Ladda upp en fil från en enhetsapp

I det här avsnittet skapar du enhetsappen för att ladda upp en fil till IoT Hub.

  1. Kör följande kommando i kommandotolken för att installera paketet azure-iot-device . Du använder det här paketet för att samordna filuppladdningen med din IoT-hubb.

    pip install azure-iot-device
    
  2. Kör följande kommando i kommandotolken för att installera azure.storage.blob-paketet. Du använder det här paketet för att utföra filuppladdningen.

    pip install azure.storage.blob
    
  3. Skapa en testfil som du laddar upp till bloblagring.

  4. Skapa en FileUpload.py fil i arbetsmappen med hjälp av en textredigerare.

  5. Lägg till följande import instruktioner och variabler i början av filen FileUpload.py .

    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. I filen ersätter du [Device Connection String] med anslutningssträng för din IoT Hub-enhet. Ersätt [Full path to local file] med sökvägen till testfilen som du skapade eller någon fil på enheten som du vill ladda upp.

  7. Skapa en funktion för att ladda upp filen till Blob Storage:

    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)
    

    Den här funktionen parsar den blob_info struktur som skickas till den för att skapa en URL som används för att initiera en azure.storage.blob.BlobClient. Sedan laddar den upp filen till Azure Blob Storage med den här klienten.

  8. Lägg till följande kod för att ansluta klienten och ladda upp filen:

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

    Den här koden skapar en IoTHubDeviceClient och använder följande API:er för att hantera filuppladdningen med din IoT-hubb:

    • get_storage_info_for_blob hämtar information från din IoT-hubb om det länkade lagringskontot som du skapade tidigare. Den här informationen innehåller värdnamnet, containernamnet, blobnamnet och en SAS-token. Lagringsinformationen skickas till funktionen store_blob (skapades i föregående steg), så BlobClient i den funktionen kan autentisera med Azure Storage. Metoden get_storage_info_for_blob returnerar också en correlation_id som används i metoden notify_blob_upload_status . Correlation_id är IoT Hubs sätt att markera vilken blob du arbetar med.

    • notify_blob_upload_status meddelar IoT Hub om status för bloblagringsåtgärden. Du skickar det correlation_id som hämtats av metoden get_storage_info_for_blob . Den används av IoT Hub för att meddela alla tjänster som kanske lyssnar efter ett meddelande om status för filuppladdningsaktiviteten.

  9. Spara och stäng filen FileUpload.py .

Kör appen

Nu är du redo att köra programmet.

  1. Kör följande kommando i en kommandotolk i arbetsmappen:

    python FileUpload.py
    
  2. Följande skärmbild visar utdata från FileUpload-appen :

    Skärmbild som visar utdata från att köra FileUpload-appen.

  3. Du kan använda portalen för att visa den uppladdade filen i lagringscontainern som du konfigurerade:

    Skärmbild av containern i Azure-portalen som visar den uppladdade filen.

Nästa steg

I den här artikeln har du lärt dig hur du använder filuppladdningsfunktionen i IoT Hub för att förenkla filuppladdningar från enheter. Du kan fortsätta att utforska den här funktionen med följande artiklar:

Läs mer om Azure Blob Storage med följande länkar: