Azure IoT Hub (Node.js) ile cihazınızdan buluta dosya yükleme

Bu makalede, Node.js kullanarak IoT Hub'ın dosya yükleme özelliklerinin azure blob depolamaya nasıl yüklendiği gösterilmektedir.

Cihazdan IoT hub'ına telemetri gönderme hızlı başlangıcı ve IoT Hub ile buluttan cihaza iletiler gönderme makalesinde IoT Hub'ın cihazdan buluta ve buluttan cihaza mesajlaşma işlevleri gösterilir. IoT Hub ile İleti Yönlendirmeyi Yapılandırma öğreticisi, cihazdan buluta iletileri Microsoft Azure blob depolama alanında güvenilir bir şekilde depolamanın bir yolunu gösterir. Ancak bazı senaryolarda, cihazlarınızın gönderdiği verileri IoT Hub'ın kabul ettikleri görece küçük cihazdan buluta iletilere kolayca eşleyemezsiniz. Örneğin:

  • Videolar
  • Görüntü içeren büyük dosyalar
  • Yüksek frekansta örneklenen titreşim verileri
  • Önceden işlenmiş verilerin bir biçimi.

Bu dosyalar genellikle Azure Data Factory veya Hadoop yığını gibi araçlar kullanılarak bulutta toplu olarak işlenir. Bir cihazdan dosyaları yukarı aktarmanız gerektiğinde IoT Hub'ın güvenliğini ve güvenilirliğini kullanmaya devam edebilirsiniz. Bu makalede nasıl yapıldığını görebilirsiniz.

Bu makalenin sonunda iki Node.js konsol uygulaması çalıştıracaksınız:

  • ioT hub'ınız tarafından sağlanan SAS URI'sini kullanarak depolamaya dosya yükleyen FileUpload.js.

  • ioT hub'ınızdan dosya yükleme bildirimleri alan FileUploadNotification.js.

Not

IoT Hub, Azure IoT cihaz SDK'ları aracılığıyla birçok cihaz platform ve dilini (C, Java, Python ve JavaScript dahil) destekler. Cihazınızı Azure IoT Hub'a bağlamayı öğrenmek için Azure IoT Geliştirici Merkezi'ne bakın.

Önemli

X.509 sertifika yetkilisi (CA) kimlik doğrulaması kullanan cihazlarda dosya yükleme işlevi genel önizleme aşamasındadır ve önizleme modunun etkinleştirilmesi gerekir. Azure Cihaz Sağlama Hizmeti ile X.509 parmak izi kimlik doğrulaması veya X.509 sertifika kanıtlama kullanan cihazlarda genel olarak kullanılabilir. IoT Hub ile X.509 kimlik doğrulaması hakkında daha fazla bilgi edinmek için bkz . Desteklenen X.509 sertifikaları.

Önkoşullar

  • Bir IoT hub'ı. CLI veya Azure portalı ile bir tane oluşturun.

  • Kayıtlı bir cihaz. Azure portalında bir tane kaydedin.

  • Node.js sürüm 10.0.x veya üzeri. LTS sürümü önerilir. nodejs.org'dan Node.js indirebilirsiniz.

  • Güvenlik duvarınızda 8883 numaralı bağlantı noktası açık olmalıdır. Bu makaledeki cihaz örneği, 8883 numaralı bağlantı noktası üzerinden iletişim kuran MQTT protokollerini kullanır. Bu bağlantı noktası bazı kurumsal ve eğitim ağı ortamlarında engellenebilir. Bu sorunu çözmenin daha fazla bilgi ve yolları için bkz. IoT Hub'a (MQTT) Bağlan.

Azure Depolama hesabını IoT Hub ile ilişkilendirme

Bir cihazdan dosya yüklemek için IoT hub'ınız ile ilişkilendirilmiş bir Azure Depolama hesabınız ve Azure Blob Depolama kapsayıcınız olmalıdır. Depolama hesabını ve kapsayıcıyı IoT hub'ınızla ilişkilendirdikten sonra, IoT hub'ınız bir cihaz tarafından istendiğinde SAS URI'sinin öğelerini sağlayabilir. Cihaz daha sonra azure Depolama kimlik doğrulaması yapmak ve blob kapsayıcısına dosya yüklemek için kullandığı SAS URI'sini oluşturmak için bu öğeleri kullanabilir.

Azure Depolama hesabını IoT hub'ınızla ilişkilendirmek için:

  1. Hub ayarları'nın altında IoT hub'ınızın sol bölmesinden Dosya yükleme'yi seçin.

    Portaldan dosya yükleme ayarlarını seçmeyi gösteren ekran görüntüsü.

  2. Dosya karşıya yükleme bölmesinde Azure Depolama Kapsayıcısı'nı seçin. Bu makale için depolama hesabınızın ve IoT Hub'ınızın aynı bölgede bulunması önerilir.

    • Kullanmak istediğiniz bir depolama hesabınız varsa listeden seçin.

    • Yeni bir depolama hesabı oluşturmak için +Depolama hesabı seçin. Depolama hesabı için bir ad girin ve Konum'un IoT hub'ınız ile aynı bölgeye ayarlandığından emin olun, ardından Tamam'ı seçin. Yeni hesap, IoT hub'ınız ile aynı kaynak grubunda oluşturulur. Dağıtım tamamlandığında, listeden depolama hesabını seçin.

    Depolama hesabını seçtikten sonra Kapsayıcılar bölmesi açılır.

  3. Kapsayıcılar bölmesinde blob kapsayıcısını seçin.

    • Kullanmak istediğiniz bir blob kapsayıcınız zaten varsa, listeden kapsayıcıyı seçin ve Seç'e tıklayın.

    • Yeni bir blob kapsayıcısı oluşturmak için + Kapsayıcı'yı seçin. Yeni kapsayıcı için bir ad belirtin. Bu makalenin amaçları doğrultusunda, diğer tüm alanları varsayılan değerlerinde bırakabilirsiniz. Oluştur'u belirleyin. Dağıtım tamamlandığında, listeden kapsayıcıyı seçin ve Seç'e tıklayın.

  4. Dosya karşıya yükleme bölmesine döndüğünüzde dosya bildirimlerinin Açık olarak ayarlandığından emin olun. Diğer tüm ayarları varsayılan değerlerinde bırakabilirsiniz. Kaydet'i seçin ve sonraki bölüme geçmeden önce ayarların tamamlanmasını bekleyin.

    Portalda dosya yükleme ayarlarını onaylamayı gösteren ekran görüntüsü.

Azure Depolama hesabı oluşturma hakkında daha ayrıntılı yönergeler için bkz. Depolama hesabı oluşturma. Depolama hesabını ve blob kapsayıcısını IoT hub'ı ile ilişkilendirme hakkında daha ayrıntılı yönergeler için bkz . Azure portalını kullanarak dosya yüklemelerini yapılandırma.

Cihaz uygulamasından dosya yükleme

Bu bölümde, IoT hub'ına dosya yüklemek için bir cihaz uygulaması oluşturacaksınız. Kod, Azure IoT Node.js SDK cihaz örneklerindeki upload_to_blob_advanced.js örneğinde bulunan kodu temel alır.

  1. fileupload adlı bir boş klasör oluşturun. Komut isteminizde aşağıdaki komutu kullanarak fileupload klasöründe bir package.json dosyası oluşturun. Tüm varsayılanları kabul edin:

    npm init
    
  2. klasöründeki fileupload komut isteminizde aşağıdaki komutu çalıştırarak azure-iot-device Cihaz SDK'sını, azure-iot-device-mqtt'yi ve @azure/storage-blob paketlerini yükleyin:

    npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save
    
  3. Metin düzenleyicisi kullanarak klasörde bir FileUpload.js dosyası fileupload oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.

    '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. FileUpload.js dosyasını kaydedin ve kapatın.

  5. Klasöre fileupload bir görüntü dosyası kopyalayın ve gibi myimage.pngbir ad verin.

  6. Cihazınızın bağlantı dizesi için ortam değişkenleri ve karşıya yüklemek istediğiniz dosyanın yolunu ekleyin. IoT hub'ına bir cihaz kaydettiğinizde cihaz bağlantı dizesi.

    • Windows için:

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

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

IoT hub'ını bağlantı dizesi alma

Bu makalede, oluşturduğunuz IoT hub'ından dosya karşıya yükleme bildirim iletilerini almak için bir arka uç hizmeti oluşturacaksınız. Dosya karşıya yükleme bildirim iletilerini almak için hizmetinizin hizmet bağlantı iznine sahip olması gerekir. Varsayılan olarak, her IoT Hub bu izni veren hizmet adlı bir paylaşılan erişim ilkesiyle oluşturulur.

Hizmet ilkesi için IoT Hub bağlantı dizesi almak için şu adımları izleyin:

  1. Azure portalında Kaynak grupları'nı seçin. Hub'ınızın bulunduğu kaynak grubunu seçin ve ardından kaynak listesinden hub'ınızı seçin.

  2. IoT hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

  3. İlke listesinden hizmet ilkesini seçin.

  4. Birincil bağlantı dizesi kopyalayın ve değeri kaydedin.

Azure portalında IoT Hub'ınızdan bağlantı dizesi almayı gösteren ekran görüntüsü.

IoT Hub paylaşılan erişim ilkeleri ve izinleri hakkında daha fazla bilgi için bkz . Erişim denetimi ve izinleri.

Karşıya dosya yükleme bildirimi alma

Bu bölümde, IoT Hub'dan dosya karşıya yükleme bildirim iletileri alan bir Node.js konsol uygulaması oluşturacaksınız.

  1. fileuploadnotification adlı bir boş klasör oluşturun. Komut isteminizde aşağıdaki komutu kullanarak fileuploadnotification klasöründe bir package.json dosyası oluşturun. Tüm varsayılanları kabul edin:

    npm init
    
  2. klasöründeki fileuploadnotification komut isteminizde aşağıdaki komutu çalıştırarak azure-iothub SDK paketini yükleyin:

    npm install azure-iothub --save
    
  3. Bir metin düzenleyicisi kullanarak klasörde bir FileUploadNotification.js dosyası fileuploadnotification oluşturun.

  4. FileUploadNotification.js dosyasının başlangıcına aşağıdaki require deyimleri ekleyin:

    'use strict';
    
    const Client = require('azure-iothub').Client;
    
  5. Ortamdan IoT hub'ınızın bağlantı dizesi okuyun:

    const connectionString = process.env.IOT_HUB_CONNECTION_STRING;
    
  6. bağlantı dizesi bir hizmet istemcisi oluşturmak için aşağıdaki kodu ekleyin:

    const serviceClient = Client.fromConnectionString(connectionString);
    
  7. İstemciyi açın ve durum güncelleştirmelerini almak için getFileNotificationReceiver işlevini kullanın.

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

    Not

    Dosya yükleme bildirimlerini dinlerken bağlantı kesme bildirimleri almak istiyorsanız kullanarak kaydolmanız 'error'receiver.ongerekir. Dosya karşıya yükleme bildirimlerini almaya devam etmek için yöntemini kullanarak serviceClient.open IoT Hub'a geri kazanmanız gerekir.

  8. FileUploadNotification.js dosyasını kaydedin ve kapatın.

  9. IoT Hub bağlantı dizesi için bir ortam değişkeni ekleyin. Bu dizeyi daha önce IoT hub'ını alma bağlantı dizesi kopyalamıştınız.

    • Windows için:

      set IOT_HUB_CONNECTION_STRING={your iot hub connection string}
      
    • Linux/Bash için:

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

Uygulamaları çalıştırma

Artık uygulamaları çalıştırmaya hazırsınız.

klasöründeki fileuploadnotification bir komut isteminde aşağıdaki komutu çalıştırın:

node FileUploadNotification.js

klasöründeki fileupload bir komut isteminde aşağıdaki komutu çalıştırın:

node FileUpload.js

Aşağıdaki çıkış, karşıya yükleme tamamlandıktan sonra FileUpload uygulamasından alınmıştır:

uploadStreamToBlockBlob success
notifyBlobUploadStatus success

Aşağıdaki örnek çıktı, karşıya yükleme tamamlandıktan sonra FileUploadNotification uygulamasından alınmıştır:

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

Dosyanın karşıya yüklendiğini doğrulama

Karşıya yüklenen dosyayı yapılandırdığınız depolama kapsayıcısında görüntülemek için portalı kullanabilirsiniz:

  1. Azure portalında depolama hesabınıza gidin.

  2. Depolama hesabınızın sol bölmesinde Kapsayıcılar'ı seçin.

  3. Dosyayı karşıya yüklediğiniz kapsayıcıyı seçin.

  4. Cihazınızın adını taşıyan klasörü seçin.

  5. Dosyanızı karşıya yüklediğiniz blobu seçin. Bu makalede, dosyanızla aynı ada sahip blob bulunur.

    Karşıya yüklenen dosyayı Azure portalında görüntüleme işleminin ekran görüntüsü.

  6. Açılan sayfada blob özelliklerini görüntüleyin. İndir'i seçerek dosyayı indirebilir ve içeriğini yerel olarak görüntüleyebilirsiniz.

Sonraki adımlar

Bu makalede, cihazlardan dosya yükleme işlemini basitleştirmek için IoT Hub'ın dosya yükleme özelliğini kullanmayı öğrendiniz. Aşağıdaki makalelerle bu özelliği keşfetmeye devam edebilirsiniz: