Share via


Bestanden uploaden van uw apparaat naar de cloud met Azure IoT Hub (Node.js)

In dit artikel wordt beschreven hoe u mogelijkheden voor het uploaden van bestanden van IoT Hub een bestand uploadt naar Azure Blob Storage met behulp van Node.js.

De quickstart voor het verzenden van telemetrie van een apparaat naar een IoT Hub en cloud-naar-apparaat-berichten verzenden met IoT Hub-artikelen tonen de basisfunctionaliteit voor apparaat-naar-cloud- en cloud-naar-apparaatberichten van IoT Hub. In de zelfstudie Berichtroutering configureren met IoT Hub ziet u een manier om apparaat-naar-cloud-berichten betrouwbaar op te slaan in Microsoft Azure Blob Storage. In sommige scenario's kunt u echter niet eenvoudig de gegevens toewijzen die uw apparaten verzenden naar de relatief kleine apparaat-naar-cloud-berichten die IoT Hub accepteert. Voorbeeld:

  • Video's
  • Grote bestanden die afbeeldingen bevatten
  • Voorbeeld van trillingsgegevens met hoge frequentie
  • Een vorm van vooraf verwerkte gegevens.

Deze bestanden worden doorgaans in batches verwerkt in de cloud, met behulp van hulpprogramma's zoals Azure Data Factory of de Hadoop-stack . Wanneer u bestanden van een apparaat wilt opslaan, kunt u nog steeds de beveiliging en betrouwbaarheid van IoT Hub gebruiken. In dit artikel wordt uitgelegd hoe u dit doet.

Aan het einde van dit artikel voert u twee Node.js console-apps uit:

  • FileUpload.js, waarmee een bestand naar de opslag wordt geüpload met behulp van een SAS-URI die wordt geleverd door uw IoT-hub.

  • FileUploadNotification.js, die meldingen over het uploaden van bestanden ontvangt van uw IoT-hub.

Notitie

IoT Hub ondersteunt veel apparaatplatformen en -talen (waaronder C, Java, Python en JavaScript) via Azure IoT-apparaat-SDK's. Raadpleeg het Azure IoT Developer Center voor meer informatie over het verbinden van uw apparaat met Azure IoT Hub.

Belangrijk

De functionaliteit voor het uploaden van bestanden op apparaten die X.509-verificatie (CA) gebruiken, is in openbare preview en de preview-modus moet zijn ingeschakeld. Het is algemeen beschikbaar op apparaten die gebruikmaken van X.509-vingerafdrukverificatie of X.509-certificaatattestation met Azure Device Provisioning Service. Zie Ondersteunde X.509-certificaten voor meer informatie over X.509-verificatie met IoT Hub.

Vereisten

  • Een IoT-hub. Maak er een met de CLI of Azure Portal.

  • Een geregistreerd apparaat. Registreer er een in Azure Portal.

  • Node.js versie 10.0.x of hoger. De LTS-versie wordt aanbevolen. U kunt Node.js downloaden van nodejs.org.

  • Poort 8883 moet zijn geopend in uw firewall. Het apparaatvoorbeeld in dit artikel maakt gebruik van het MQTT-protocol, dat via poort 8883 communiceert. Deze poort is in sommige netwerkomgevingen van bedrijven en onderwijsinstellingen mogelijk geblokkeerd. Zie Verbinding maken met IoT Hub (MQTT) voor meer informatie en manieren om dit probleem te omzeilen.

Een Azure Storage-account koppelen aan IoT Hub

Als u bestanden vanaf een apparaat wilt uploaden, moet u een Azure Storage-account en een Azure Blob Storage-container hebben die is gekoppeld aan uw IoT-hub. Zodra u het opslagaccount en de container aan uw IoT-hub hebt gekoppeld, kan uw IoT-hub de elementen van een SAS-URI opgeven wanneer dit door een apparaat wordt aangevraagd. Het apparaat kan deze elementen vervolgens gebruiken om de SAS-URI te maken die wordt gebruikt om te verifiëren met Azure Storage en bestanden te uploaden naar de blobcontainer.

Een Azure Storage-account koppelen aan uw IoT-hub:

  1. Selecteer onder Hub-instellingen het uploaden van bestanden in het linkerdeelvenster van uw IoT-hub.

    Schermopname met de instellingen voor het uploaden van bestanden in de portal.

  2. Selecteer Azure Storage-container in het deelvenster Bestand uploaden. Voor dit artikel wordt aanbevolen dat uw opslagaccount en IoT Hub zich in dezelfde regio bevinden.

    • Als u al een opslagaccount hebt dat u wilt gebruiken, selecteert u dit in de lijst.

    • Als u een nieuw opslagaccount wilt maken, selecteert u +Storage-account. Geef een naam op voor het opslagaccount en zorg ervoor dat de locatie is ingesteld op dezelfde regio als uw IoT-hub en selecteer VERVOLGENS OK. Het nieuwe account wordt gemaakt in dezelfde resourcegroep als uw IoT-hub. Wanneer de implementatie is voltooid, selecteert u het opslagaccount in de lijst.

    Nadat u het opslagaccount hebt geselecteerd, wordt het deelvenster Containers geopend.

  3. Selecteer in het deelvenster Containers de blobcontainer.

    • Als u al een blobcontainer hebt die u wilt gebruiken, selecteert u deze in de lijst en klikt u op Selecteren.

    • Als u een nieuwe blobcontainer wilt maken, selecteert u + Container. Geef een naam op voor de nieuwe container. Voor de doeleinden van dit artikel kunt u alle andere velden op hun standaardwaarde laten staan. Selecteer Maken. Wanneer de implementatie is voltooid, selecteert u de container in de lijst en klikt u op Selecteren.

  4. Controleer of bestandsmeldingen zijn ingesteld op Aan in het deelvenster Bestand uploaden. U kunt alle andere instellingen op de standaardinstellingen laten staan. Selecteer Opslaan en wacht totdat de instellingen zijn voltooid voordat u verdergaat met de volgende sectie.

    Schermopname met instellingen voor het uploaden van bestanden bevestigen in de portal.

Zie Een opslagaccount maken voor gedetailleerdere instructies voor het maken van een Azure Storage-account. Zie Bestandsuploads configureren met behulp van Azure Portal voor gedetailleerde instructies over het koppelen van een opslagaccount en blobcontainer aan een IoT-hub.

Een bestand uploaden vanuit een apparaat-app

In deze sectie maakt u een apparaat-app om een bestand te uploaden naar IoT Hub. De code is gebaseerd op code die beschikbaar is in het upload_to_blob_advanced.js-voorbeeld in de Azure IoT Node.js SDK-apparaatvoorbeelden .

  1. Maak een lege map met de naam fileupload. Maak in de map fileupload een package.json-bestand door achter de opdrachtprompt de volgende opdracht op te geven. Accepteer alle standaardwaarden:

    npm init
    
  2. Voer bij de opdrachtprompt in de fileupload map de volgende opdracht uit om de SDK voor azure-iot-device Device, de azure-iot-device-mqtt en de @azure/storage-blob-pakketten te installeren:

    npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save
    
  3. Maak met behulp van een teksteditor een FileUpload.js-bestand in de fileupload map en kopieer de volgende code erin.

    '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. Sla het FileUpload.js bestand op en sluit het.

  5. Kopieer een afbeeldingsbestand naar de fileupload map en geef het een naam, zoals myimage.png.

  6. Voeg omgevingsvariabelen toe voor uw apparaat verbindingsreeks en het pad naar het bestand dat u wilt uploaden. U hebt het apparaat verbindingsreeks wanneer u een apparaat hebt geregistreerd in de IoT-hub.

    • Voor Windows:

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

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

De IoT Hub-verbindingsreeks ophalen

In dit artikel maakt u een back-endservice voor het ontvangen van meldingsberichten over het uploaden van bestanden van de IoT-hub die u hebt gemaakt. Voor het ontvangen van meldingsberichten voor het uploaden van bestanden heeft uw service de machtiging voor serviceverbinding nodig. Standaard wordt elke IoT Hub gemaakt met een gedeeld toegangsbeleid met de naam service die deze machtiging verleent.

Voer de volgende stappen uit om de IoT Hub-verbindingsreeks voor het servicebeleid op te halen:

  1. Selecteer resourcegroepen in de Azure-portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.

  2. Selecteer in het linkerdeelvenster van uw IoT-hub beleid voor gedeelde toegang.

  3. Selecteer het servicebeleid in de lijst met beleidsregels.

  4. Kopieer de primaire verbindingsreeks en sla de waarde op.

Schermopname die laat zien hoe u de verbindingsreeks ophaalt uit uw IoT Hub in Azure Portal.

Zie Toegangsbeheer en machtigingen voor meer informatie over beleid en machtigingen voor gedeelde toegang van IoT Hub.

Een melding voor het uploaden van bestanden ontvangen

In deze sectie maakt u een Node.js console-app die meldingsberichten over het uploaden van bestanden van IoT Hub ontvangt.

  1. Maak een lege map met de naam fileuploadnotification. Maak in de map fileuploadnotification een package.json-bestand door achter de opdrachtprompt de volgende opdracht op te geven. Accepteer alle standaardwaarden:

    npm init
    
  2. Voer bij de opdrachtprompt in de fileuploadnotification map de volgende opdracht uit om het pakket azure-iothub SDK te installeren:

    npm install azure-iothub --save
    
  3. Maak met behulp van een teksteditor een FileUploadNotification.js bestand in de fileuploadnotification map.

  4. Voeg de volgende require instructies toe aan het begin van het bestand FileUploadNotification.js :

    'use strict';
    
    const Client = require('azure-iothub').Client;
    
  5. Lees de verbindingsreeks voor uw IoT-hub vanuit de omgeving:

    const connectionString = process.env.IOT_HUB_CONNECTION_STRING;
    
  6. Voeg de volgende code toe om een serviceclient te maken op basis van de verbindingsreeks:

    const serviceClient = Client.fromConnectionString(connectionString);
    
  7. Open de client en gebruik de functie getFileNotificationReceiver om statusupdates te ontvangen.

    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');
                }
              });
            });
          }
        });
      }
    });
    

    Notitie

    Als u meldingen voor verbinding verbreken wilt ontvangen terwijl u luistert naar meldingen voor het uploaden van bestanden, moet u zich registreren 'error' met behulp van receiver.on. Als u meldingen voor het uploaden van bestanden wilt blijven ontvangen, moet u met behulp van de serviceClient.open methode opnieuw verbinding maken met IoT Hub.

  8. Sla het FileUploadNotification.js bestand op en sluit het.

  9. Voeg een omgevingsvariabele toe voor uw IoT Hub-verbindingsreeks. U hebt deze tekenreeks eerder gekopieerd in De IoT-hub ophalen verbindingsreeks.

    • Voor Windows:

      set IOT_HUB_CONNECTION_STRING={your iot hub connection string}
      
    • Voor Linux/Bash:

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

De toepassingen uitvoeren

U bent nu klaar om de toepassingen uit te voeren.

Voer bij een opdrachtprompt in de fileuploadnotification map de volgende opdracht uit:

node FileUploadNotification.js

Voer bij een opdrachtprompt in de fileupload map de volgende opdracht uit:

node FileUpload.js

De volgende uitvoer is afkomstig van de FileUpload-app nadat het uploaden is voltooid:

uploadStreamToBlockBlob success
notifyBlobUploadStatus success

De volgende voorbeelduitvoer is afkomstig van de FileUploadNotification-app nadat het uploaden is voltooid:

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"}

Het uploaden van bestanden controleren

U kunt de portal gebruiken om het geüploade bestand weer te geven in de opslagcontainer die u hebt geconfigureerd:

  1. Navigeer naar uw opslagaccount in Azure Portal.

  2. Selecteer Containers in het linkerdeelvenster van uw opslagaccount.

  3. Selecteer de container waarnaar u het bestand hebt geüpload.

  4. Selecteer de map met de naam van uw apparaat.

  5. Selecteer de blob waarnaar u het bestand hebt geüpload. In dit artikel is het de blob met dezelfde naam als uw bestand.

    Schermopname van het weergeven van het geüploade bestand in Azure Portal.

  6. Bekijk de blobeigenschappen op de pagina die wordt geopend. U kunt Downloaden selecteren om het bestand te downloaden en de inhoud lokaal weer te geven.

Volgende stappen

In dit artikel hebt u geleerd hoe u de functie voor het uploaden van bestanden van IoT Hub gebruikt om het uploaden van bestanden vanaf apparaten te vereenvoudigen. U kunt deze functie blijven verkennen met de volgende artikelen: