Fájlok feltöltése az eszközről a felhőbe az Azure IoT Hub használatával (Node.js)

Ez a cikk bemutatja, hogyan tölthet fel fájlokat az IoT Hub az Azure Blob Storage-ba a Node.js használatával.

Az eszközről az IoT Hubra irányuló telemetriai adatok küldése rövid útmutatója és a felhőből az eszközre irányuló üzenetek küldése IoT Hub-cikkekkel az IoT Hub alapvető eszközről felhőbe és felhőről eszközre üzenetkezelési funkcióját mutatja be. Az Üzenet-útválasztás konfigurálása az IoT Hub használatával oktatóanyag bemutatja az eszközről a felhőbe irányuló üzenetek megbízható tárolásának módját a Microsoft Azure Blob Storage-ban. Bizonyos esetekben azonban nem lehet egyszerűen leképezni azokat az adatokat, amelyeket az eszközök az IoT Hub által elfogadott, viszonylag kis méretű, eszközről felhőbe irányuló üzenetekbe küldenek. Példa:

  • Videók
  • Képeket tartalmazó nagyméretű fájlok
  • Nagy gyakorisággal mintavételezett rezgési adatok
  • Az előre feldolgozott adatok valamilyen formája.

Ezeket a fájlokat általában a felhőben, olyan eszközökkel dolgozzák fel, mint az Azure Data Factory vagy a Hadoop-verem . Ha egy eszközről fel kell készítenie a fájlokat, továbbra is használhatja az IoT Hub biztonságát és megbízhatóságát. Ez a cikk bemutatja, hogyan.

A cikk végén két Node.js konzolalkalmazást futtat:

  • FileUpload.js, amely feltölt egy fájlt a tárolóba az IoT Hub által biztosított SAS URI használatával.

  • FileUploadNotification.js, amely fájlfeltöltési értesítéseket kap az IoT Hubtól.

Feljegyzés

Az IoT Hub számos eszközplatformot és nyelvet (például C, Java, Python és JavaScript) támogat az Azure IoT-eszköz SDK-kkal. Az eszköz Azure IoT Hubhoz való csatlakoztatásáról az Azure IoT Developer Centerben olvashat.

Fontos

Az X.509 hitelesítésszolgáltatói (CA) hitelesítést használó eszközökön a fájlfeltöltési funkció nyilvános előzetes verzióban érhető el, és engedélyezni kell az előnézeti módot. Általánosan elérhető x.509 ujjlenyomat-hitelesítést vagy X.509-tanúsítványigazolást használó eszközökön az Azure Device Provisioning Service-ben. Az IoT Hub x.509-hitelesítésével kapcsolatos további információkért lásd a támogatott X.509-tanúsítványokat.

Előfeltételek

  • Egy IoT Hub. Hozzon létre egyet a parancssori felülettel vagy az Azure Portallal.

  • Regisztrált eszköz. Regisztráljon egyet az Azure Portalon.

  • Node.js 10.0.x vagy újabb verziót. Az LTS-verzió használata ajánlott. A nodejs.org Node.js töltheti le.

  • A 8883-as portnak nyitva kell lennie a tűzfalon. A cikkben szereplő eszközminta MQTT protokollt használ, amely a 8883-es porton keresztül kommunikál. Ez a port néhány vállalati és oktatási hálózati környezetben blokkolható. További információkért és a probléma megoldásának módjaiért tekintse meg az IoT Hubra (MQTT) való Csatlakozás.

Azure Storage-fiók társítása az IoT Hubhoz

Ha fájlokat szeretne feltölteni egy eszközről, rendelkeznie kell az IoT Hubhoz társított Azure Storage-fiókkal és Azure Blob Storage-tárolóval. Miután hozzárendelte a tárfiókot és a tárolót az IoT Hubhoz, az IoT Hub képes biztosítani az SAS URI elemeit, amikor egy eszköz kéri. Az eszköz ezután ezeket az elemeket használhatja az Azure Storage-hitelesítéshez használt SAS URI létrehozásához és fájlok blobtárolóba való feltöltéséhez.

Azure Storage-fiók társítása az IoT Hubhoz:

  1. A Központi beállítások területen válassza a Fájlfeltöltés lehetőséget az IoT Hub bal oldali paneljén.

    Képernyőfelvétel a portál fájlfeltöltési beállításainak kiválasztásával.

  2. A Fájlfeltöltés panelen válassza az Azure Storage Container lehetőséget. Ebben a cikkben javasoljuk, hogy a tárfiók és az IoT Hub ugyanabban a régióban legyen.

    • Ha már van használni kívánt tárfiókja, jelölje ki a listából.

    • Új tárfiók létrehozásához válassza a +Tárfiók lehetőséget. Adjon nevet a tárfióknak, és győződjön meg arról, hogy a hely az IoT Hubéval azonos régióra van állítva, majd válassza az OK gombot. Az új fiók ugyanabban az erőforráscsoportban jön létre, mint az IoT Hub. Amikor az üzembe helyezés befejeződött, válassza ki a tárfiókot a listából.

    A tárfiók kiválasztása után megnyílik a Tárolók panel.

  3. A Tárolók panelen válassza ki a blobtárolót.

    • Ha már rendelkezik használni kívánt blobtárolóval, jelölje ki a listából, és kattintson a Kiválasztás gombra.

    • Új blobtároló létrehozásához válassza a + Tároló lehetőséget. Adja meg az új tároló nevét. A cikk alkalmazásában az összes többi mezőt az alapértelmezett értéken hagyhatja. Válassza a Létrehozás lehetőséget. Amikor az üzembe helyezés befejeződött, válassza ki a tárolót a listából, és kattintson a Kiválasztás gombra.

  4. A Fájlfeltöltés panelen ellenőrizze, hogy a fájlértesítések be vannak-e kapcsolva. Az összes többi beállítást az alapértelmezett értékükön hagyhatja meg. Válassza a Mentés lehetőséget, és várja meg, amíg a beállítások befejeződnek, mielőtt továbblépne a következő szakaszra.

    Képernyőfelvétel a fájlfeltöltési beállítások megerősítéséről a portálon.

Az Azure Storage-fiók létrehozásával kapcsolatos részletesebb útmutatásért lásd : Tárfiók létrehozása. A tárfiókok és blobtárolók IoT Hubhoz való társítására vonatkozó részletesebb útmutatásért lásd : Fájlfeltöltések konfigurálása az Azure Portal használatával.

Fájl feltöltése eszközalkalmazásból

Ebben a szakaszban egy eszközalkalmazást hoz létre, amely feltölt egy fájlt az IoT Hubra. A kód az Azure IoT Node.js SDK-eszközminták upload_to_blob_advanced.js mintájában elérhető kódon alapul.

  1. Hozzon létre egy fileupload nevű üres mappát. A(z) fileupload mappában hozzon létre egy package.json fájlt úgy, hogy beírja a következő parancsot a parancssorba. Fogadja el az összes alapértelmezett beállítást:

    npm init
    
  2. A mappában található parancssorban fileupload futtassa a következő parancsot az azure-iot-device Device SDK, az azure-iot-device-mqtt és a @azure/storage-blob csomagok telepítéséhez:

    npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save
    
  3. Szövegszerkesztővel hozzon létre egy FileUpload.js fájlt a fileupload mappában, és másolja be a következő kódot.

    '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. Mentse és zárja be a FileUpload.js fájlt.

  5. Másolja a képfájlt a fileupload mappába, és adjon neki egy nevet, például myimage.png.

  6. Adjon hozzá környezeti változókat az eszközhöz kapcsolati sztring és a feltölteni kívánt fájl elérési útját. Az eszköz kapcsolati sztring, amikor regisztrált egy eszközt az IoT Hubon.

    • Windows esetén:

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

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

Az IoT Hub kapcsolati sztring lekérése

Ebben a cikkben egy háttérszolgáltatást hoz létre a létrehozott IoT Hub fájlfeltöltési értesítési üzeneteinek fogadásához. A fájlfeltöltési értesítési üzenetek fogadásához a szolgáltatásnak a szolgáltatás csatlakoztatási engedélyére van szüksége. Alapértelmezés szerint minden IoT Hub egy megosztott hozzáférési szabályzattal jön létre, amely ezt az engedélyt biztosítja.

Az IoT Hub kapcsolati sztring szolgáltatásszabályzathoz való lekéréséhez kövesse az alábbi lépéseket:

  1. Az Azure Portalon válassza ki az Erőforráscsoportokat. Válassza ki azt az erőforráscsoportot, ahol a központ található, majd válassza ki a központot az erőforrások listájából.

  2. Az IoT Hub bal oldali ablaktábláján válassza a Megosztott hozzáférési szabályzatok lehetőséget.

  3. A szabályzatok listájában válassza ki a szolgáltatásházirendet.

  4. Másolja ki az elsődleges kapcsolati sztring, és mentse az értéket.

Képernyőkép arról, hogyan kérhető le a kapcsolati sztring az IoT Hubról az Azure Portalon.

További információ az IoT Hub megosztott hozzáférési szabályzatairól és engedélyeiről: Hozzáférés-vezérlés és engedélyek.

Fájlfeltöltési értesítés fogadása

Ebben a szakaszban egy Node.js konzolalkalmazást hoz létre, amely fájlfeltöltési értesítési üzeneteket fogad az IoT Hubtól.

  1. Hozzon létre egy fileuploadnotification nevű üres mappát. A(z) fileuploadnotification mappában hozzon létre egy package.json fájlt úgy, hogy beírja a következő parancsot a parancssorba. Fogadja el az összes alapértelmezett beállítást:

    npm init
    
  2. A mappában található parancssorban fileuploadnotification futtassa a következő parancsot az azure-iothub SDK-csomag telepítéséhez:

    npm install azure-iothub --save
    
  3. Szövegszerkesztővel hozzon létre egy FileUploadNotification.js fájlt a fileuploadnotification mappában.

  4. Adja hozzá a következő require utasításokat a FileUploadNotification.js fájl elején:

    'use strict';
    
    const Client = require('azure-iothub').Client;
    
  5. Olvassa el az IoT Hub kapcsolati sztring a környezetből:

    const connectionString = process.env.IOT_HUB_CONNECTION_STRING;
    
  6. Adja hozzá a következő kódot egy szolgáltatásügyfél létrehozásához a kapcsolati sztring:

    const serviceClient = Client.fromConnectionString(connectionString);
    
  7. Nyissa meg az ügyfelet, és használja a getFileNotificationReceiver függvényt az állapotfrissítések fogadásához.

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

    Feljegyzés

    Ha leválasztási értesítéseket szeretne kapni, miközben a fájlfeltöltési értesítéseket figyeli, regisztrálnia 'error' kell a következő használatával receiver.on: . A fájlfeltöltési értesítések fogadásához a módszerrel újra kell csatlakoznia az serviceClient.open IoT Hubhoz.

  8. Mentse és zárja be a FileUploadNotification.js fájlt.

  9. Adjon hozzá egy környezeti változót az IoT Hub kapcsolati sztring. Ezt a sztringet korábban átmásolta az IoT Hub lekérése kapcsolati sztring.

    • Windows esetén:

      set IOT_HUB_CONNECTION_STRING={your iot hub connection string}
      
    • Linux/Bash esetén:

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

Az alkalmazások futtatása

Most már készen áll az alkalmazások futtatására.

Futtassa a következő parancsot a fileuploadnotification mappában található parancssorban:

node FileUploadNotification.js

Futtassa a következő parancsot a fileupload mappában található parancssorban:

node FileUpload.js

A következő kimenet a FileUpload alkalmazásból származik, miután a feltöltés befejeződött:

uploadStreamToBlockBlob success
notifyBlobUploadStatus success

A következő mintakimenet a FileUploadNotification alkalmazásból származik a feltöltés befejezése utá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"}

A fájlfeltöltés ellenőrzése

A portálon megtekintheti a feltöltött fájlt a konfigurált tárolóban:

  1. Lépjen a tárfiókjára az Azure Portalon.

  2. A tárfiók bal oldali ablaktábláján válassza a Tárolók lehetőséget.

  3. Válassza ki azt a tárolót, amelybe feltöltötte a fájlt.

  4. Válassza ki az eszközről elnevezett mappát.

  5. Válassza ki azt a blobot, amelybe feltöltötte a fájlt. Ebben a cikkben a fájl nevével megegyező nevű blobról van szó.

    Képernyőkép a feltöltött fájl Azure Portalon való megtekintéséről.

  6. A megnyíló lapon megtekintheti a blobtulajdonságokat. A Letöltés lehetőséget választva letöltheti a fájlt, és megtekintheti annak tartalmát helyileg.

Következő lépések

Ebben a cikkben megismerhette, hogyan egyszerűsítheti az eszközökről történő fájlfeltöltést az IoT Hub fájlfeltöltési funkciójával. Ezt a funkciót a következő cikkekkel folytathatja: