Aracılığıyla paylaş


İşleri zamanlama ve yayınlama (Node.js)

Milyonlarca cihazı güncelleştiren işleri zamanlamak ve izlemek için Azure IoT Hub'ı kullanın. İşleri kullanarak:

  • İstenen özellikleri güncelleştirme
  • Etiketleri güncelleştirme
  • Doğrudan yöntemleri çağırma

Kavramsal olarak, bir iş bu eylemlerden birini sarmalar ve yürütmenin ilerleme durumunu cihaz ikizi sorgusu tarafından tanımlanan bir cihaz kümesine göre izler. Örneğin bir arka uç uygulaması, bir cihaz ikizi sorgusu tarafından belirtilen ve gelecekteki bir zamanda zamanlanan 10.000 cihazda yeniden başlatma yöntemini çağırmak için bir iş kullanabilir. Bu uygulama daha sonra bu cihazların her biri yeniden başlatma yöntemini alıp yürütürken ilerleme durumunu izleyebilir.

Bu özelliklerin her biri hakkında daha fazla bilgiyi şu makalelerde bulabilirsiniz:

Not

Bu makalede açıklanan özellikler yalnızca IoT Hub'ın standart katmanında kullanılabilir. Temel ve standart/ücretsiz IoT Hub katmanları hakkında daha fazla bilgi için bkz. Çözümünüz için doğru IoT Hub katmanını seçme.

Bu makalede iki Node.js uygulaması oluşturma gösterilmektedir:

  • simDevice.js Node.js sanal cihaz uygulaması, arka uç uygulaması tarafından çağrılabilen lockDoor adlı doğrudan bir yöntem uygular.

  • İki iş oluşturan scheduleJobService.js Node.js konsol uygulaması. Bir iş lockDoor doğrudan yöntemini çağırır ve başka bir iş de istenen özellik güncelleştirmelerini birden çok cihaza gönderir.

Not

Hem cihaz hem de arka uç uygulamaları oluşturmak için kullanılabilen SDK araçları hakkında daha fazla bilgi için bkz . Azure IoT SDK'ları .

Önkoşullar

  • Azure aboneliğinizde bir IoT hub'ı. Henüz bir hub'ına sahip değilseniz IoT hub'ı oluşturma makalesindeki adımları izleyebilirsiniz.

  • IoT hub'ınıza kayıtlı bir cihaz. IoT hub'ınızda bir cihaz yoksa Cihazı kaydetme bölümünde yer alan adımları izleyin.

  • Node.js sürüm 10.0.x veya üzeri. Geliştirme ortamınızı hazırlama, windows veya Linux'ta bu makale için Node.js nasıl yükleneceğini açıklar.

  • Güvenlik duvarınızda 8883 numaralı bağlantı noktasının açık olduğundan emin olun. 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ğlanma.

Sanal cihaz uygulaması oluşturma

Bu bölümde, bulut tarafından çağrılan ve sanal bir lockDoor yöntemini tetikleyen doğrudan bir yönteme yanıt veren bir Node.js konsol uygulaması oluşturacaksınız.

Önemli

Bu makale, simetrik anahtar kimlik doğrulaması olarak da adlandırılan paylaşılan erişim imzasını kullanarak bir cihazı bağlama adımlarını içerir. Bu kimlik doğrulama yöntemi test ve değerlendirme için uygundur, ancak X.509 sertifikalarını kullanarak bir cihazın kimliğini doğrulamak daha güvenli bir yaklaşımdır. Daha fazla bilgi edinmek için bkz . En iyi güvenlik yöntemleri > Bağlantı güvenliği.

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

    npm init
    
  2. simDevice klasöründeki komut isteminde aşağıdaki komutu çalıştırarak azure-iot-device Device SDK paketini ve azure-iot-device-mqtt paketini yükleyin:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Metin düzenleyicisi kullanarak simDevice klasöründe yeni bir simDevice.js dosyası oluşturun.

  4. simDevice.js dosyasının başlangıcına aşağıdaki 'require' deyimlerini ekleyin:

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Bir connectionString değişkeni ekleyin ve bir İstemci örneği oluşturmak için bunu kullanın. {yourDeviceConnectionString} Yer tutucu değerini daha önce kopyaladığınız cihaz bağlantı dizesi değiştirin.

    var connectionString = '{yourDeviceConnectionString}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. lockDoor yöntemini işlemek için aşağıdaki işlevi ekleyin.

    var onLockDoor = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, function(err) {
            if (err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        console.log('Locking Door!');
    };
    
  7. lockDoor yöntemi için işleyiciyi kaydetmek için aşağıdaki kodu ekleyin.

    client.open(function(err) {
         if (err) {
             console.error('Could not connect to IotHub client.');
         }  else {
             console.log('Client connected to IoT Hub. Register handler for lockDoor direct method.');
             client.onDeviceMethod('lockDoor', onLockDoor);
         }
    });
    
  8. simDevice.js dosyasını kaydedin ve kapatın.

Not

İşleri basit tutmak için bu makalede yeniden deneme ilkesi uygulanmaz. Üretim kodunda Geçici Hata İşleme makalesinde önerilen yeniden deneme ilkelerini (üstel geri alma gibi) uygulamanız gerekir.

IoT Hub bağlantı dizesi alma

Bu makalede, bir cihazda doğrudan yöntem çağırmak için bir iş zamanlayan, cihaz ikizini güncelleştirmek için bir iş zamanlayan ve her işin ilerleme durumunu izleyen bir arka uç hizmeti oluşturacaksınız. Bu işlemleri gerçekleştirmek için hizmetinizin kayıt defteri okuma ve kayıt defteri yazma izinlerine sahip olması gerekir. Varsayılan olarak, her IoT hub'ı bu izinleri veren registryReadWrite adlı bir paylaşılan erişim ilkesiyle oluşturulur.

registryReadWrite ilkesine yönelik 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. Hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

  3. İlke listesinden registryReadWrite ilkesini seçin.

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

    bağlantı dizesi nasıl alındığını 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.

Önemli

Bu makale, paylaşılan erişim imzası kullanarak hizmete bağlanma adımlarını içerir. Bu kimlik doğrulama yöntemi test ve değerlendirme için uygundur, ancak Microsoft Entra ID veya yönetilen kimliklerle bir hizmette kimlik doğrulaması yapmak daha güvenli bir yaklaşımdır. Daha fazla bilgi edinmek için bkz . En iyi güvenlik yöntemleri > Bulut güvenliği.

Doğrudan yöntem çağırmak ve cihaz ikizlerinin özelliklerini güncelleştirmek için işleri zamanlama

Bu bölümde, doğrudan bir yöntem kullanarak bir cihazda uzaktan lockDoor başlatan ve cihaz ikizinin özelliklerini güncelleştiren bir Node.js konsol uygulaması oluşturacaksınız.

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

    npm init
    
  2. scheduleJobService klasöründeki komut isteminizde aşağıdaki komutu çalıştırarak azure-iothub Cihaz SDK'sı paketini ve azure-iot-device-mqtt paketini yükleyin:

    npm install azure-iothub uuid --save
    
  3. Metin düzenleyicisi kullanarak scheduleJobService klasöründe yeni bir scheduleJobService.js dosyası oluşturun.

  4. scheduleJobService.js dosyasının başlangıcına aşağıdaki 'require' deyimlerini ekleyin:

    'use strict';
    
    var uuid = require('uuid');
    var JobClient = require('azure-iothub').JobClient;
    
  5. Aşağıdaki değişken bildirimlerini ekleyin. {iothubconnectionstring} Yer tutucu değerini IoT hub'ını alma bağlantı dizesi kopyaladığınız değerle değiştirin. myDeviceId değerinden farklı bir cihaz kaydettiyseniz, sorgu koşulunda değiştirdiğinizden emin olun.

    var connectionString = '{iothubconnectionstring}';
    var queryCondition = "deviceId IN ['myDeviceId']";
    var startTime = new Date();
    var maxExecutionTimeInSeconds =  300;
    var jobClient = JobClient.fromConnectionString(connectionString);
    
  6. İşin yürütülmesini izlemek için kullanılan aşağıdaki işlevi ekleyin:

    function monitorJob (jobId, callback) {
        var jobMonitorInterval = setInterval(function() {
            jobClient.getJob(jobId, function(err, result) {
            if (err) {
                console.error('Could not get job status: ' + err.message);
            } else {
                console.log('Job: ' + jobId + ' - status: ' + result.status);
                if (result.status === 'completed' || result.status === 'failed' || result.status === 'cancelled') {
                clearInterval(jobMonitorInterval);
                callback(null, result);
                }
            }
            });
        }, 5000);
    }
    
  7. Cihaz yöntemini çağıran işi zamanlamak için aşağıdaki kodu ekleyin:

    var methodParams = {
        methodName: 'lockDoor',
        payload: null,
        responseTimeoutInSeconds: 15 // Timeout after 15 seconds if device is unable to process method
    };
    
    var methodJobId = uuid.v4();
    console.log('scheduling Device Method job with id: ' + methodJobId);
    jobClient.scheduleDeviceMethod(methodJobId,
                                queryCondition,
                                methodParams,
                                startTime,
                                maxExecutionTimeInSeconds,
                                function(err) {
        if (err) {
            console.error('Could not schedule device method job: ' + err.message);
        } else {
            monitorJob(methodJobId, function(err, result) {
                if (err) {
                    console.error('Could not monitor device method job: ' + err.message);
                } else {
                    console.log(JSON.stringify(result, null, 2));
                }
            });
        }
    });
    
  8. İşi cihaz ikizini güncelleştirmek üzere zamanlamak için aşağıdaki kodu ekleyin:

    var twinPatch = {
       etag: '*',
       properties: {
           desired: {
               building: '43',
               floor: 3
           }
       }
    };
    
    var twinJobId = uuid.v4();
    
    console.log('scheduling Twin Update job with id: ' + twinJobId);
    jobClient.scheduleTwinUpdate(twinJobId,
                                queryCondition,
                                twinPatch,
                                startTime,
                                maxExecutionTimeInSeconds,
                                function(err) {
        if (err) {
            console.error('Could not schedule twin update job: ' + err.message);
        } else {
            monitorJob(twinJobId, function(err, result) {
                if (err) {
                    console.error('Could not monitor twin update job: ' + err.message);
                } else {
                    console.log(JSON.stringify(result, null, 2));
                }
            });
        }
    });
    
  9. scheduleJobService.js dosyasını kaydedin ve kapatın.

Uygulamaları çalıştırma

Şimdi uygulamaları çalıştırmaya hazırsınız.

  1. simDevice klasöründeki komut isteminde, yeniden başlatma doğrudan yöntemini dinlemeye başlamak için aşağıdaki komutu çalıştırın.

    node simDevice.js
    
  2. ScheduleJobService klasöründeki komut isteminde aşağıdaki komutu çalıştırarak işleri tetikleyip kapıyı kilitleyin ve ikizini güncelleştirin

    node scheduleJobService.js
    
  3. Doğrudan yönteme cihaz yanıtını ve konsolunda iş durumunu görürsünüz.

    Aşağıda, doğrudan yönteme cihaz yanıtı gösterilmektedir:

    Sanal cihaz uygulaması çıkışı

    Aşağıda doğrudan yöntem ve cihaz ikizi güncelleştirmesi için hizmet zamanlama işleri ve tamamlanmaya çalışan işler gösterilmektedir:

    Simülasyon cihazı uygulamasını çalıştırma

Sonraki adımlar

Bu makalede, doğrudan bir yöntem çalıştırmak ve cihaz ikizinin özelliklerini güncelleştirmek için işleri zamanladıysanız.

IoT Hub ve cihaz yönetimi desenlerini keşfetmeye devam etmek için Raspberry Pi 3 B+ Başvuru Görüntüsünü kullanarak Azure IoT Hub için Cihaz Güncelleştirmesi öğreticisindeki bir görüntüyü güncelleştirin.