Úlohy plánování a vysílání (Node.js)

Pomocí Azure IoT Hub můžete plánovat a sledovat úlohy, které aktualizují miliony zařízení. Úlohy můžete použít k:

  • Aktualizace požadovaných vlastností
  • Aktualizace značek
  • Vyvolání přímých metod

Koncepčně úloha zabalí jednu z těchto akcí a sleduje průběh provádění na sadě zařízení, která je definována dotazem dvojčete zařízení. Back-endová aplikace může například použít úlohu k vyvolání metody restartování na 10 000 zařízeních určených dotazem dvojčete zařízení a naplánovaných na budoucí dobu. Tato aplikace pak může sledovat průběh, jak každé z těchto zařízení přijme a spustí metodu restartování.

Další informace o těchto funkcích najdete v těchto článcích:

Poznámka

Funkce popsané v tomto článku jsou k dispozici pouze na úrovni Standard IoT Hub. Další informace o úrovních IoT Hub Basic a Standard/Free najdete v tématu Volba správné IoT Hub úrovně pro vaše řešení.

V tomto článku se dozvíte, jak vytvořit dvě aplikace Node.js:

  • Aplikace simulovaného zařízení Node.jssimDevice.jsimplementuje přímou metodu s názvem lockDoor, kterou může back-endová aplikace volat.

  • Konzolová aplikace Node.jsscheduleJobService.js, která vytvoří dvě úlohy. Jedna úloha volá přímou metodu lockDoor a druhá odesílá aktualizace požadovaných vlastností do více zařízení.

Poznámka

Další informace o nástrojích sdk dostupných pro vytváření aplikací pro zařízení i back-end najdete v tématu Sady SDK Pro azure IoT SDK.

Požadavky

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

  • Zaregistrované zařízení. Zaregistrujte jednu v Azure Portal.

  • Node.js verze 10.0.x nebo novější. Příprava vývojového prostředí popisuje, jak nainstalovat Node.js pro tento článek ve Windows nebo Linuxu.

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

Vytvoření aplikace simulovaného zařízení

V této části vytvoříte Node.js konzolovou aplikaci, která reaguje na přímou metodu volanou cloudem, která aktivuje simulovanou metodu lockDoor .

  1. Vytvořte novou prázdnou složku s názvem simDevice. Ve složce simDevice 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 složce simDevice spuštěním následujícího příkazu nainstalujte balíček azure-iot-device Device SDK a balíček azure-iot-device-mqtt :

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Pomocí textového editoru vytvořte nový souborsimDevice.js ve složce simDevice .

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

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Přidejte proměnnou connectionString a použijte ji k vytvoření instance klienta. Nahraďte hodnotu zástupného {yourDeviceConnectionString} symbolu připojovacím řetězcem zařízení, který jste zkopírovali dříve.

    var connectionString = '{yourDeviceConnectionString}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. Přidejte následující funkci pro zpracování metody lockDoor .

    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. Přidejte následující kód pro registraci obslužné rutiny pro metodu lockDoor .

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

Poznámka

Aby to bylo jednoduché, tento článek neimplementuje zásady opakování. V produkčním kódu byste měli implementovat zásady opakování (například exponenciální zpochybnění), jak navrhuje článek Zpracování přechodných chyb.

Získání připojovacího řetězce IoT Hub

V tomto článku vytvoříte back-endovou službu, která naplánuje úlohu pro vyvolání přímé metody na zařízení, naplánuje úlohu pro aktualizaci dvojčete zařízení a sleduje průběh každé úlohy. K provedení těchto operací vaše služba potřebuje oprávnění registru ke čtení a zápisu do registru . Ve výchozím nastavení se každé centrum IoT vytvoří se zásadou sdíleného přístupu s názvem registryReadWrite , která tato oprávnění uděluje.

Pokud chcete získat připojovací řetězec IoT Hub pro zásadu registryReadWrite, postupujte takto:

  1. V 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 vyberte Zásady sdíleného přístupu.

  3. V seznamu zásad vyberte zásadu registruReadWrite .

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

    Snímek obrazovky, který ukazuje, jak načíst připojovací řetězec

Další informace o IoT Hub zásady a oprávnění sdíleného přístupu najdete v tématu Řízení přístupu a oprávnění.

Plánování úloh volání přímé metody a aktualizace vlastností dvojčete zařízení

V této části vytvoříte Node.js konzolovou aplikaci, která zahájí vzdálené uzamčení zařízení na zařízení pomocí přímé metody a aktualizuje vlastnosti dvojčete zařízení.

  1. Vytvořte novou prázdnou složku s názvem scheduleJobService. Ve složce scheduleJobService 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 složce scheduleJobService spuštěním následujícího příkazu nainstalujte balíček azure-iothub Device SDK a balíček azure-iot-device-mqtt :

    npm install azure-iothub uuid --save
    
  3. Pomocí textového editoru vytvořte nový souborscheduleJobService.js ve složce scheduleJobService .

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

    'use strict';
    
    var uuid = require('uuid');
    var JobClient = require('azure-iothub').JobClient;
    
  5. Přidejte následující deklarace proměnných. {iothubconnectionstring} Nahraďte hodnotu zástupného symbolu hodnotou, kterou jste zkopírovali v části Získání připojovacího řetězce služby IoT Hub. Pokud jste zaregistrovali jiné zařízení než myDeviceId, nezapomeňte ho změnit v podmínce dotazu.

    var connectionString = '{iothubconnectionstring}';
    var queryCondition = "deviceId IN ['myDeviceId']";
    var startTime = new Date();
    var maxExecutionTimeInSeconds =  300;
    var jobClient = JobClient.fromConnectionString(connectionString);
    
  6. Přidejte následující funkci, která se používá k monitorování provádění úlohy:

    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. Přidejte následující kód pro naplánování úlohy, která volá metodu zařízení:

    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. Přidejte následující kód pro naplánování úlohy pro aktualizaci dvojčete zařízení:

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

Spuštění aplikací

Nyní můžete spustit aplikace.

  1. Na příkazovém řádku ve složce simDevice spusťte následující příkaz a začněte naslouchat přímé metodě restartování.

    node simDevice.js
    
  2. Na příkazovém řádku ve složce scheduleJobService spusťte následující příkaz, který aktivuje úlohy pro uzamčení dveří a aktualizaci dvojčete.

    node scheduleJobService.js
    
  3. V konzole se zobrazí odpověď zařízení na přímou metodu a stav úlohy.

    Následující příklad ukazuje odpověď zařízení na přímou metodu:

    Výstup aplikace simulovaného zařízení

    Následující seznam ukazuje úlohy plánování služby pro přímou metodu a aktualizaci dvojčete zařízení a úlohy spuštěné do dokončení:

    Spuštění aplikace simulovaného zařízení

Další kroky

V tomto článku jste naplánovali úlohy tak, aby spustily přímou metodu a aktualizovaly vlastnosti dvojčete zařízení.

Pokud chcete pokračovat ve zkoumání vzorů IoT Hub a správy zařízení, aktualizujte image ve službě Device Update pro Azure IoT Hub pomocí referenční image Raspberry Pi 3 B+.