Share via


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:

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.

  1. 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
    
  2. 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
    
  3. Szövegszerkesztővel hozzon létre egy új simDevice.js fájlt a simDevice mappában.

  4. 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;
    
  5. 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);
    
  6. 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!');
    };
    
  7. 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);
         }
    });
    
  8. 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:

  1. 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.

  2. A központ bal oldali paneljén válassza a Megosztott hozzáférési szabályzatok lehetőséget.

  3. A szabályzatok listájából válassza a beállításjegyzékReadWrite szabályzatot .

  4. Másolja ki az Elsődleges kapcsolati sztring, és mentse az értéket.

    Képernyőkép a kapcsolati sztring lekéréséről

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.

  1. 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
    
  2. 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
    
  3. Szövegszerkesztővel hozzon létre egy új scheduleJobService.js fájlt a scheduleJobService mappában.

  4. 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;
    
  5. 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);
    
  6. 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);
    }
    
  7. 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));
                }
            });
        }
    });
    
  8. 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));
                }
            });
        }
    });
    
  9. 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.

  1. 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
    
  2. 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
    
  3. 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ó:

    Szimulált eszközalkalmazás kimenete

    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:

    A szimulált eszközalkalmazás futtatása

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.