Ú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:
Vlastnosti a dvojče zařízení: Začínáme s dvojčaty zařízení a Principy a používání dvojčat zařízení v IoT Hub
Přímé metody: IoT Hub příručka pro vývojáře – přímé metody
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 .
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
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
Pomocí textového editoru vytvořte nový souborsimDevice.js ve složce simDevice .
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;
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);
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!'); };
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); } });
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:
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ů.
V levém podokně centra vyberte Zásady sdíleného přístupu.
V seznamu zásad vyberte zásadu registruReadWrite .
Zkopírujte primární připojovací řetězec a hodnotu uložte.
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í.
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
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
Pomocí textového editoru vytvořte nový souborscheduleJobService.js ve složce scheduleJobService .
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;
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);
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); }
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)); } }); } });
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)); } }); } });
Uložte a zavřete souborscheduleJobService.js .
Spuštění aplikací
Nyní můžete spustit aplikace.
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
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
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:
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í:
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+.