Planowanie i emisja zadań (Node.js)

Użyj Azure IoT Hub, aby zaplanować i śledzić zadania aktualizujące miliony urządzeń. Użyj zadań, aby:

  • Aktualizowanie żądanych właściwości
  • Aktualizowanie tagów
  • Wywoływanie metod bezpośrednich

Koncepcyjnie zadanie opakowuje jedną z tych akcji i śledzi postęp wykonywania względem zestawu urządzeń, który jest definiowany przez zapytanie bliźniaczej reprezentacji urządzenia. Na przykład aplikacja zaplecza może użyć zadania w celu wywołania metody ponownego rozruchu na 10 000 urządzeniach określonych przez zapytanie bliźniaczej reprezentacji urządzenia i zaplanowanych w przyszłości. Ta aplikacja może następnie śledzić postęp, gdy każde z tych urządzeń odbiera i wykonuje metodę ponownego rozruchu.

Dowiedz się więcej o każdej z tych funkcji w następujących artykułach:

Uwaga

Funkcje opisane w tym artykule są dostępne tylko w warstwie Standardowa IoT Hub. Aby uzyskać więcej informacji o warstwach podstawowa i Standardowa/Bezpłatna IoT Hub, zobacz Wybieranie odpowiedniej warstwy IoT Hub dla rozwiązania.

W tym artykule pokazano, jak utworzyć dwie aplikacje Node.js:

  • Aplikacja urządzenia symulowanego Node.js,simDevice.js, implementuje metodę bezpośrednią o nazwie lockDoor, którą można wywołać przez aplikację zaplecza.

  • Aplikacja konsolowa Node.js scheduleJobService.js, która tworzy dwa zadania. Jedno zadanie wywołuje metodę bezpośrednią lockDoor , a drugie wysyła żądane aktualizacje właściwości do wielu urządzeń.

Uwaga

Zobacz Zestawy SDK usługi Azure IoT , aby uzyskać więcej informacji na temat narzędzi zestawu SDK dostępnych do tworzenia aplikacji zarówno urządzeń, jak i zaplecza.

Wymagania wstępne

Tworzenie aplikacji symulowanego urządzenia

W tej sekcji utworzysz aplikację konsolową Node.js, która reaguje na metodę bezpośrednią wywoływaną przez chmurę, która wyzwala symulowaną metodę lockDoor .

  1. Utwórz nowy pusty folder o nazwie simDevice. W folderze simDevice utwórz plik package.json przy użyciu następującego polecenia w wierszu polecenia. Zaakceptuj wszystkie ustawienia domyślne:

    npm init
    
  2. W wierszu polecenia w folderze simDevice uruchom następujące polecenie, aby zainstalować pakiet zestawu SDK urządzenia azure-iot-device i pakiet azure-iot-device-mqtt :

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Za pomocą edytora tekstów utwórz nowy plik simDevice.js w folderze simDevice .

  4. Dodaj następujące instrukcje "require" na początku pliku simDevice.js :

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Dodaj zmienną connectionString i użyj jej do utworzenia wystąpienia Client. Zastąp wartość symbolu {yourDeviceConnectionString} zastępczego skopiowanymi wcześniej parametrami połączenia urządzenia.

    var connectionString = '{yourDeviceConnectionString}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. Dodaj następującą funkcję, aby obsłużyć metodę 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!');
    };
    
  7. Dodaj następujący kod, aby zarejestrować procedurę obsługi metody 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);
         }
    });
    
  8. Zapisz i zamknij plik simDevice.js .

Uwaga

Aby zachować prostotę, ten artykuł nie implementuje zasad ponawiania. W kodzie produkcyjnym należy zaimplementować zasady ponawiania (takie jak wycofywanie wykładnicze), zgodnie z sugestią w artykule Obsługa błędów przejściowych.

Pobieranie parametrów połączenia IoT Hub

W tym artykule tworzysz usługę zaplecza, która planuje wywołanie metody bezpośredniej na urządzeniu, planuje zadanie aktualizacji bliźniaczej reprezentacji urządzenia i monitoruje postęp każdego zadania. Aby wykonać te operacje, usługa wymaga uprawnień do odczytu rejestru i zapisu rejestru . Domyślnie każde centrum IoT jest tworzone przy użyciu zasad dostępu współdzielonego o nazwie registryReadWrite , które przyznaje te uprawnienia.

Aby uzyskać parametry połączenia IoT Hub dla zasad registryReadWrite, wykonaj następujące kroki:

  1. W Azure Portal wybierz pozycję Grupy zasobów. Wybierz grupę zasobów, w której znajduje się centrum, a następnie wybierz centrum z listy zasobów.

  2. W okienku po lewej stronie centrum wybierz pozycję Zasady dostępu współdzielonego.

  3. Z listy zasad wybierz zasady registryReadWrite .

  4. Skopiuj podstawowe parametry połączenia i zapisz wartość.

    Przechwytywanie ekranu pokazujące sposób pobierania parametrów połączenia

Aby uzyskać więcej informacji na temat IoT Hub zasad dostępu współdzielonego i uprawnień, zobacz Kontrola dostępu i uprawnienia.

Planowanie zadań na potrzeby wywoływania metody bezpośredniej i aktualizowania właściwości bliźniaczej reprezentacji urządzenia

W tej sekcji utworzysz aplikację konsolową Node.js, która inicjuje zdalne blokowanieDoor na urządzeniu przy użyciu metody bezpośredniej i aktualizuje właściwości bliźniaczej reprezentacji urządzenia.

  1. Utwórz nowy pusty folder o nazwie scheduleJobService. W folderze scheduleJobService utwórz plik package.json przy użyciu następującego polecenia w wierszu polecenia. Zaakceptuj wszystkie ustawienia domyślne:

    npm init
    
  2. W wierszu polecenia w folderze scheduleJobService uruchom następujące polecenie, aby zainstalować pakiet zestawu SDK urządzenia azure-iothub i pakiet azure-iot-device-mqtt :

    npm install azure-iothub uuid --save
    
  3. Za pomocą edytora tekstów utwórz nowy plik scheduleJobService.js w folderze scheduleJobService .

  4. Dodaj następujące instrukcje "require" na początku pliku scheduleJobService.js :

    'use strict';
    
    var uuid = require('uuid');
    var JobClient = require('azure-iothub').JobClient;
    
  5. Dodaj następujące deklaracje zmiennych. Zastąp wartość symbolu {iothubconnectionstring} zastępczego wartością skopiowaną w obszarze Pobieranie parametrów połączenia centrum IoT. Jeśli zarejestrowano urządzenie inne niż myDeviceId, pamiętaj, aby zmienić je w warunku zapytania.

    var connectionString = '{iothubconnectionstring}';
    var queryCondition = "deviceId IN ['myDeviceId']";
    var startTime = new Date();
    var maxExecutionTimeInSeconds =  300;
    var jobClient = JobClient.fromConnectionString(connectionString);
    
  6. Dodaj następującą funkcję, która jest używana do monitorowania wykonywania zadania:

    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. Dodaj następujący kod, aby zaplanować zadanie, które wywołuje metodę urządzenia:

    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. Dodaj następujący kod, aby zaplanować zadanie aktualizacji bliźniaczej reprezentacji urządzenia:

    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. Zapisz i zamknij plik scheduleJobService.js .

Uruchamianie aplikacji

Teraz można uruchomić aplikacje.

  1. W wierszu polecenia w folderze simDevice uruchom następujące polecenie, aby rozpocząć nasłuchiwanie metody bezpośredniej ponownego rozruchu.

    node simDevice.js
    
  2. W wierszu polecenia w folderze scheduleJobService uruchom następujące polecenie, aby wyzwolić zadania w celu zablokowania drzwi i zaktualizowania bliźniaczej reprezentacji bliźniaczej

    node scheduleJobService.js
    
  3. Zostanie wyświetlona odpowiedź urządzenia na metodę bezpośrednią i stan zadania w konsoli programu .

    Poniżej przedstawiono odpowiedź urządzenia na metodę bezpośrednią:

    Dane wyjściowe aplikacji urządzenia symulowanego

    Poniżej przedstawiono zadania planowania usług dla metody bezpośredniej i aktualizacji bliźniaczej reprezentacji urządzenia oraz zadania uruchomione do ukończenia:

    Uruchamianie aplikacji urządzenia symulowanego

Następne kroki

W tym artykule zaplanowano uruchamianie metody bezpośredniej i aktualizowanie właściwości bliźniaczej reprezentacji urządzenia.

Aby kontynuować eksplorowanie wzorców IoT Hub i zarządzania urządzeniami, zaktualizuj obraz w usłudze Device Update na potrzeby Azure IoT Hub samouczka przy użyciu obrazu referencyjnego urządzenia Raspberry Pi 3 B+.