Kom igång med enhetshantering (Node.js)

Serverdelsappar kan använda Azure IoT Hub primitiver, till exempel enhetstvillingar och direktmetoder, för att fjärrstarta och övervaka enhetshanteringsåtgärder på enheter. Den här artikeln visar hur en serverdelsapp och en enhetsapp kan arbeta tillsammans för att initiera och övervaka en omstart av fjärrenheter med hjälp av IoT Hub.

Anteckning

Funktionerna som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om nivåerna grundläggande och standard/kostnadsfri IoT Hub finns i Välj rätt IoT Hub nivå för din lösning.

Använd en direktmetod för att initiera åtgärder för enhetshantering (till exempel omstart, fabriksåterställning och uppdatering av inbyggd programvara) från en serverdelsapp i molnet. Enheten ansvarar för:

  • Hantera metodbegäran som skickas från IoT Hub.

  • Initiera motsvarande enhetsspecifika åtgärd på enheten.

  • Tillhandahålla statusuppdateringar via rapporterade egenskaper för att IoT Hub.

Du kan använda en serverdelsapp i molnet för att köra enhetstvillingfrågor för att rapportera om förloppet för dina enhetshanteringsåtgärder.

Den här artikeln visar hur du skapar:

  • dmpatterns_getstarted_device.js: en simulerad enhetsapp med en direktmetod som startar om enheten och rapporterar den senaste omstartstiden. Direktmetoder anropas från molnet.

  • dmpatterns_getstarted_service.js: en .NET-konsolapp som anropar direktmetoden i den simulerade enhetsappen via din IoT-hubb. Den visar svaret och uppdaterade rapporterade egenskaper.

Förutsättningar

  • En IoT-hubb. Skapa en med CLI eller Azure Portal.

  • En registrerad enhet. Registrera en i Azure Portal.

  • Node.js version 10.0.x eller senare. Förbered utvecklingsmiljön beskriver hur du installerar Node.js för den här artikeln i Antingen Windows eller Linux.

  • Kontrollera att port 8883 är öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar över port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Ansluta till IoT Hub (MQTT).

Skapa en enhetsapp med en direktmetod

I det här avsnittet får du:

  • Skapa en Node.js-konsolapp som svarar på en direktmetod som anropas av molnet.

  • Utlös en simulerad omstart av enheten.

  • Använd de rapporterade egenskaperna för att aktivera enhetstvillingfrågor för att identifiera enheter och när de senast startades om.

  1. Skapa en tom mapp med namnet managed-device. I mappen managed-device skapar du en package.json-fil med följande kommando i kommandotolken. Acceptera alla standardvärden:

    npm init
    
  2. I kommandotolken i mappen managed-device kör du följande kommando för att installera SDK-paketet azure-iot-device och azure-iot-device-mqtt-paketet :

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Skapa en dmpatterns_getstarted_device.js-fil i mappen managed-device med hjälp av en textredigerare.

  4. Lägg till följande "kräv"-instruktioner i början av dmpatterns_getstarted_device.js-filen :

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Lägg till en connectionString-variabel och använd den för att skapa en klientinstans. {yourdeviceconnectionstring} Ersätt platshållarvärdet med enhetsanslutningssträngen som du såg när du registrerade en enhet i IoT Hub:

    var connectionString = '{yourdeviceconnectionstring}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. Lägg till följande funktion för att implementera direktmetoden på enheten

    var onReboot = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, 'Reboot started', 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.');
            }
        });
    
        // Report the reboot before the physical restart
        var date = new Date();
        var patch = {
            iothubDM : {
                reboot : {
                    lastReboot : date.toISOString(),
                }
            }
        };
    
        // Get device Twin
        client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                console.log('twin acquired');
                twin.properties.reported.update(patch, function(err) {
                    if (err) throw err;
                    console.log('Device reboot twin state reported')
                });  
            }
        });
    
        // Add your device's reboot API for physical restart.
        console.log('Rebooting!');
    };
    
  7. Öppna anslutningen till din IoT-hubb och starta direktmetodlyssnaren:

    client.open(function(err) {
        if (err) {
            console.error('Could not open IotHub client');
        }  else {
            console.log('Client opened.  Waiting for reboot method.');
            client.onDeviceMethod('reboot', onReboot);
        }
    });
    
  8. Spara och stäng filendmpatterns_getstarted_device.js .

Anteckning

För att hålla det enkelt implementerar den här artikeln inte en återförsöksprincip. I produktionskoden bör du implementera återförsöksprinciper (till exempel en exponentiell backoff), som föreslås i artikeln Hantering av tillfälliga fel.

Hämta IoT Hub-anslutningssträngen

I den här artikeln skapar du en serverdelstjänst som anropar en direktmetod på en enhet. Om du vill anropa en direktmetod på en enhet via IoT Hub behöver din tjänst behörighet för tjänstanslutning. Som standard skapas varje IoT Hub med en princip för delad åtkomst med namnet tjänst som ger den här behörigheten.

Följ dessa steg för att hämta IoT Hub anslutningssträng för tjänstprincipen:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan din hubb i listan över resurser.

  2. I fönstret till vänster i IoT-hubben väljer du Principer för delad åtkomst.

  3. I listan över principer väljer du tjänstprincipen .

  4. Kopiera den primära anslutningssträngen och spara värdet.

Skärmbild som visar hur du hämtar anslutningssträngen från din IoT Hub i Azure Portal.

Mer information om IoT Hub principer och behörigheter för delad åtkomst finns i Åtkomstkontroll och behörigheter.

Skapa en tjänstapp för att utlösa en omstart

I det här avsnittet skapar du en Node.js-konsolapp som initierar en fjärromstart på en enhet med hjälp av en direktmetod. Appen använder enhetstvillingfrågor för att identifiera den senaste omstartstiden för den enheten.

  1. Skapa en tom mapp med namnet trigger-reboot-on-device. I mappen trigger-reboot-on-device skapar du en package.json-fil med följande kommando i kommandotolken. Acceptera alla standardvärden:

    npm init
    
  2. I kommandotolken i mappen trigger-reboot-on-device kör du följande kommando för att installera paketet azure-iothub Device SDK och paketet azure-iot-device-mqtt :

    npm install azure-iothub --save
    
  3. Skapa en dmpatterns_getstarted_service.js-fil i mappen trigger-reboot-on-device med hjälp av en textredigerare.

  4. Lägg till följande "kräv"-instruktioner i början av dmpatterns_getstarted_service.js-filen :

    'use strict';
    
    var Registry = require('azure-iothub').Registry;
    var Client = require('azure-iothub').Client;
    
  5. Lägg till följande variabeldeklarationer och ersätt {iothubconnectionstring} platshållarvärdet med den IoT Hub-anslutningssträng som du kopierade tidigare i Hämta IoT Hub-anslutningssträngen:

    var connectionString = '{iothubconnectionstring}';
    var registry = Registry.fromConnectionString(connectionString);
    var client = Client.fromConnectionString(connectionString);
    var deviceToReboot = 'myDeviceId';
    
  6. Lägg till följande funktion för att anropa enhetsmetoden för att starta om målenheten:

    var startRebootDevice = function(twin) {
    
        var methodName = "reboot";
    
        var methodParams = {
            methodName: methodName,
            payload: null,
            timeoutInSeconds: 30
        };
    
        client.invokeDeviceMethod(deviceToReboot, methodParams, function(err, result) {
            if (err) {
                console.error("Direct method error: "+err.message);
            } else {
                console.log("Successfully invoked the device to reboot.");  
            }
        });
    };
    
  7. Lägg till följande funktion för att fråga efter enheten och få den senaste omstartstiden:

    var queryTwinLastReboot = function() {
    
        registry.getTwin(deviceToReboot, function(err, twin){
    
            if (twin.properties.reported.iothubDM != null)
            {
                if (err) {
                    console.error('Could not query twins: ' + err.constructor.name + ': ' + err.message);
                } else {
                    var lastRebootTime = twin.properties.reported.iothubDM.reboot.lastReboot;
                    console.log('Last reboot time: ' + JSON.stringify(lastRebootTime, null, 2));
                }
            } else 
                console.log('Waiting for device to report last reboot time.');
        });
    };
    
  8. Lägg till följande kod för att anropa de funktioner som utlöser direktmetoden för omstart och fråga efter den senaste omstartstiden:

    startRebootDevice();
    setInterval(queryTwinLastReboot, 2000);
    
  9. Spara och stäng filendmpatterns_getstarted_service.js .

Kör apparna

Nu är du redo att köra apparna.

  1. I kommandotolken i mappen managed-device kör du följande kommando för att börja lyssna efter direktmetoden för omstart.

    node dmpatterns_getstarted_device.js
    
  2. I kommandotolken i mappen trigger-reboot-on-device kör du följande kommando för att utlösa fjärromstarten och fråga efter enhetstvillingen för att hitta den senaste omstartstiden.

    node dmpatterns_getstarted_service.js
    
  3. Du ser enhetens svar på direktmetoden för omstart och omstartsstatusen i konsolen.

    Följande visar enhetssvaret på den direktmetod för omstart som skickas av tjänsten:

    manageddevice-apputdata

    Följande visar tjänsten som utlöser omstarten och avsöker enhetstvillingen för den senaste omstartstiden:

    utdata från triggerrebootondevice-appen

Anpassa och utöka enhetshanteringsåtgärderna

Dina IoT-lösningar kan utöka den definierade uppsättningen med enhetshanteringsmönster eller aktivera anpassade mönster med hjälp av enhetstvillingen och primitiva metoder från moln till enhet. Andra exempel på åtgärder för enhetshantering är fabriksåterställning, uppdatering av inbyggd programvara, programuppdatering, energisparfunktioner, nätverks- och anslutningshantering samt datakryptering.

Fönster för enhetsunderhåll

Vanligtvis konfigurerar du enheter för att utföra åtgärder i taget som minimerar avbrott och stilleståndstid. Enhetsunderhållsperioder är ett vanligt mönster för att definiera när en enhet ska uppdatera sin konfiguration. Dina serverdelslösningar kan använda önskade egenskaper för enhetstvillingen för att definiera och aktivera en princip på enheten som aktiverar en underhållsperiod. När en enhet tar emot principen för underhållsperiod kan den använda den rapporterade egenskapen för enhetstvillingen för att rapportera status för principen. Serverdelsappen kan sedan använda enhetstvillingfrågor för att intyga efterlevnad av enheter och varje princip.

Nästa steg

I den här artikeln använde du en direktmetod för att utlösa en fjärromstart på en enhet. Du använde de rapporterade egenskaperna för att rapportera den senaste omstartstiden från enheten och frågade enhetstvillingen om att identifiera enhetens senaste omstartstid från molnet.

ToTo continue getting started with IoT Hub and device management patterns such as end-to-end image-based update in Device Update for Azure IoT Hub article using the Raspberry Pi 3 B+ Reference Image.ToTo continue getting started with IoT Hub and device management patterns such as end-to-end image-based update in Device Update for Azure IoT Hub article using the Raspberry Pi 3 B+ Reference Image.

Information om hur du utökar IoT-lösningen och schemalägger metodanrop på flera enheter finns i Schemalägga och sända jobb.