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

Den här artikeln visar hur du laddar upp filer i IoT Hub och laddar upp en fil till Azure Blob Storage med hjälp av en Azure IoT .NET-enhet och tjänst-SDK:er.

I artikeln 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. Artikeln 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 två .NET-konsolappar:

  • FileUploadSample. Den här enhetsappen laddar upp en fil till lagring med hjälp av en SAS-URI som tillhandahålls av din IoT-hubb. Det här exemplet kommer från Azure IoT C# SDK-lagringsplatsen som du laddar ned i förutsättningarna.

  • ReadFileUploadNotification. Den här tjänstappen tar emot meddelanden om filuppladdning från din IoT-hubb. Du skapar den här appen.

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

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

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

  • Exempelprogrammen som du kör i den här artikeln skrivs med C# med .NET Core.

    Ladda ned .NET Core SDK för flera plattformar från .NET.

    Kontrollera den aktuella versionen av .NET Core SDK på utvecklingsdatorn med hjälp av följande kommando:

    dotnet --version
    
  • Ladda ned Azure IoT C# SDK från Hämta exempel och extrahera ZIP-arkivet.

  • Port 8883 bör vara öppen i brandväggen. Exemplet 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 fil från en enhetsapp

I den här artikeln använder du ett exempel från Azure IoT C# SDK-lagringsplatsen som du laddade ned tidigare som enhetsapp. Du kan öppna filerna nedan med hjälp av Visual Studio, Visual Studio Code eller valfri textredigerare.

Exemplet finns på azure-iot-sdk-csharp/iothub/device/samples/getting started/FileUploadSample i mappen där du extraherade Azure IoT C# SDK.

Granska koden i FileUpLoadSample.cs. Den här filen innehåller huvudexempellogik. När du har skapat en IoT Hub-enhetsklient följer den standardproceduren i tre delar för att ladda upp filer från en enhet:

  1. Koden anropar metoden GetFileUploadSasUriAsync på enhetsklienten för att hämta en SAS-URI från IoT-hubben:

    var fileUploadSasUriRequest = new FileUploadSasUriRequest
    {
        BlobName = fileName
    };
    
    // Lines removed for clarity
    
    FileUploadSasUriResponse sasUri = await _deviceClient.GetFileUploadSasUriAsync(fileUploadSasUriRequest);
    Uri uploadUri = sasUri.GetBlobUri();
    
  2. Koden använder SAS-URI:n för att ladda upp filen till Azure Storage. I det här exemplet använder den SAS-URI:n för att skapa en Azure Storage Block Blob-klient och laddar upp filen:

    var blockBlobClient = new BlockBlobClient(uploadUri);
    await blockBlobClient.UploadAsync(fileStreamSource, new BlobUploadOptions());
    
  3. Koden meddelar IoT-hubben att den har slutfört uppladdningen. Detta talar om för IoT-hubben att den kan frigöra resurser som är associerade med uppladdningen (SAS-URI:n). Om meddelanden om filuppladdning är aktiverade skickar IoT-hubben ett meddelande till serverdelstjänsterna.

    var successfulFileUploadCompletionNotification = new FileUploadCompletionNotification
    {
        // Mandatory. Must be the same value as the correlation id returned in the sas uri response
        CorrelationId = sasUri.CorrelationId,
    
        // Mandatory. Will be present when service client receives this file upload notification
        IsSuccess = true,
    
        // Optional, user defined status code. Will be present when service client receives this file upload notification
        StatusCode = 200,
    
        // Optional, user-defined status description. Will be present when service client receives this file upload notification
        StatusDescription = "Success"
    };
    
    await _deviceClient.CompleteFileUploadAsync(successfulFileUploadCompletionNotification);
    

Om du undersöker parameter.cs-filen ser du följande:

  • Exemplet kräver att du skickar en parameter, p, som tar en enhet anslutningssträng.

  • Som standard använder enhetsexemplet MQTT-protokollet för att kommunicera med IoT Hub. Du kan använda parametern t för att ändra det här transportprotokollet. Oavsett det här valet använder Azure Blob-klienten alltid HTTPS som protokoll för att ladda upp filen Azure Storage.

Hämta IoT Hub-anslutningssträng

I den här artikeln skapar du en serverdelstjänst för att ta emot meddelanden om filuppladdning från din IoT-hubb. För att ta emot meddelanden om filuppladdning behöver tjänsten behörigheten för tjänstanslutning . Som standard skapas varje IoT Hub med en princip för delad åtkomst med namnet service som ger den här behörigheten.

Följ dessa steg för att hämta IoT Hub-anslutningssträng för tjänstprincipen:

  1. I Azure-portalen väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan din hubb i listan över resurser.

  2. Välj Principer för delad åtkomst i den vänstra rutan i din IoT-hubb.

  3. I listan över principer väljer du tjänstprincipen.

  4. Kopiera den primära anslutningssträng och spara värdet.

Skärmbild som visar hur du hämtar anslutningssträng från din IoT Hub i Azure-portalen.

Mer information om principer och behörigheter för delad åtkomst i IoT Hub finns i Åtkomstkontroll och behörigheter.

Ta emot ett meddelande om filuppladdning

I det här avsnittet skapar du en C#-konsolapp som tar emot meddelanden om filuppladdning från din IoT-hubb.

  1. Öppna ett kommandofönster och gå till mappen där du vill skapa projektet. Skapa en mapp med namnet ReadFileUploadNotifications och ändra kataloger till den mappen.

    mkdir ReadFileUploadNotification
    cd ReadFileUploadNotification
    
  2. Kör följande kommando för att skapa ett C#-konsolprojekt. När kommandot har körts innehåller mappen en Program.cs fil och en ReadFileUploadNotification.csproj-fil .

    dotnet new console --language c#
    
  3. Kör följande kommando för att lägga till paketet Microsoft.Azure.Devices i projektfilen. Det här paketet är Azure IoT .NET Service SDK.

    dotnet add package Microsoft.Azure.Devices
    
  4. Öppna filen Program.cs och lägg till följande instruktion överst i filen:

    using Microsoft.Azure.Devices;
    
  5. Lägg till följande fält i klassen Program. {iot hub connection string} Ersätt platshållarvärdet med IoT Hub-anslutningssträng som du kopierade tidigare i Hämta IoT Hub-anslutningssträng:

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    
  6. Lägg till följande metod i klassen Program:

    private async static void ReceiveFileUploadNotificationAsync()
    {
        var notificationReceiver = serviceClient.GetFileNotificationReceiver();
        Console.WriteLine("\nReceiving file upload notification from service");
        while (true)
        {
            var fileUploadNotification = await notificationReceiver.ReceiveAsync();
            if (fileUploadNotification == null) continue;
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Received file upload notification: {0}", 
              string.Join(", ", fileUploadNotification.BlobName));
            Console.ResetColor();
            await notificationReceiver.CompleteAsync(fileUploadNotification);
        }
    }
    

    Observera att det här mottagningsmönstret är samma som används för att ta emot meddelanden från molnet till enheten från enhetsappen.

  7. Ersätt slutligen raderna i main-metoden med följande:

    Console.WriteLine("Receive file upload notifications\n");
    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    ReceiveFileUploadNotificationAsync();
    Console.WriteLine("Press Enter to exit\n");
    Console.ReadLine();
    

Kör programmen

Nu är du redo att köra programmen.

  1. Kör först tjänstappen för att ta emot meddelanden om filuppladdning från IoT-hubben. Kör följande kommandon i kommandotolken i mappen ReadFileUploadNotification :

    dotnet restore
    dotnet run
    

    Appen startar och väntar på ett meddelande om filuppladdning från din IoT-hubb:

    Receive file upload notifications
    
    
    Receiving file upload notification from service
    Press Enter to exit
    
  2. Kör sedan enhetsappen för att ladda upp filen till Azure Storage. Öppna en ny kommandotolk och ändra mappar till azure-iot-sdk-csharp\iothub\device\samples\getting started\FileUploadSample under mappen där du expanderade Azure IoT C# SDK. Kör följande kommandon. {Your device connection string} Ersätt platshållarvärdet i det andra kommandot med enheten anslutningssträng du såg när du registrerade en enhet i IoT-hubben.

    dotnet restore
    dotnet run --p "{Your device connection string}"
    

    Följande utdata kommer från enhetsappen när uppladdningen har slutförts:

      Uploading file TestPayload.txt
      Getting SAS URI from IoT Hub to use when uploading the file...
      Successfully got SAS URI (https://contosostorage.blob.core.windows.net/contosocontainer/MyDevice%2FTestPayload.txt?sv=2018-03-28&sr=b&sig=x0G1Baf%2BAjR%2BTg3nW34zDNKs07p6dLzkxvZ3ZSmjIhw%3D&se=2021-05-04T16%3A40%3A52Z&sp=rw) from IoT Hub
      Uploading file TestPayload.txt using the Azure Storage SDK and the retrieved SAS URI for authentication
      Successfully uploaded the file to Azure Storage
      Notified IoT Hub that the file upload succeeded and that the SAS URI can be freed.
      Time to upload file: 00:00:01.5077954.
      Done.
    
  3. Observera att tjänstappen visar att den har fått meddelandet om filuppladdning:

    Receive file upload notifications
    
    
    Receiving file upload notification from service
    Press Enter to exit
    
    Received file upload notification: myDeviceId/TestPayload.txt
    

Verifiera filuppladdningen

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

  1. Gå till ditt lagringskonto i Azure-portalen.

  2. I den vänstra rutan i ditt lagringskonto väljer du Containrar.

  3. Välj den container som du laddade upp filen till.

  4. Välj mappen med namnet efter enheten.

  5. Välj den blob som du laddade upp filen till. I den här artikeln är det bloben med namnet TestPayload.txt.

    Skärmbild av hur du väljer den uppladdade filen i Azure-portalen.

  6. Visa blobegenskaperna på sidan som öppnas. Du kan välja Ladda ned för att ladda ned filen och visa dess innehåll lokalt.

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: