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

Pomocí služby Azure IoT Hub můžete plánovat a sledovat úlohy, které aktualizují miliony zařízení. Použití úloh 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í u sady zařízení, která je definovaná dotazem dvojčete zařízení. Back-endová aplikace může například pomocí úlohy vyvolat metodu restartování na 10 000 zařízeních určených dotazem dvojčete zařízení a naplánovat ji v budoucnu. Tato aplikace pak může sledovat průběh, když každé z těchto zařízení přijme a spustí metodu restartování.

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

Poznámka:

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

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

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

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

Poznámka:

Další informace o dostupných nástrojích SDK pro sestavení zařízení i back-endových aplikací najdete v sadách SDK .

Požadavky

  • Centrum IoT ve vašem předplatném Azure Pokud centrum ještě nemáte, můžete postupovat podle kroků v tématu Vytvoření centra IoT.

  • Zařízení zaregistrované ve službě IoT Hub. Pokud ve službě IoT Hub nemáte zařízení, postupujte podle pokynů v části Registrace zařízení.

  • 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 v systému Windows nebo Linux.

  • 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 blokovaný v některých podnikových a vzdělávacích síťových prostředích. Další informace a způsoby řešení tohoto problému najdete v tématu Připojení ke službě 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 .

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Zabezpečení osvědčených postupů > zabezpečení připojení.

  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 spusťte následující příkaz, který nainstaluje 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ý soubor simDevice.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. {yourDeviceConnectionString} Nahraďte zástupnou hodnotu připojovací řetězec zařízení, které jste předtím zkopírovali.

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

    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, který zaregistruje obslužnou rutinu 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 soubor simDevice.js .

Poznámka:

Aby bylo všechno jednoduché, tento článek neimplementuje zásadu opakování. V produkčním kódu byste měli implementovat zásady opakování (například exponenciální zpoždování), jak je doporučeno v článku Zpracování přechodných chyb.

Získání připojovací řetězec ioT Hubu

V tomto článku vytvoříte back-endovou službu, která naplánuje úlohu, která vyvolá přímou metodu 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í potřebuje vaše služba oprávnění ke čtení registru a zápisu do registru. Ve výchozím nastavení se vytvoří každé centrum IoT se zásadami sdíleného přístupu s názvem registryReadWrite , které těmto oprávněním udělí.

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

  1. Na webu 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 registryReadWrite .

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

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

Další informace ozásadách

Důležité

Tento článek obsahuje postup připojení ke službě pomocí sdíleného přístupového podpisu. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování ve službě pomocí MICROSOFT Entra ID nebo spravovaných identit je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy > zabezpečení cloudu.

Naplánování úloh pro volání přímé metody a aktualizaci vlastností dvojčete zařízení

V této části vytvoříte konzolovou aplikaci Node.js, 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 spusťte následující příkaz, který nainstaluje 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ý soubor scheduleJobService.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 zástupnou hodnotu hodnotou, kterou jste zkopírovali v připojovací řetězec Get the 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, který naplánuje úlohu 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 soubor scheduleJobService.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, který začne 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í příklad 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, které spustí přímou metodu a aktualizují vlastnosti dvojčete zařízení.

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