Připojení zařízení k akcelerátoru řešení vzdáleného monitorování (Node.js)

V tomto kurzu implementujete zařízení Chiller , které odesílá následující telemetrii do akcelerátoru řešení vzdáleného monitorování:

  • Teplota
  • Tlak
  • Vlhkost

Pro zjednodušení kód vygeneruje ukázkové telemetrické hodnoty pro chladič. Ukázku můžete rozšířit připojením skutečných senzorů k zařízení a odesláním skutečné telemetrie.

Ukázkové zařízení také:

  • Odešle do řešení metadata, která popisují jeho možnosti.
  • Reaguje na akce aktivované ze stránky Zařízení v řešení.
  • Reaguje na změny konfigurace odeslané ze stránky Zařízení v řešení.

K dokončení tohoto kurzu potřebujete mít aktivní účet Azure. Pokud účet nemáte, můžete si během několika minut vytvořit bezplatný zkušební účet. Podrobnosti najdete v článku Bezplatná zkušební verze Azure.

Než začnete

Než napíšete jakýkoli kód pro vaše zařízení, nasaďte akcelerátor řešení vzdáleného monitorování a přidejte do řešení nové skutečné zařízení.

Nasazení akcelerátoru řešení vzdáleného monitorování

Zařízení Chiller, které vytvoříte v tomto kurzu, odesílá data do instance akcelerátoru řešení vzdáleného monitorování. Pokud jste v účtu Azure ještě nezřídili akcelerátor řešení vzdáleného monitorování, přečtěte si téma Nasazení akcelerátoru řešení vzdáleného monitorování.

Po dokončení procesu nasazení řešení vzdáleného monitorování kliknutím na Spustit otevřete řídicí panel řešení v prohlížeči.

Řídicí panel řešení

Přidání zařízení do řešení pro vzdálené monitorování

Poznámka

Pokud jste už v řešení přidali zařízení, můžete tento krok přeskočit. Další krok ale vyžaduje připojovací řetězec vašeho zařízení. Připojovací řetězec zařízení můžete načíst z Azure Portal nebo pomocí nástroje az iot CLI.

Aby se zařízení mohlo připojit k akcelerátoru řešení, musí se identifikovat, aby se IoT Hub pomocí platných přihlašovacích údajů. Máte možnost uložit připojovací řetězec zařízení, který obsahuje tyto přihlašovací údaje, když zařízení přidáte do řešení. Do klientské aplikace zahrnete připojovací řetězec zařízení později v tomto kurzu.

Pokud chcete přidat zařízení do řešení vzdáleného monitorování, proveďte následující kroky na stránce Průzkumníka zařízení v řešení:

  1. Zvolte + Nové zařízení a pak jako typ zařízení zvolte Skutečné:

    Přidání skutečného zařízení

  2. Jako ID zařízení zadejte fyzický chladič . Zvolte možnosti symetrického klíče a automatického generování klíčů :

    Volba možností zařízení

  3. Zvolte Použít. Pak si poznamenejte hodnoty primárního klíče zařízení, primárního klíče a připojovacího řetězce :

    Načtení přihlašovacích údajů

Teď jste přidali skutečné zařízení do akcelerátoru řešení vzdáleného monitorování a poznamenali jste si připojovací řetězec zařízení. V následujících částech implementujete klientskou aplikaci, která používá připojovací řetězec zařízení pro připojení k vašemu řešení.

Klientská aplikace implementuje integrovaný model zařízení Chiller . Model zařízení akcelerátoru řešení určuje následující informace o zařízení:

  • Vlastnosti zařízení hlásí řešení. Například zařízení Chiller hlásí informace o jeho firmwaru a umístění.
  • Typy telemetrie, které zařízení odesílá do řešení. Například chladicí zařízení odesílá hodnoty teploty, vlhkosti a tlaku.
  • Metody, které můžete naplánovat z řešení, aby běžely na zařízení. Například zařízení Chiller musí implementovat metody Reboot, FirmwareUpdate, EmergencyValveRelease a IncreasePressure .

V tomto kurzu se dozvíte, jak připojit skutečné zařízení k akcelerátoru řešení vzdáleného monitorování. V tomto kurzu použijete Node.js, což je vhodná možnost pro prostředí s minimálními omezeními prostředků.

Pokud dáváte přednost simulaci zařízení, přečtěte si téma Vytvoření a testování nového simulovaného zařízení.

Vytvoření řešení Node.js

Ujistěte se, že na vývojovém počítači je nainstalovaná Node.js verze 4.0.0 nebo novější. Verzi můžete zkontrolovat node --version spuštěním na příkazovém řádku.

  1. Vytvořte složku s názvem remotemonitoring na vývojovém počítači. Přejděte do této složky v prostředí příkazového řádku.

  2. Pokud chcete stáhnout a nainstalovat balíčky, které potřebujete k dokončení ukázkové aplikace, spusťte následující příkazy:

    npm init
    npm install async azure-iot-device azure-iot-device-mqtt --save
    
  3. remotemonitoring Ve složce vytvořte soubor s názvemremote_monitoring.js. Otevřete tento soubor v textovém editoru.

  4. Do souboru remote_monitoring.js přidejte následující require příkazy:

    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    var Client = require('azure-iot-device').Client;
    var Message = require('azure-iot-device').Message;
    var async = require('async');
    
  5. Přidejte následující deklarace proměnných za příkazy require. Hodnotu zástupného symbolu {device connection string} nahraďte hodnotou, kterou jste si poznamenali pro zařízení, které jste zřídili v řešení pro vzdálené monitorování:

    var connectionString = '{device connection string}';
    
  6. Pokud chcete definovat některá základní telemetrická data, přidejte následující proměnné:

    var temperature = 50;
    var temperatureUnit = 'F';
    var humidity = 50;
    var humidityUnit = '%';
    var pressure = 55;
    var pressureUnit = 'psig';
    
  7. Pokud chcete definovat některé hodnoty vlastností, přidejte následující proměnné:

    var schema = "real-chiller;v1";
    var deviceType = "RealChiller";
    var deviceFirmware = "1.0.0";
    var deviceFirmwareUpdateStatus = "";
    var deviceLocation = "Building 44";
    var deviceLatitude = 47.638928;
    var deviceLongitude = -122.13476;
    var deviceOnline = true;
    
  8. Přidejte následující proměnnou, která definuje ohlášené vlastnosti, které se mají odeslat do řešení. Mezi tyto vlastnosti patří metadata, která se mají zobrazit ve webovém uživatelském rozhraní:

    var reportedProperties = {
      "SupportedMethods": "Reboot,FirmwareUpdate,EmergencyValveRelease,IncreasePressure",
      "Telemetry": {
        [schema]: ""
      },
      "Type": deviceType,
      "Firmware": deviceFirmware,
      "FirmwareUpdateStatus": deviceFirmwareUpdateStatus,
      "Location": deviceLocation,
      "Latitude": deviceLatitude,
      "Longitude": deviceLongitude,
      "Online": deviceOnline
    }
    
  9. Pokud chcete vytisknout výsledky operace, přidejte následující pomocnou funkci:

    function printErrorFor(op) {
        return function printError(err) {
            if (err) console.log(op + ' error: ' + err.toString());
        };
    }
    
  10. Přidejte následující pomocnou funkci, která se má použít k náhodnému určení hodnot telemetrie:

    function generateRandomIncrement() {
        return ((Math.random() * 2) - 1);
    }
    
  11. Přidejte následující obecnou funkci pro zpracování volání přímých metod z řešení. Funkce zobrazí informace o přímé metodě, která byla vyvolána, ale v této ukázce nijak nemění zařízení. Řešení používá přímé metody k jednání na zařízeních:

    function onDirectMethod(request, response) {
      // Implement logic asynchronously here.
      console.log('Simulated ' + request.methodName);
    
      // Complete the response
      response.send(200, request.methodName + ' was called on the device', function (err) {
        if (err) console.error('Error sending method response :\n' + err.toString());
        else console.log('200 Response to method \'' + request.methodName + '\' sent successfully.');
      });
    }
    
  12. Přidejte následující funkci pro zpracování volání přímé metody FirmwareUpdate z řešení. Funkce ověří parametry předané v datové části přímé metody a asynchronně spustí simulaci aktualizace firmwaru:

    function onFirmwareUpdate(request, response) {
      // Get the requested firmware version from the JSON request body
      var firmwareVersion = request.payload.Firmware;
      var firmwareUri = request.payload.FirmwareUri;
    
      // Ensure we got a firmware values
      if (!firmwareVersion || !firmwareUri) {
        response.send(400, 'Missing firmware value', function(err) {
          if (err) console.error('Error sending method response :\n' + err.toString());
          else console.log('400 Response to method \'' + request.methodName + '\' sent successfully.');
        });
      } else {
        // Respond the cloud app for the device method
        response.send(200, 'Firmware update started.', function(err) {
          if (err) console.error('Error sending method response :\n' + err.toString());
          else {
            console.log('200 Response to method \'' + request.methodName + '\' sent successfully.');
    
            // Run the simulated firmware update flow
            runFirmwareUpdateFlow(firmwareVersion, firmwareUri);
          }
        });
      }
    }
    
  13. Přidejte následující funkci pro simulaci dlouhotrvajícího toku aktualizace firmwaru, který hlásí průběh zpět do řešení:

    // Simulated firmwareUpdate flow
    function runFirmwareUpdateFlow(firmwareVersion, firmwareUri) {
      console.log('Simulating firmware update flow...');
      console.log('> Firmware version passed: ' + firmwareVersion);
      console.log('> Firmware URI passed: ' + firmwareUri);
      async.waterfall([
        function (callback) {
          console.log("Image downloading from " + firmwareUri);
          var patch = {
            FirmwareUpdateStatus: 'Downloading image..'
          };
          reportUpdateThroughTwin(patch, callback);
          sleep(10000, callback);
        },
        function (callback) {
          console.log("Downloaded, applying firmware " + firmwareVersion);
          deviceOnline = false;
          var patch = {
            FirmwareUpdateStatus: 'Applying firmware..',
            Online: false
          };
          reportUpdateThroughTwin(patch, callback);
          sleep(8000, callback);
        },
        function (callback) {
          console.log("Rebooting");
          var patch = {
            FirmwareUpdateStatus: 'Rebooting..'
          };
          reportUpdateThroughTwin(patch, callback);
          sleep(10000, callback);
        },
        function (callback) {
          console.log("Firmware updated to " + firmwareVersion);
          deviceOnline = true;
          var patch = {
            FirmwareUpdateStatus: 'Firmware updated',
            Online: true,
            Firmware: firmwareVersion
          };
          reportUpdateThroughTwin(patch, callback);
          callback(null);
        }
      ], function(err) {
        if (err) {
          console.error('Error in simulated firmware update flow: ' + err.message);
        } else {
          console.log("Completed simulated firmware update flow");
        }
      });
    
      // Helper function to update the twin reported properties.
      function reportUpdateThroughTwin(patch, callback) {
        console.log("Sending...");
        console.log(JSON.stringify(patch, null, 2));
        client.getTwin(function(err, twin) {
          if (!err) {
            twin.properties.reported.update(patch, function(err) {
              if (err) callback(err);
            });      
          } else {
            if (err) callback(err);
          }
        });
      }
    
      function sleep(milliseconds, callback) {
        console.log("Simulate a delay (milleseconds): " + milliseconds);
        setTimeout(function () {
          callback(null);
        }, milliseconds);
      }
    }
    
  14. Přidejte následující kód pro odesílání telemetrických dat do řešení. Klientská aplikace přidá do zprávy vlastnosti pro identifikaci schématu zprávy:

    function sendTelemetry(data, schema) {
      if (deviceOnline) {
        var d = new Date();
        var payload = JSON.stringify(data);
        var message = new Message(payload);
        message.properties.add('iothub-creation-time-utc', d.toISOString());
        message.properties.add('iothub-message-schema', schema);
    
        console.log('Sending device message data:\n' + payload);
        client.sendEvent(message, printErrorFor('send event'));
      } else {
        console.log('Offline, not sending telemetry');
      }
    }
    
  15. Přidejte následující kód pro vytvoření instance klienta:

    var client = Client.fromConnectionString(connectionString, Protocol);
    
  16. Přidejte následující kód:

    • Otevřete připojení.

    • Nastavte obslužnou rutinu pro požadované vlastnosti.

    • Odesílání ohlášených vlastností

    • Zaregistrujte obslužné rutiny pro přímé metody. Ukázka používá pro přímou metodu aktualizace firmwaru samostatnou obslužnou rutinu.

    • Začněte odesílat telemetrii.

      client.open(function (err) {
      if (err) {
        printErrorFor('open')(err);
      } else {
        // Create device Twin
        client.getTwin(function (err, twin) {
          if (err) {
            console.error('Could not get device twin');
          } else {
            console.log('Device twin created');
      
            twin.on('properties.desired', function (delta) {
              // Handle desired properties set by solution
              console.log('Received new desired properties:');
              console.log(JSON.stringify(delta));
            });
      
            // Send reported properties
            twin.properties.reported.update(reportedProperties, function (err) {
              if (err) throw err;
              console.log('Twin state reported');
            });
      
            // Register handlers for all the method names we are interested in.
            // Consider separate handlers for each method.
            client.onDeviceMethod('Reboot', onDirectMethod);
            client.onDeviceMethod('FirmwareUpdate', onFirmwareUpdate);
            client.onDeviceMethod('EmergencyValveRelease', onDirectMethod);
            client.onDeviceMethod('IncreasePressure', onDirectMethod);
          }
        });
      
        // Start sending telemetry
        var sendDeviceTelemetry = setInterval(function () {
          temperature += generateRandomIncrement();
          pressure += generateRandomIncrement();
          humidity += generateRandomIncrement();
          var data = {
            'temperature': temperature,
            'temperature_unit': temperatureUnit,
            'humidity': humidity,
            'humidity_unit': humidityUnit,
            'pressure': pressure,
            'pressure_unit': pressureUnit
          };
          sendTelemetry(data, schema)
        }, 5000);
      
        client.on('error', function (err) {
          printErrorFor('client')(err);
          if (sendTemperatureInterval) clearInterval(sendTemperatureInterval);
          if (sendHumidityInterval) clearInterval(sendHumidityInterval);
          if (sendPressureInterval) clearInterval(sendPressureInterval);
          client.close(printErrorFor('client.close'));
        });
      }
      });
      
  17. Uložte změny do souboru remote_monitoring.js .

  18. Pokud chcete spustit ukázkovou aplikaci, spusťte na příkazovém řádku následující příkaz:

    node remote_monitoring.js
    

Zobrazení telemetrie zařízení

Telemetrická data odeslaná ze zařízení můžete zobrazit na stránce Průzkumníka zařízení v řešení.

  1. Vyberte zařízení, které jste zřídili v seznamu zařízení na stránce Průzkumník zařízení . Na panelu se zobrazí informace o vašem zařízení včetně grafu telemetrie zařízení:

    Zobrazit podrobnosti o zařízení

  2. Zvolte Tlak a změňte zobrazení telemetrie:

    Zobrazení telemetrie tlaku

  3. Pokud chcete zobrazit diagnostické informace o zařízení, posuňte se dolů k diagnostice:

    Zobrazení diagnostiky zařízení

Akce na vašem zařízení

K vyvolání metod na vašich zařízeních použijte stránku Průzkumníka zařízení v řešení vzdáleného monitorování. Například v zařízeních Chladič řešení vzdáleného monitorování implementují metodu restartování .

  1. Zvolte Zařízení a přejděte na stránku Průzkumníka zařízení v řešení.

  2. Vyberte zařízení, které jste zřídili v seznamu zařízení na stránce Průzkumník zařízení :

    Výběr skutečného zařízení

  3. Pokud chcete zobrazit seznam metod, které můžete volat na zařízení, zvolte Úlohy a pak Metody. Pokud chcete naplánovat spuštění úlohy na více zařízeních, můžete v seznamu vybrat několik zařízení. Na panelu Úlohy se zobrazují typy běžných metod pro všechna vybraná zařízení.

  4. Zvolte Restartovat, nastavte název úlohy na RebootPhysicalChiller a pak zvolte Použít:

    Naplánování aktualizace firmwaru

  5. Posloupnost zpráv se zobrazí v konzole s kódem zařízení, zatímco simulované zařízení zpracovává metodu.

Poznámka

Pokud chcete sledovat stav úlohy v řešení, zvolte Zobrazit stav úlohy.

Další kroky

Článek Přizpůsobení akcelerátoru řešení vzdáleného monitorování popisuje některé způsoby přizpůsobení akcelerátoru řešení.