Feladatok ütemezése és szórása (Node.js)
A Azure IoT Hub segítségével több millió eszközt frissítő feladatokat ütemezhet és követhet nyomon. Feladatok használata a következő feladatokhoz:
- Eszköz kívánt tulajdonságainak frissítése
- Címkék frissítése
- Közvetlen metódusok meghívása
A feladat elméletileg becsomagolja az egyik ilyen műveletet, és nyomon követi a végrehajtás előrehaladását egy eszközkészleten, amelyet egy ikereszköz-lekérdezés határoz meg. Egy háttéralkalmazás például egy feladattal meghívhat egy újraindítási módszert 10 000 eszközön, amelyet egy ikereszköz-lekérdezés határoz meg, és későbbi időpontban ütemez. Az alkalmazás ezután nyomon követheti az előrehaladást, amint az egyes eszközök megkapják és végrehajtják az újraindítási módszert.
Ezekről a képességekről az alábbi cikkekben talál további információt:
Ikereszköz és tulajdonságok: Az ikereszközök használatának első lépései és az ikereszközök megismerése és használata a IoT Hub
Közvetlen metódusok: IoT Hub fejlesztői útmutató – közvetlen metódusok
Megjegyzés
A cikkben ismertetett funkciók csak a IoT Hub standard szintjén érhetők el. Az alapszintű és standard/ingyenes IoT Hub szintekkel kapcsolatos további információkért lásd: A megoldáshoz megfelelő IoT Hub szint kiválasztása.
Ez a cikk bemutatja, hogyan hozhat létre két Node.js alkalmazást:
Egy Node.js szimulált eszközalkalmazás, simDevice.js, amely implementál egy lockDoor nevű közvetlen metódust, amelyet a háttéralkalmazás hívhat meg.
Egy Node.js konzolalkalmazás, scheduleJobService.js, amely két feladatot hoz létre. Az egyik feladat meghívja a lockDoor közvetlen metódust, egy másik feladat pedig több eszközre küldi a kívánt tulajdonságfrissítéseket.
Megjegyzés
Az eszköz- és háttéralkalmazások készítéséhez elérhető SDK-eszközökkel kapcsolatos további információkért lásd: Azure IoT SDK-k .
Előfeltételek
Egy IoT Hub. Hozzon létre egyet a parancssori felülettel vagy a Azure Portal.
Regisztrált eszköz. Regisztráljon egyet a Azure Portal.
Node.js 10.0.x vagy újabb verziót. A fejlesztési környezet előkészítése ismerteti, hogyan telepítheti a Node.js ehhez a cikkhez Windows vagy Linux rendszeren.
Győződjön meg arról, hogy a 8883-as port nyitva van a tűzfalon. A cikkben szereplő eszközminta MQTT protokollt használ, amely a 8883-es porton keresztül kommunikál. Ez a port bizonyos vállalati és oktatási hálózati környezetekben blokkolható. További információkért és a probléma megoldásának módjaiért lásd: Csatlakozás IoT Hub (MQTT)-hez.
Szimulált eszközalkalmazás létrehozása
Ebben a szakaszban egy Node.js konzolalkalmazást hoz létre, amely válaszol a felhő által meghívott közvetlen metódusra, amely aktivál egy szimulált lockDoor metódust.
Hozzon létre egy új, simDevice nevű üres mappát. A simDevice mappában hozzon létre egy package.json fájlt a parancssorban található alábbi paranccsal. Fogadja el az összes alapértelmezett beállítást:
npm init
A simDevice mappában található parancssorban futtassa a következő parancsot az azure-iot-device Device SDK-csomag és az azure-iot-device-mqtt csomag telepítéséhez:
npm install azure-iot-device azure-iot-device-mqtt --save
Szövegszerkesztővel hozzon létre egy új simDevice.js fájlt a simDevice mappában.
Adja hozzá a következő "require" utasításokat a simDevice.js fájl elején:
'use strict'; var Client = require('azure-iot-device').Client; var Protocol = require('azure-iot-device-mqtt').Mqtt;
Adjon hozzá egy connectionString változót, és ezzel hozzon létre egy Ügyfél példányt. Cserélje le a
{yourDeviceConnectionString}
helyőrző értékét a korábban kimásolt eszközre kapcsolati sztring.var connectionString = '{yourDeviceConnectionString}'; var client = Client.fromConnectionString(connectionString, Protocol);
Adja hozzá a következő függvényt a lockDoor metódus kezeléséhez.
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!'); };
Adja hozzá a következő kódot a lockDoor metódus kezelőjének regisztrálásához.
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); } });
Mentse és zárja be a simDevice.js fájlt.
Megjegyzés
Az egyszerűség érdekében ez a cikk nem implementál újrapróbálkozési szabályzatot. Az éles kódban újrapróbálkozási szabályzatokat (például exponenciális visszalépést) kell implementálnia az Átmeneti hibakezelés című cikkben leírtak szerint.
A IoT Hub kapcsolati sztring lekérése
Ebben a cikkben létrehoz egy háttérszolgáltatást, amely ütemez egy feladatot egy közvetlen metódus meghívására egy eszközön, ütemez egy feladatot az ikereszköz frissítésére, és figyeli az egyes feladatok előrehaladását. Ezeknek a műveleteknek a végrehajtásához a szolgáltatásnak olvasási és beállításjegyzék-írási engedélyekkel kell rendelkeznie. Alapértelmezés szerint minden IoT Hub egy registryReadWrite nevű megosztott hozzáférési szabályzattal jön létre, amely megadja ezeket az engedélyeket.
A registryReadWrite szabályzat IoT Hub kapcsolati sztring az alábbi lépésekkel szerezheti be:
A Azure Portal válassza az Erőforráscsoportok lehetőséget. Válassza ki azt az erőforráscsoportot, ahol a központ található, majd válassza ki a központot az erőforrások listájából.
A központ bal oldali paneljén válassza a Megosztott hozzáférési szabályzatok lehetőséget.
A szabályzatok listájából válassza a beállításjegyzékReadWrite szabályzatot .
Másolja ki az Elsődleges kapcsolati sztring, és mentse az értéket.
A IoT Hub megosztott hozzáférési szabályzatokkal és engedélyekkel kapcsolatos további információkért lásd: Hozzáférés-vezérlés és engedélyek.
Feladatok ütemezése közvetlen metódus meghívásához és az ikereszköz tulajdonságainak frissítéséhez
Ebben a szakaszban egy Node.js konzolalkalmazást hoz létre, amely egy távoli lockDoort kezdeményez egy eszközön egy közvetlen módszerrel, és frissíti az ikereszköz tulajdonságait.
Hozzon létre egy új, scheduleJobService nevű üres mappát. A scheduleJobService mappában hozzon létre egy package.json fájlt a parancssorban található alábbi paranccsal. Fogadja el az összes alapértelmezett beállítást:
npm init
A scheduleJobService mappában található parancssorban futtassa a következő parancsot az azure-iothub Device SDK-csomag és az azure-iot-device-mqtt csomag telepítéséhez:
npm install azure-iothub uuid --save
Szövegszerkesztővel hozzon létre egy új scheduleJobService.js fájlt a scheduleJobService mappában.
Adja hozzá a következő "require" utasításokat a scheduleJobService.js fájl elején:
'use strict'; var uuid = require('uuid'); var JobClient = require('azure-iothub').JobClient;
Adja hozzá a következő változódeklarációkat. Cserélje le a
{iothubconnectionstring}
helyőrző értékét az IoT Hub lekérése kapcsolati sztring című témakörben kimásolt értékre. Ha a myDeviceId azonosítótól eltérő eszközt regisztrált, mindenképpen módosítsa a lekérdezési feltételben.var connectionString = '{iothubconnectionstring}'; var queryCondition = "deviceId IN ['myDeviceId']"; var startTime = new Date(); var maxExecutionTimeInSeconds = 300; var jobClient = JobClient.fromConnectionString(connectionString);
Adja hozzá a következő függvényt, amely a feladat végrehajtásának figyelésére szolgál:
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); }
Adja hozzá a következő kódot az eszközmetódust meghívó feladat ütemezéséhez:
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)); } }); } });
Adja hozzá a következő kódot a feladat ütemezéséhez az ikereszköz frissítéséhez:
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)); } }); } });
Mentse és zárja be a scheduleJobService.js fájlt.
Az alkalmazások futtatása
Most már készen áll az alkalmazások futtatására.
A simDevice mappában található parancssorban futtassa a következő parancsot a közvetlen újraindítási metódus figyeléséhez.
node simDevice.js
A scheduleJobService mappában található parancssorban futtassa a következő parancsot a feladatok aktiválásához az ajtó zárolásához és az ikerpéldány frissítéséhez
node scheduleJobService.js
A konzolon láthatja a közvetlen metódusra adott eszközválaszt és a feladat állapotát.
Az alábbiakban a közvetlen metódusra adott eszközválasz látható:
Az alábbiakban a közvetlen metódus és az ikereszköz-frissítés szolgáltatásütemezési feladatait, valamint a befejezésig futó feladatokat mutatjuk be:
Következő lépések
Ebben a cikkben egy közvetlen metódus futtatására és az ikereszköz tulajdonságainak frissítésére ütemezte a feladatokat.
A IoT Hub és az eszközfelügyeleti minták megismeréséhez frissítsen egy képet az Eszközfrissítés Azure IoT Hub oktatóanyagban a Raspberry Pi 3 B+ referenciarendszerkép használatával.