Dela via


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

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 Node.js.

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 upland-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å Node.js konsolappar:

  • FileUpload.js, som laddar upp en fil till lagring med hjälp av en SAS-URI som tillhandahålls av din IoT-hubb.

  • FileUploadNotification.js, som tar emot meddelanden om filuppladdning från din IoT-hubb.

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 enhet som är registrerad i din IoT-hubb. Om du inte har en enhet i din IoT-hubb följer du stegen i Registrera en enhet.

  • Node.js version 10.0.x eller senare. LTS-versionen rekommenderas. Du kan ladda ned Node.js från nodejs.org.

  • 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 Ansluta till 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 en enhetsapp för att ladda upp en fil till IoT Hub. Koden baseras på kod som är tillgänglig i upload_to_blob_advanced.js-exemplet i Azure IoT-Node.js SDK-enhetsexempel.

  1. Skapa en tom mapp med namnet fileupload. Skapa en package.json-fil i mappen fileupload genom att köra följande kommando i kommandotolken. Acceptera alla standardvärden:

    npm init
    
  2. I kommandotolken i fileupload mappen kör du följande kommando för att installera azure-iot-device Device SDK, azure-iot-device-mqtt och paketen @azure/storage-blob :

    npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save
    
  3. Med hjälp av en textredigerare skapar du en FileUpload.js fil i fileupload mappen och kopierar följande kod till den.

    'use strict';
    
    const Client = require('azure-iot-device').Client;
    const Protocol = require('azure-iot-device-mqtt').Mqtt;
    const errors = require('azure-iot-common').errors;
    const path = require('path');
    
    const {
      AnonymousCredential,
      BlockBlobClient,
      newPipeline
    } = require('@azure/storage-blob');
    
    // make sure you set these environment variables prior to running the sample.
    const deviceConnectionString = process.env.DEVICE_CONNECTION_STRING;
    const localFilePath = process.env.PATH_TO_FILE;
    const storageBlobName = path.basename(localFilePath);
    
    async function uploadToBlob(localFilePath, client) {
      const blobInfo = await client.getBlobSharedAccessSignature(storageBlobName);
      if (!blobInfo) {
        throw new errors.ArgumentError('Invalid upload parameters');
      }
    
      const pipeline = newPipeline(new AnonymousCredential(), {
        retryOptions: { maxTries: 4 },
        telemetry: { value: 'HighLevelSample V1.0.0' }, // Customized telemetry string
        keepAliveOptions: { enable: false }
      });
    
      // Construct the blob URL to construct the blob client for file uploads
      const { hostName, containerName, blobName, sasToken } = blobInfo;
      const blobUrl = `https://${hostName}/${containerName}/${blobName}${sasToken}`;
    
      // Create the BlockBlobClient for file upload to the Blob Storage Blob
      const blobClient = new BlockBlobClient(blobUrl, pipeline);
    
      // Setup blank status notification arguments to be filled in on success/failure
      let isSuccess;
      let statusCode;
      let statusDescription;
    
      try {
        const uploadStatus = await blobClient.uploadFile(localFilePath);
        console.log('uploadStreamToBlockBlob success');
    
        // Save successful status notification arguments
        isSuccess = true;
        statusCode = uploadStatus._response.status;
        statusDescription = uploadStatus._response.bodyAsText;
    
        // Notify IoT Hub of upload to blob status (success)
        console.log('notifyBlobUploadStatus success');
      }
      catch (err) {
        isSuccess = false;
        statusCode = err.code;
        statusDescription = err.message;
    
        console.log('notifyBlobUploadStatus failed');
        console.log(err);
      }
    
      await client.notifyBlobUploadStatus(blobInfo.correlationId, isSuccess, statusCode, statusDescription);
    }
    
    // Create a client device from the connection string and upload the local file to blob storage.
    const deviceClient = Client.fromConnectionString(deviceConnectionString, Protocol);
    uploadToBlob(localFilePath, deviceClient)
      .catch((err) => {
        console.log(err);
      })
      .finally(() => {
        process.exit();
      });
    
  4. Spara och stäng filen FileUpload.js .

  5. Kopiera en bildfil till mappen och ge den ett namn, till fileupload exempel myimage.png.

  6. Lägg till miljövariabler för enheten niska veze och sökvägen till filen som du vill ladda upp. Du fick enheten niska veze när du registrerade en enhet i IoT-hubben.

    • För Windows:

      set DEVICE_CONNECTION_STRING={your device connection string}
      set PATH_TO_FILE={your image filepath}
      
    • För Linux/Bash:

      export DEVICE_CONNECTION_STRING="{your device connection string}"
      export PATH_TO_FILE="{your image filepath}"
      

Hämta IoT Hub-niska veze

I den här artikeln skapar du en serverdelstjänst för att ta emot meddelanden om filuppladdning från den IoT-hubb som du skapade. 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-niska veze 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 niska veze och spara värdet.

Skärmbild som visar hur du hämtar niska veze 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 Node.js-konsolapp som tar emot meddelanden om filuppladdning från IoT Hub.

  1. Skapa en tom mapp med namnet fileuploadnotification. Skapa en package.json-fil i mappen fileuploadnotification genom att köra följande kommando i kommandotolken. Acceptera alla standardvärden:

    npm init
    
  2. Kör följande kommando i kommandotolken i fileuploadnotification mappen för att installera SDK-paketet azure-iothub :

    npm install azure-iothub --save
    
  3. Skapa en FileUploadNotification.js fil i fileuploadnotification mappen med hjälp av en textredigerare.

  4. Lägg till följande require instruktioner i början av filen FileUploadNotification.js :

    'use strict';
    
    const Client = require('azure-iothub').Client;
    
  5. Läs niska veze för din IoT-hubb från miljön:

    const connectionString = process.env.IOT_HUB_CONNECTION_STRING;
    
  6. Lägg till följande kod för att skapa en tjänstklient från niska veze:

    const serviceClient = Client.fromConnectionString(connectionString);
    
  7. Öppna klienten och använd funktionen getFileNotificationReceiver för att ta emot statusuppdateringar.

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFileNotificationReceiver(function receiveFileUploadNotification(err, receiver){
          if (err) {
            console.error('error getting the file notification receiver: ' + err.toString());
          } else {
            receiver.on('message', function (msg) {
              console.log('File upload from device:')
              console.log(msg.getData().toString('utf-8'));
              receiver.complete(msg, function (err) {
                if (err) {
                  console.error('Could not finish the upload: ' + err.message);
                } else {
                  console.log('Upload complete');
                }
              });
            });
          }
        });
      }
    });
    

    Kommentar

    Om du vill få aviseringar om frånkoppling när du lyssnar på meddelanden om filuppladdning måste du registrera 'error' dig med hjälp receiver.onav . Om du vill fortsätta att ta emot meddelanden om filuppladdning måste du återställa till IoT Hub med hjälp serviceClient.open av metoden .

  8. Spara och stäng filen FileUploadNotification.js .

  9. Lägg till en miljövariabel för din IoT Hub-niska veze. Du kopierade strängen tidigare i Hämta IoT Hub-niska veze.

    • För Windows:

      set IOT_HUB_CONNECTION_STRING={your iot hub connection string}
      
    • För Linux/Bash:

      export IOT_HUB_CONNECTION_STRING="{your iot hub connection string}"
      

Kör programmen

Nu är du redo att köra programmen.

Kör följande kommando i en kommandotolk i fileuploadnotification mappen:

node FileUploadNotification.js

Kör följande kommando i en kommandotolk i fileupload mappen:

node FileUpload.js

Följande utdata kommer från FileUpload-appen när uppladdningen har slutförts:

uploadStreamToBlockBlob success
notifyBlobUploadStatus success

Följande exempelutdata kommer från appen FileUploadNotification när uppladdningen har slutförts:

Service client connected
File upload from device:
{"deviceId":"myDeviceId","blobUri":"https://{your storage account name}.blob.core.windows.net/device-upload-container/myDeviceId/image.png","blobName":"myDeviceId/image.png","lastUpdatedTime":"2021-07-23T23:27:06+00:00","blobSizeInBytes":26214,"enqueuedTimeUtc":"2021-07-23T23:27:07.2580791Z"}

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 samma namn som filen.

    Skärmbild av att visa 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: