Taken plannen en uitzenden (Node.js)

Gebruik Azure IoT Hub om taken te plannen en bij te houden waarmee miljoenen apparaten worden bijgewerkt. Taken gebruiken om:

  • Gewenste eigenschappen bijwerken
  • Tags bijwerken
  • Directe methoden aanroepen

Conceptueel gezien verpakt een taak een van deze acties en wordt de voortgang van de uitvoering bijgehouden op basis van een set apparaten, die wordt gedefinieerd door een query voor een apparaatdubbel. Een back-end-app kan bijvoorbeeld een taak gebruiken om een methode voor opnieuw opstarten aan te roepen op 10.000 apparaten, opgegeven door een apparaatdubbelquery en gepland op een later tijdstip. Die toepassing kan vervolgens de voortgang bijhouden wanneer elk van deze apparaten de methode voor opnieuw opstarten ontvangt en uitvoert.

Meer informatie over elk van deze mogelijkheden vindt u in deze artikelen:

Notitie

De functies die in dit artikel worden beschreven, zijn alleen beschikbaar in de standaardlaag van de IoT Hub. Zie Choose the right IoT Hub tier for your solution (De juiste IoT Hub laag voor uw oplossing kiezen) voor meer informatie over de lagen Basic en Standard/free IoT Hub.

In dit artikel leest u hoe u twee Node.js apps maakt:

  • Een Node.js gesimuleerde apparaat-app, simDevice.js, die een directe methode implementeert met de naam lockDoor, die kan worden aangeroepen door de back-end-app.

  • Een Node.js console-app, scheduleJobService.js, waarmee twee taken worden gemaakt. De ene taak roept de directe methode lockDoor aan en een andere taak verzendt de gewenste eigenschapsupdates naar meerdere apparaten.

Notitie

Zie Azure IoT SDK's voor meer informatie over de SDK-hulpprogramma's die beschikbaar zijn voor het bouwen van zowel apparaat- als back-end-apps.

Vereisten

  • Een IoT-hub. Maak er een met de CLI of de Azure Portal.

  • Een geregistreerd apparaat. Registreer er een in de Azure Portal.

  • Node.js versie 10.0.x of hoger. In Uw ontwikkelomgeving voorbereiden wordt beschreven hoe u Node.js voor dit artikel installeert in Windows of Linux.

  • Zorg ervoor dat de poort 8883 is geopend in de firewall. Het apparaatvoorbeeld in dit artikel maakt gebruik van het MQTT-protocol, dat communiceert via poort 8883. Deze poort is in sommige netwerkomgevingen van bedrijven en onderwijsinstellingen mogelijk geblokkeerd. Zie Verbinding maken met IoT Hub (MQTT) voor meer informatie en manieren om dit probleem te omzeilen.

Een gesimuleerde apparaattoepassing maken

In deze sectie maakt u een Node.js console-app die reageert op een directe methode die door de cloud wordt aangeroepen, waarmee een gesimuleerde lockDoor-methode wordt geactiveerd.

  1. Maak een nieuwe lege map met de naam simDevice. Maak in de map simDevice een package.json-bestand met behulp van de volgende opdracht bij de opdrachtprompt. Accepteer alle standaardwaarden:

    npm init
    
  2. Voer bij de opdrachtprompt in de map simDevice de volgende opdracht uit om het device SDK-pakket azure-iot-device en het pakket azure-iot-device-mqtt te installeren:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Maak met een teksteditor een nieuw simDevice.js-bestand in de map simDevice .

  4. Voeg de volgende 'vereisen'-instructies toe aan het begin van het simDevice.js-bestand :

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Voeg een connectionString-variabele toe en gebruik deze om een clientexemplaar te maken. Vervang de waarde van de {yourDeviceConnectionString} tijdelijke aanduiding door het apparaat connection string u eerder hebt gekopieerd.

    var connectionString = '{yourDeviceConnectionString}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. Voeg de volgende functie toe om de methode lockDoor te verwerken.

    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. Voeg de volgende code toe om de handler voor de methode lockDoor te registreren.

    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. Sla hetsimDevice.jsbestand op en sluit het.

Notitie

Om het eenvoudig te houden, wordt in dit artikel geen beleid voor opnieuw proberen geïmplementeerd. In productiecode moet u beleid voor opnieuw proberen implementeren (zoals exponentieel uitstel), zoals wordt voorgesteld in het artikel Tijdelijke foutafhandeling.

De IoT Hub connection string ophalen

In dit artikel maakt u een back-endservice die een taak plant om een directe methode op een apparaat aan te roepen, een taak plant om de apparaatdubbel bij te werken en de voortgang van elke taak bewaakt. Als u deze bewerkingen wilt uitvoeren, heeft uw service de lees - en schrijfmachtigingen voor het register nodig. Standaard wordt elke IoT-hub gemaakt met een beleid voor gedeelde toegang met de naam registryReadWrite dat deze machtigingen verleent.

Voer de volgende stappen uit om de IoT Hub connection string voor het beleid registryReadWrite op te halen:

  1. Selecteer Resourcegroepenin de Azure Portal. Selecteer de resourcegroep waar uw hub zich bevindt en selecteer vervolgens uw hub in de lijst met resources.

  2. Selecteer In het linkerdeelvenster van uw hub de optie Beleid voor gedeelde toegang.

  3. Selecteer in de lijst met beleidsregels het beleid registryReadWrite .

  4. Kopieer de Primaire connection string en sla de waarde op.

    Schermopname van het ophalen van de connection string

Zie Toegangsbeheer en machtigingen voor meer informatie over IoT Hub gedeelde toegangsbeleid en -machtigingen.

Taken plannen voor het aanroepen van een directe methode en het bijwerken van de eigenschappen van een apparaatdubbel

In deze sectie maakt u een Node.js-console-app waarmee een externe lockDoor op een apparaat wordt gestart met behulp van een directe methode en werkt u de eigenschappen van de apparaatdubbel bij.

  1. Maak een nieuwe lege map met de naam scheduleJobService. Maak in de map scheduleJobService een package.json-bestand met behulp van de volgende opdracht bij de opdrachtprompt. Accepteer alle standaardwaarden:

    npm init
    
  2. Voer bij de opdrachtprompt in de map scheduleJobService de volgende opdracht uit om het pakket azure-iothub Device SDK en het pakket azure-iot-device-mqtt te installeren:

    npm install azure-iothub uuid --save
    
  3. Maak met behulp van een teksteditor een nieuw scheduleJobService.js-bestand in de map scheduleJobService .

  4. Voeg de volgende 'vereisen'-instructies toe aan het begin van het scheduleJobService.js-bestand :

    'use strict';
    
    var uuid = require('uuid');
    var JobClient = require('azure-iothub').JobClient;
    
  5. Voeg de volgende variabeledeclaraties toe. Vervang de waarde van de {iothubconnectionstring} tijdelijke aanduiding door de waarde die u hebt gekopieerd in De IoT-hub ophalen connection string. Als u een ander apparaat dan myDeviceId hebt geregistreerd, moet u dit wijzigen in de queryvoorwaarde.

    var connectionString = '{iothubconnectionstring}';
    var queryCondition = "deviceId IN ['myDeviceId']";
    var startTime = new Date();
    var maxExecutionTimeInSeconds =  300;
    var jobClient = JobClient.fromConnectionString(connectionString);
    
  6. Voeg de volgende functie toe die wordt gebruikt om de uitvoering van de taak te bewaken:

    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. Voeg de volgende code toe om de taak te plannen die de apparaatmethode aanroept:

    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. Voeg de volgende code toe om de taak voor het bijwerken van de apparaatdubbel te plannen:

    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. Sla hetscheduleJobService.jsbestand op en sluit het.

De toepassingen uitvoeren

U kunt nu de toepassingen gaan uitvoeren.

  1. Voer bij de opdrachtprompt in de map simDevice de volgende opdracht uit om te luisteren naar de directe methode voor opnieuw opstarten.

    node simDevice.js
    
  2. Voer bij de opdrachtprompt in de map scheduleJobService de volgende opdracht uit om de taken te activeren om de deur te vergrendelen en de dubbel bij te werken

    node scheduleJobService.js
    
  3. U ziet het antwoord van het apparaat op de directe methode en de taakstatus in de console.

    Hieronder ziet u hoe het apparaat reageert op de directe methode:

    Uitvoer van gesimuleerde apparaat-app

    Hieronder ziet u de serviceplanningstaken voor de directe methode en het bijwerken van de apparaatdubbel, en de taken die worden uitgevoerd tot voltooiing:

    De app voor een gesimuleerd apparaat uitvoeren

Volgende stappen

In dit artikel hebt u taken gepland om een directe methode uit te voeren en de eigenschappen van de apparaatdubbel bij te werken.

Als u IoT Hub- en apparaatbeheerpatronen wilt blijven verkennen, werkt u een afbeelding bij in Device Update voor Azure IoT Hub zelfstudie met behulp van de Raspberry Pi 3 B+ Reference Image.