Łączenie urządzenia ze wstępnie skonfigurowanym rozwiązaniem do monitorowania zdalnego (Node.js)
Omówienie scenariusza
W tym scenariuszu utworzysz urządzenie, które wysyła następujące dane telemetryczne do wstępnie skonfigurowanego rozwiązania do monitorowania zdalnego:
- Temperatura zewnętrzna
- Temperatura wewnętrzna
- Wilgotność
Dla uproszczenia kod na urządzeniu generuje przykładowe wartości, ale zachęcamy do rozszerzenia przykładu przez podłączenie rzeczywistych czujników do urządzenia i wysyłanie rzeczywistych danych telemetrycznych.
Urządzenie potrafi także odpowiadać na metody wywołane z poziomu pulpitu nawigacyjnego rozwiązania i wartości żądanych właściwości ustawione na pulpicie nawigacyjnym rozwiązania.
Do wykonania kroków tego samouczka jest potrzebne aktywne konto platformy Azure. Jeśli nie masz konta, możesz utworzyć bezpłatne konto próbne w zaledwie kilka minut. Aby uzyskać szczegółowe informacje, zobacz Bezpłatna wersja próbna platformy Azure.
Przed rozpoczęciem
Przed przystąpieniem do pisania jakiegokolwiek kodu dla urządzenia musisz przeprowadzić aprowizację wstępnie skonfigurowanego rozwiązania do monitorowania zdalnego i nowego niestandardowego urządzenia w ramach tego rozwiązania.
Aprowizowanie wstępnie skonfigurowanego rozwiązania do monitorowania zdalnego
Urządzenie, które utworzysz w ramach tego samouczka, będzie wysyłać dane do wystąpienia wstępnie skonfigurowanego rozwiązania do monitorowania zdalnego. Jeśli jeszcze nie przeprowadzono aprowizacji wstępnie skonfigurowanego rozwiązania do monitorowania zdalnego na Twoim koncie platformy Azure, wykonaj poniższe kroki:
- https://www.azureiotsolutions.com/ Na stronie kliknij, + aby utworzyć rozwiązanie.
- Kliknij pozycję Wybierz w panelu Monitorowanie zdalne, aby utworzyć rozwiązanie.
- Na stronie Tworzenie rozwiązania do monitorowania zdalnego w polu Nazwa rozwiązania wprowadź wybraną nazwę rozwiązania, w polu Region wybierz region, w którym chcesz przeprowadzić wdrożenie, a następnie wybierz subskrypcję platformy Azure, której chcesz użyć. Następnie kliknij pozycję Utwórz rozwiązanie.
- Zaczekaj na ukończenie procesu aprowizowania.
Ostrzeżenie
Wstępnie skonfigurowane rozwiązania korzystają z płatnych usług platformy Azure. Pamiętaj o usunięciu wstępnie skonfigurowanego rozwiązania ze swojej subskrypcji po zakończeniu pracy z nim, aby uniknąć wszelkich zbędnych opłat. Możesz całkowicie usunąć wstępnie skonfigurowane rozwiązanie z subskrypcji, odwiedzając https://www.azureiotsolutions.com/ stronę.
Po zakończeniu procesu aprowizowania rozwiązania do monitorowania zdalnego kliknij pozycję Uruchom, aby otworzyć pulpit nawigacyjny rozwiązania w przeglądarce.
Aprowizowanie urządzenia w ramach rozwiązania do monitorowania zdalnego
Uwaga
Jeśli już przeprowadzono aprowizację urządzenia w ramach rozwiązania, możesz pominąć ten krok. Podczas tworzenia aplikacji klienckiej musisz znać poświadczenia urządzenia.
Aby urządzenie mogło nawiązać połączenie ze wstępnie skonfigurowanym rozwiązaniem, musi ono zidentyfikować się względem usługi IoT Hub za pomocą prawidłowych poświadczeń. Poświadczenia urządzenia możesz pobrać z pulpitu nawigacyjnego rozwiązania. W dalszej części tego samouczka podasz te poświadczenia urządzenia w Twojej aplikacji klienckiej.
Aby dodać urządzenie do swojego rozwiązania do monitorowania zdalnego, wykonaj poniższe kroki na pulpicie nawigacyjnym rozwiązania:
W lewym dolnym rogu pulpitu nawigacyjnego kliknij pozycję Dodaj urządzenie.
W panelu Urządzenie niestandardowe kliknij pozycję Dodaj nowe.
Wybierz pozycję Pozwól mi zdefiniować własny identyfikator urządzenia. Wprowadź identyfikator urządzenia, na przykład moje_urządzenie, kliknij pozycję Sprawdź identyfikator, aby sprawdzić, czy dana nazwa nie jest już używana, a następnie kliknij pozycję Utwórz, aby przeprowadzić aprowizację urządzenia.
Zanotuj poświadczenia urządzenia (identyfikator urządzenia, nazwę hosta usługi IoT Hub i klucz urządzenia). Twoja aplikacja kliencka potrzebuje tych wartości, aby mogła nawiązać połączenie z rozwiązaniem do monitorowania zdalnego. Następnie kliknij przycisk Gotowe.
Wybierz urządzenie na liście urządzeń na pulpicie nawigacyjnym rozwiązania. Następnie w panelu Szczegóły urządzenia kliknij pozycję Włącz urządzenie. Stan Twojego urządzenia to teraz Uruchomione. Rozwiązanie do monitorowania zdalnego może teraz odbierać dane telemetryczne z Twojego urządzenia i wywoływać metody na tym urządzeniu.
Tworzenie przykładowego rozwiązania node.js
Upewnij się, że na maszynie deweloperów jest zainstalowana Node.js w wersji 0.11.5 lub nowszej. Możesz uruchomić polecenie node --version
w wierszu polecenia, aby sprawdzić wersję.
Utwórz folder o nazwie RemoteMonitoring na komputerze deweloperskim. Przejdź do tego folderu w środowisku wiersza polecenia.
Uruchom następujące polecenia, aby pobrać i zainstalować pakiety potrzebne do ukończenia przykładowej aplikacji:
npm init npm install azure-iot-device azure-iot-device-mqtt --save
W folderze RemoteMonitoring utwórz plik o nazwie remote_monitoring.js. Otwórz ten plik w edytorze tekstu.
W pliku remote_monitoring.js dodaj następujące
require
instrukcje:'use strict'; var Protocol = require('azure-iot-device-mqtt').Mqtt; var Client = require('azure-iot-device').Client; var ConnectionString = require('azure-iot-device').ConnectionString; var Message = require('azure-iot-device').Message;
Dodaj następujące deklaracje zmiennych po instrukcji
require
. Zastąp wartości zastępcze [Identyfikator urządzenia] i [Klucz urządzenia] wartościami wymienionymi dla urządzenia na pulpicie nawigacyjnym rozwiązania do monitorowania zdalnego. Użyj nazwy hosta usługi IoT Hub z pulpitu nawigacyjnego rozwiązania w celu zastąpienia wartości zastępczej [Nazwa usługi IoTHub]. Jeśli na przykład host usługi IoT Hub ma nazwę contoso.azure-devices.net, zastąp wartość zastępczą [Nazwa usługi IoTHub] ciągiem contoso:var connectionString = 'HostName=[IoTHub Name].azure-devices.net;DeviceId=[Device Id];SharedAccessKey=[Device Key]'; var deviceId = ConnectionString.parse(connectionString).DeviceId;
Dodaj następujące zmienne, aby zdefiniować podstawowe dane telemetryczne:
var temperature = 50; var humidity = 50; var externalTemperature = 55;
Dodaj następującą funkcję pomocnika, aby wydrukować wyniki operacji:
function printErrorFor(op) { return function printError(err) { if (err) console.log(op + ' error: ' + err.toString()); }; }
Dodaj następującą funkcję pomocnika, która ma być używana do losowania wartości telemetrii:
function generateRandomIncrement() { return ((Math.random() * 2) - 1); }
Dodaj następującą definicję obiektu DeviceInfo , który urządzenie wysyła podczas uruchamiania:
var deviceMetaData = { 'ObjectType': 'DeviceInfo', 'IsSimulatedDevice': 0, 'Version': '1.0', 'DeviceProperties': { 'DeviceID': deviceId, 'HubEnabledState': 1 } };
Dodaj następującą definicję dla zgłoszonych wartości bliźniaczej reprezentacji urządzenia. Ta definicja zawiera opisy metod bezpośrednich obsługiwanych przez urządzenie:
var reportedProperties = { "Device": { "DeviceState": "normal", "Location": { "Latitude": 47.642877, "Longitude": -122.125497 } }, "Config": { "TemperatureMeanValue": 56.7, "TelemetryInterval": 45 }, "System": { "Manufacturer": "Contoso Inc.", "FirmwareVersion": "2.22", "InstalledRAM": "8 MB", "ModelNumber": "DB-14", "Platform": "Plat 9.75", "Processor": "i3-9", "SerialNumber": "SER99" }, "Location": { "Latitude": 47.642877, "Longitude": -122.125497 }, "SupportedMethods": { "Reboot": "Reboot the device", "InitiateFirmwareUpdate--FwPackageURI-string": "Updates device Firmware. Use parameter FwPackageURI to specifiy the URI of the firmware file" }, }
Dodaj następującą funkcję do obsługi wywołania metody bezpośredniej Reboot :
function onReboot(request, response) { // Implement actual logic here. console.log('Simulated reboot...'); // Complete the response response.send(200, "Rebooting device", 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.' ); } }); }
Dodaj następującą funkcję, aby obsłużyć wywołanie metody bezpośredniej InitiateFirmwareUpdate . Ta metoda bezpośrednia używa parametru w celu określenia lokalizacji obrazu oprogramowania układowego do pobrania i zainicjowania aktualizacji oprogramowania układowego na urządzeniu asynchronicznie:
function onInitiateFirmwareUpdate(request, response) { console.log('Simulated firmware update initiated, using: ' + request.payload.FwPackageURI); // Complete the response response.send(200, "Firmware update initiated", 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.' ); } }); // Add logic here to perform the firmware update asynchronously }
Dodaj następujący kod, aby utworzyć wystąpienie klienta:
var client = Client.fromConnectionString(connectionString, Protocol);
Dodaj następujący kod do:
- Otwórz połączenie.
- Wyślij obiekt DeviceInfo .
- Skonfiguruj procedurę obsługi dla żądanych właściwości.
- Wysyłanie zgłoszonych właściwości.
- Rejestrowanie procedur obsługi metod bezpośrednich.
- Rozpocznij wysyłanie danych telemetrycznych.
client.open(function (err) { if (err) { printErrorFor('open')(err); } else { console.log('Sending device metadata:\n' + JSON.stringify(deviceMetaData)); client.sendEvent(new Message(JSON.stringify(deviceMetaData)), printErrorFor('send metadata')); // 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) { 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 direct methods client.onDeviceMethod('Reboot', onReboot); client.onDeviceMethod('InitiateFirmwareUpdate', onInitiateFirmwareUpdate); } }); // Start sending telemetry var sendInterval = setInterval(function () { temperature += generateRandomIncrement(); externalTemperature += generateRandomIncrement(); humidity += generateRandomIncrement(); var data = JSON.stringify({ 'DeviceID': deviceId, 'Temperature': temperature, 'Humidity': humidity, 'ExternalTemperature': externalTemperature }); console.log('Sending device event data:\n' + data); client.sendEvent(new Message(data), printErrorFor('send event')); }, 5000); client.on('error', function (err) { printErrorFor('client')(err); if (sendInterval) clearInterval(sendInterval); client.close(printErrorFor('client.close')); }); } });
Zapisz zmiany w pliku remote_monitoring.js .
Uruchom następujące polecenie w wierszu polecenia, aby uruchomić przykładową aplikację:
node remote_monitoring.js
Wyświetlanie danych telemetrycznych z urządzeń na pulpicie nawigacyjnym
Pulpit nawigacyjny w rozwiązaniu do monitorowania zdalnego umożliwia wyświetlenie danych telemetrycznych wysyłanych z Twoich urządzeń do usługi IoT Hub.
W przeglądarce powróć do pulpitu nawigacyjnego rozwiązania do monitorowania zdalnego i kliknij pozycję Urządzenia w lewym panelu, aby przejść do listy urządzeń.
Na liście urządzeń powinien być widoczny stan urządzenia Uruchomione. W przeciwnym razie kliknij pozycję Włącz urządzenie w panelu Szczegóły urządzenia.
Kliknij pozycję Pulpit nawigacyjny, aby powrócić do pulpitu nawigacyjnego, a następnie wybierz swoje urządzenie z listy rozwijanej Urządzenie do wyświetlenia, aby wyświetlić z niego dane telemetryczne. Dane telemetryczne z przykładowej aplikacji to 50 jednostek temperatury wewnętrznej, 55 — temperatury zewnętrznej i 50 — wilgotności.
Wywoływanie metody na urządzeniu
Pulpit nawigacyjny w rozwiązaniu do monitorowania zdalnego umożliwia wywoływanie metod na urządzaniach za pomocą usługi IoT Hub. W rozwiązaniu do monitorowania zdalnego możesz na przykład wywołać metodę symulacji ponownego uruchomienia urządzenia.
Na pulpicie nawigacyjnym rozwiązania do monitorowania zdalnego kliknij pozycję Urządzenia w lewym panelu, aby przejść do listy urządzeń.
Kliknij pozycję Identyfikator urządzenia dla swojego urządzenia na liście urządzeń.
W panelu Szczegóły urządzenia kliknij pozycję Metody.
Na liście rozwijanej Metoda wybierz metodę InitiateFirmwareUpdate (inicjowanie aktualizacji oprogramowania układowego), a następnie w polu FWPACKAGEURI (identyfikator URI pakietu oprogramowania układowego) wprowadź zastępczy adres URL. Kliknij pozycję Wywołaj metodę, aby wywołać metodę na urządzeniu.
Gdy urządzenie obsłuży metodę, zostanie wyświetlony komunikat w konsoli uruchamiania kodu urządzenia. Wyniki metody zostaną dodane do historii w portalu rozwiązania:
Następne kroki
W artykule Dostosowywanie wstępnie skonfigurowanych rozwiązań opisano niektóre sposoby pozwalające rozszerzyć ten przykład. Możliwe rozszerzenia obejmują użycie rzeczywistych czujników i implementację dodatkowych poleceń.
Więcej informacji na temat uprawnień podano w witrynie azureiotsuite.com.