Sdílet prostřednictvím


Nahrání souborů ze zařízení do cloudu pomocí Azure IoT Hubu (Node.js)

Tento článek ukazuje, jak pomocí Node.js nahrát možnosti nahrávání souborů služby IoT Hub do úložiště objektů blob v Azure.

Rychlé zprovoznění odesílání telemetrických dat ze zařízení do centra IoT a odesílání zpráv typu cloud-zařízení pomocí služby IoT Hub ukazují základní funkce zasílání zpráv typu zařízení-cloud a cloud-zařízení ve službě IoT Hub. Kurz Konfigurace směrování zpráv se službou IoT Hub ukazuje způsob spolehlivého ukládání zpráv typu zařízení-cloud v úložišti objektů blob Microsoft Azure. V některých scénářích ale nemůžete snadno namapovat data, která zařízení odesílají, do relativně malých zpráv typu zařízení-cloud, které IoT Hub přijímá. Příklad:

  • Videa
  • Velké soubory obsahující obrázky
  • Data kmitání vzorkovaná ve vysoké frekvenci
  • Nějaká forma předem zpracovaných dat.

Tyto soubory se obvykle dávkově zpracovávají v cloudu pomocí nástrojů, jako je Azure Data Factory nebo stack Hadoop . Pokud potřebujete z zařízení ukládat soubory do vnitrozemí, můžete dál používat zabezpečení a spolehlivost ioT Hubu. V tomto článku se dozvíte, jak na to.

Na konci tohoto článku spustíte dvě Node.js konzolové aplikace:

  • FileUpload.js, který nahraje soubor do úložiště pomocí identifikátoru URI SAS poskytnutého centrem IoT.

  • FileUploadNotification.js, která přijímá oznámení o nahrávání souborů z vašeho centra IoT.

Poznámka:

IoT Hub podporuje mnoho platforem a jazyků zařízení (včetně C, Javy, Pythonu a JavaScriptu) prostřednictvím sad SDK pro zařízení Azure IoT. Informace o připojení zařízení k Azure IoT Hubu najdete v Centru pro vývojáře Azure IoT.

Důležité

Funkce nahrávání souborů na zařízeních, která používají ověřování certifikační autority (CA) X.509, je ve verzi Public Preview a musí být povolený režim náhledu. Je obecně dostupná na zařízeních, která používají ověřování kryptografického otisku X.509 nebo ověření identity certifikátu X.509 se službou Azure Device Provisioning. Další informace o ověřování X.509 ve službě IoT Hub najdete v tématu Podporované certifikáty X.509.

Požadavky

  • IoT Hub. Vytvořte ho pomocí rozhraní příkazového řádku nebo webu Azure Portal.

  • Zařízení zaregistrované ve službě IoT Hub. Pokud ve službě IoT Hub nemáte zařízení, postupujte podle pokynů v části Registrace zařízení.

  • Node.js verze 10.0.x nebo novější. Doporučuje se verze LTS. Node.js si můžete stáhnout z nodejs.org.

  • Port 8883 by měl být otevřený v bráně firewall. Ukázka zařízení v tomto článku používá protokol MQTT, který komunikuje přes port 8883. Tento port může být blokovaný v některých podnikových a vzdělávacích síťových prostředích. Další informace a způsoby řešení tohoto problému najdete v tématu Připojení ke službě IoT Hub (MQTT).

Přidružení účtu Azure Storage ke službě IoT Hub

Pokud chcete nahrát soubory ze zařízení, musíte mít účet Azure Storage a kontejner Azure Blob Storage přidružený k vašemu centru IoT. Jakmile přidružíte účet úložiště a kontejner k centru IoT, může centrum IoT poskytnout prvky identifikátoru URI SAS při vyžádání zařízením. Zařízení pak může tyto prvky použít k vytvoření identifikátoru URI SAS, který používá k ověření ve službě Azure Storage a nahrání souborů do kontejneru objektů blob.

Přidružení účtu Azure Storage k centru IoT:

  1. V části Nastavení centra vyberte Nahrání souboru v levém podokně centra IoT.

    Snímek obrazovky zobrazující nastavení pro výběr nahrání souboru z portálu

  2. V podokně Nahrání souboru vyberte Kontejner služby Azure Storage. Pro účely tohoto článku se doporučuje, aby se váš účet úložiště a IoT Hub nacházely ve stejné oblasti.

    • Pokud už máte účet úložiště, který chcete použít, vyberte ho ze seznamu.

    • Pokud chcete vytvořit nový účet úložiště, vyberte +Storage. Zadejte název účtu úložiště a ujistěte se, že je umístění nastavené na stejnou oblast jako vaše centrum IoT, a pak vyberte OK. Nový účet se vytvoří ve stejné skupině prostředků jako vaše centrum IoT. Po dokončení nasazení vyberte ze seznamu účet úložiště.

    Po výběru účtu úložiště se otevře podokno Kontejnery .

  3. V podokně Kontejnery vyberte kontejner objektů blob.

    • Pokud už máte kontejner objektů blob, který chcete použít, vyberte ho ze seznamu a klikněte na Vybrat.

    • Pokud chcete vytvořit nový kontejner objektů blob, vyberte + Kontejner. Zadejte název nového kontejneru. Pro účely tohoto článku můžete ponechat všechna ostatní pole ve výchozím nastavení. Vyberte Vytvořit. Po dokončení nasazení vyberte v seznamu kontejner a klikněte na Vybrat.

  4. Zpět v podokně Nahrání souboru se ujistěte, že jsou oznámení souborů nastavená na Zapnuto. Všechna ostatní nastavení můžete ponechat ve výchozím nastavení. Než přejdete k další části, vyberte Uložit a počkejte na dokončení nastavení.

    Snímek obrazovky s potvrzením nastavení nahrávání souborů na portálu

Podrobnější pokyny k vytvoření účtu Azure Storage najdete v tématu Vytvoření účtu úložiště. Podrobnější pokyny k přidružení účtu úložiště a kontejneru objektů blob ke službě IoT Hub najdete v tématu Konfigurace nahrávání souborů pomocí webu Azure Portal.

Nahrání souboru z aplikace zařízení

V této části vytvoříte aplikaci zařízení pro nahrání souboru do ioT Hubu. Kód je založený na kódu dostupném v ukázce upload_to_blob_advanced.js v ukázkách zařízení sady Azure IoT Node.js SDK .

  1. Vytvořte prázdnou složku s názvem fileupload. Ve složce fileupload vytvořte soubor package.json pomocí následujícího příkazu na příkazovém řádku. Přijměte všechny výchozí hodnoty:

    npm init
    
  2. Na příkazovém řádku ve fileupload složce spusťte následující příkaz, který nainstaluje sadu azure-iot-device Device SDK, azure-iot-device-mqtt a balíčky @azure/storage-blob :

    npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save
    
  3. Pomocí textového editoru vytvořte ve fileupload složce FileUpload.js soubor a zkopírujte do něj následující kód.

    '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. Uložte a zavřete soubor FileUpload.js .

  5. Zkopírujte soubor obrázku fileupload do složky a pojmenujte ho, například myimage.png.

  6. Přidejte proměnné prostředí pro zařízení připojovací řetězec a cestu k souboru, který chcete nahrát. Zařízení jste získali připojovací řetězec při registraci zařízení v Centru IoT.

    • Pro Windows:

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

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

Získání připojovací řetězec centra IoT

V tomto článku vytvoříte back-endovou službu pro příjem zpráv s oznámením o nahrávání souborů z centra IoT, které jste vytvořili. K příjmu zpráv s oznámením o nahrání souboru potřebuje vaše služba oprávnění pro připojení ke službě. Ve výchozím nastavení se každá služba IoT Hub vytvoří pomocí zásady sdíleného přístupu s názvem služby , která toto oprávnění uděluje.

Pokud chcete získat připojovací řetězec ioT Hubu pro zásady služby, postupujte takto:

  1. Na webu Azure Portal vyberte skupiny prostředků. Vyberte skupinu prostředků, ve které se nachází vaše centrum, a pak vyberte centrum ze seznamu prostředků.

  2. V levém podokně centra IoT vyberte zásady sdíleného přístupu.

  3. V seznamu zásad vyberte zásadu služby .

  4. Zkopírujte primární připojovací řetězec a uložte hodnotu.

Snímek obrazovky znázorňující, jak načíst připojovací řetězec ze služby IoT Hub na webu Azure Portal

Další informace ozásadách

Přijetí oznámení o nahrání souboru

V této části vytvoříte konzolovou aplikaci Node.js, která přijímá zprávy s oznámeními o nahrání souboru ze služby IoT Hub.

  1. Vytvořte prázdnou složku s názvem fileuploadnotification. Ve složce fileuploadnotification vytvořte soubor package.json pomocí následujícího příkazu na příkazovém řádku. Přijměte všechny výchozí hodnoty:

    npm init
    
  2. Na příkazovém řádku ve fileuploadnotification složce spusťte následující příkaz a nainstalujte balíček azure-iothub SDK:

    npm install azure-iothub --save
    
  3. Pomocí textového editoru vytvořte ve fileuploadnotification složce soubor FileUploadNotification.js.

  4. Na začátek souboru FileUploadNotification.js přidejte následující require příkazy:

    'use strict';
    
    const Client = require('azure-iothub').Client;
    
  5. Přečtěte si připojovací řetězec pro centrum IoT z prostředí:

    const connectionString = process.env.IOT_HUB_CONNECTION_STRING;
    
  6. Přidejte následující kód pro vytvoření klienta služby z připojovací řetězec:

    const serviceClient = Client.fromConnectionString(connectionString);
    
  7. Otevřete klienta a pomocí funkce getFileNotificationReceiver obdržíte aktualizace stavu.

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

    Poznámka:

    Pokud chcete dostávat oznámení o odpojení, když nasloucháte nahrání souboru oznámení, musíte se zaregistrovat 'error' pomocí receiver.on. Pokud chcete dál přijímat oznámení o nahrávání souborů, musíte se pomocí této metody znovu připojit ke službě serviceClient.open IoT Hub.

  8. Uložte a zavřete soubor FileUploadNotification.js .

  9. Přidejte proměnnou prostředí pro připojovací řetězec IoT Hubu. Tento řetězec jste zkopírovali dříve v připojovací řetězec Get the IoT Hub.

    • Pro Windows:

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

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

Spuštění aplikací

Teď jste připraveni spustit aplikace.

Na příkazovém řádku ve fileuploadnotification složce spusťte následující příkaz:

node FileUploadNotification.js

Na příkazovém řádku ve fileupload složce spusťte následující příkaz:

node FileUpload.js

Následující výstup pochází z aplikace FileUpload po dokončení nahrávání:

uploadStreamToBlockBlob success
notifyBlobUploadStatus success

Následující ukázkový výstup je z aplikace FileUploadNotification po dokončení nahrávání:

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

Ověření nahrání souboru

Na portálu můžete zobrazit nahraný soubor v kontejneru úložiště, který jste nakonfigurovali:

  1. Na webu Azure Portal přejděte ke svému účtu úložiště.

  2. V levém podokně účtu úložiště vyberte Kontejnery.

  3. Vyberte kontejner, do který jste soubor nahráli.

  4. Vyberte složku pojmenovanou po zařízení.

  5. Vyberte objekt blob, do kterého jste soubor nahráli. V tomto článku se jedná o objekt blob se stejným názvem jako soubor.

    Snímek obrazovky se zobrazením nahraného souboru na webu Azure Portal

  6. Zobrazte vlastnosti objektu blob na stránce, která se otevře. Soubor si můžete stáhnout a zobrazit jeho obsah místně.

Další kroky

V tomto článku jste se dozvěděli, jak pomocí funkce pro nahrání souborů ve službě IoT Hub zjednodušit nahrávání souborů ze zařízení. Tuto funkci můžete dál zkoumat pomocí následujících článků: