İş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 cihaz ikizi sorgusu tarafından tanımlanan bir cihaz kümesinde yürütmenin ilerleme durumunu izler. Örneğin bir arka uç uygulaması, bir cihaz ikizi sorgusu tarafından belirtilen ve gelecekte 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 aldığında ve 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 standart IoT Hub 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ı seçme.

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

  • simDevice.jsNode.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.jsNode.js konsol uygulaması. Bir iş lockDoor doğrudan yöntemini çağırır ve başka bir iş 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

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

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

  • 10.0.x veya sonraki bir sürümü Node.js. Geliştirme ortamınızı hazırlama , bu makalenin Node.js Windows veya Linux'a 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 bağlanma (MQTT).

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.

  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. komut isteminizde simDevice klasöründe 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ı dizesiyle 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. Geçici Hata İşleme makalesinde önerilen şekilde üretim kodunda yeniden deneme ilkeleri (üstel geri çekilme gibi) uygulamanız gerekir.

IoT Hub bağlantı dizesini 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 ilkesinin IoT Hub bağlantı dizesini almak için şu adımları izleyin:

  1. Azure portalKaynak 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ı dizesini kopyalayın ve değeri kaydedin.

    Bağlantı dizesinin nasıl alındığını gösteren ekran görüntüsü

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

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 Device SDK 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 bağlantı dizesini alma bölümünde 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. cihaz ikizini güncelleştirmek üzere işi 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, kapıyı kilitlemek ve ikizini güncelleştirmek üzere işleri tetikleme amacıyla aşağıdaki komutu çalıştırın

    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, işleri doğrudan bir yöntemi çalıştıracak ve cihaz ikizinin özelliklerini güncelleştirecek şekilde zamanlamıştını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.