Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Applies to:
IoT Edge 1.5
Ważne
IoT Edge 1.5 LTS to wspierana wersja. IoT Edge 1.4 LTS osiągnął koniec życia 12 listopada 2024 r. Jeśli używasz wcześniejszej wersji, zobacz Update IoT Edge.
W tym samouczku pokazano, jak tworzyć i wdrażać kod na urządzenia IoT Edge. moduły Azure IoT Edge umożliwiają wdrażanie kodu, który uruchamia logikę biznesową bezpośrednio na urządzeniu IoT Edge. W kodzie Deploy na urządzeniu z systemem Linux skonfigurowano urządzenie IoT Edge i wdrożono moduł z Azure Marketplace.
W tym artykule opisano kroki korzystania z dwóch narzędzi programistycznych IoT Edge:
- Azure IoT Edge Dev Tool wiersz poleceń (CLI), który jest preferowany do rozwoju.
- rozszerzenie narzędzi Azure IoT Edge dla Visual Studio Code, które znajduje się w trybie konserwacji.
Użyj przycisku selektora narzędzi na początku tego artykułu, aby wybrać narzędzie.
Z tego samouczka dowiesz się, jak wykonywać następujące czynności:
- Skonfiguruj swój komputer do programowania
- Tworzenie nowego projektu przy użyciu narzędzi IoT Edge
- Skompiluj projekt jako kontener Docker i zapisz go w rejestrze kontenerów Azure
- Wdrażanie kodu na urządzeniu IoT Edge
Moduł IoT Edge utworzony w tym samouczku filtruje dane temperatury generowane przez urządzenie. Wysyła wiadomości do wyższych poziomów tylko wtedy, gdy temperatura przekracza ustawiony próg. Tego rodzaju analiza na brzegu sieci pomaga zmniejszyć ilość danych wysyłanych do chmury i przechowywanych w chmurze.
Wymagania wstępne
Maszyna deweloperna:
- Użyj własnego komputera lub maszyny wirtualnej.
- Upewnij się, że maszyna developerska obsługuje wirtualizację zagnieżdżoną w celu uruchomienia silnika kontenerów.
- Większość systemów operacyjnych z uruchomionym silnikiem kontenerów można używać do rozwijania modułów IoT Edge dla urządzeń z systemem Linux. Samouczek używa komputera z systemem Windows, ale wskazuje również znane różnice w systemach macOS i Linux.
- Zainstaluj Visual Studio Code
- Zainstaluj Azure CLI.
Urządzenie Azure IoT Edge:
- Uruchom IoT Edge na oddzielnym urządzeniu. Utrzymywanie maszyny deweloperskiej i urządzenia IoT Edge osobno symuluje rzeczywisty scenariusz wdrażania i pomaga zachować przejrzystość pojęć. Skorzystaj z artykułu szybkiego startu Deploy code to a Linux Device, aby utworzyć urządzenie IoT Edge w Azure, lub z szablonu Azure Resource Manager do wdrożenia maszyny wirtualnej z obsługą IoT Edge.
Zasoby w chmurze:
- Użyj bezpłatnej lub standardowej warstwy Azure IoT Hub.
Jeśli nie masz konta Azure, przed rozpoczęciem utwórz konto free.
Wskazówka
Aby uzyskać wskazówki dotyczące debugowania interaktywnego w Visual Studio Code lub Visual Studio 2022:
- Debugowanie modułów Azure IoT Edge za pomocą Visual Studio Code
- Użyj Visual Studio 2022 do tworzenia i debugowania modułów dla Azure IoT Edge
W tym samouczku opisano kroki programowania dla Visual Studio Code.
Najważniejsze pojęcia
Ten samouczek przeprowadzi Cię przez proces tworzenia modułu IoT Edge. Moduł IoT Edge to kontener z kodem wykonywalnym. Na urządzeniu IoT Edge można wdrożyć co najmniej jeden moduł. Moduły wykonują określone zadania, takie jak pozyskiwanie danych z czujników, czyszczenie i analizowanie danych lub wysyłanie komunikatów do IoT Hub. Aby uzyskać więcej informacji, zobacz Understand Azure IoT Edge modules.
Podczas opracowywania modułów IoT Edge należy zrozumieć różnicę między maszyną dewelopera a docelowym urządzeniem IoT Edge, na którym jest wdrażany moduł. Kontener, który utworzysz do przechowywania kodu modułu, musi być zgodny z systemem operacyjnym urządzenia docelowego. Na przykład najbardziej typowym scenariuszem jest opracowanie modułu na komputerze Windows przeznaczonym dla urządzenia z systemem Linux z systemem IoT Edge. W takim przypadku system operacyjny kontenera to Linux. Podczas pracy z tym samouczkiem należy pamiętać o różnicy między systemem operacyjnym maszyny dewelopera i systemem operacyjnym kontenera.
Wskazówka
Jeśli używasz IoT Edge dla systemu Linux w systemie Windows urządzenie docelowe w twoim scenariuszu jest maszyną wirtualną z systemem Linux, a nie hostem Windows.
Ten samouczek dotyczy urządzeń z systemem IoT Edge z kontenerami systemu Linux. Użyj preferowanego systemu operacyjnego, o ile maszyna programowa uruchamia kontenery systemu Linux. Visual Studio Code jest zalecane do pracy z kontenerami systemu Linux, więc ten samouczek go używa. Można również użyć Visual Studio, chociaż istnieją różnice w obsłudze między dwoma narzędziami.
W poniższej tabeli wymieniono obsługiwane scenariusze programowania dla kontenerów systemu Linux w Visual Studio Code i Visual Studio.
| Visual Studio Code | Visual Studio 2019/2022 | |
|---|---|---|
| Architektura urządzenia z systemem Linux | Linux AMD64 Linux ARM32v7 Linux ARM64 |
Linux AMD64 Linux ARM32 Linux ARM64 |
| Azure services | Azure Functions Azure Stream Analytics Azure Machine Learning |
|
| Języki | C C# Java Node.js Python |
C C# |
| Więcej informacji | Azure IoT Edge dla Visual Studio Code |
Azure IoT Edge Tools for Visual Studio 2019 Azure IoT Edge Tools for Visual Studio 2022 |
Zainstalować silnik kontenerów
moduły IoT Edge są pakowane jako kontenery, dlatego potrzebujesz System zarządzania kontenerami zgodny z platformąDocker na maszynie deweloperów do ich kompilowania i zarządzania nimi. Docker Desktop jest popularnym wyborem do programowania, ponieważ ma silną obsługę funkcji. Program Docker Desktop na Windows umożliwia przełączanie się między kontenerami systemu Linux i kontenerami Windows, dzięki czemu można opracowywać moduły dla różnych typów urządzeń IoT Edge.
Użyj dokumentacji platformy Docker, aby zainstalować platformę Docker na komputerze deweloperskim:
Install Docker Desktop for Windows. Podczas instalowania programu Docker Desktop dla Windows zostanie wyświetlony monit o to, czy chcesz używać kontenerów systemu Linux, czy Windows. To ustawienie można zmienić w dowolnym momencie. W tym samouczku są używane kontenery systemu Linux, ponieważ moduły są przeznaczone dla urządzeń z systemem Linux. Aby uzyskać więcej informacji, zobacz Switch między kontenerami Windows i Linux.
Przeczytaj informacje na temat platformy Docker CE , aby uzyskać informacje o instalacji na kilku platformach Linux. W przypadku Windows Subsystem for Linux (WSL) zainstaluj program Docker Desktop dla Windows.
Konfigurowanie narzędzi
Zainstaluj opartą na Pythonie Azure IoT Edge Dev Tool, by utworzyć rozwiązanie IoT Edge. Dostępne są dwie opcje:
- Użyj preferowanej wstępnie utworzonej IoT Edge Dev Container.
- Zainstaluj narzędzie przy użyciu instalatora programowania iotedgedev.
Ważne
Narzędzia Azure IoT Edge dla rozszerzenia Visual Studio Code są w trybie maintenance. Preferowanym narzędziem programistycznym jest narzędzie deweloperskie Azure IoT Edge wiersza poleceń (CLI).
Użyj rozszerzeń IoT dla Visual Studio Code, aby tworzyć moduły IoT Edge. Te rozszerzenia oferują szablony projektów, automatyzują tworzenie manifestu wdrożenia i umożliwiają monitorowanie urządzeń IoT Edge i zarządzanie nimi. W tej sekcji zainstalujesz Visual Studio Code i rozszerzenie IoT, a następnie skonfigurujesz konto Azure w celu zarządzania zasobami IoT Hub z poziomu Visual Studio Code.
- Zainstaluj rozszerzenie Azure IoT Edge.
- Zainstaluj rozszerzenie Azure IoT Hub.
- Po zainstalowaniu rozszerzeń otwórz paletę poleceń, wybierając pozycję Wyświetl > paletę poleceń.
- W palecie poleceń wyszukaj i wybierz pozycję Azure IoT Hub: Wybierz IoT Hub. Postępuj zgodnie z monitami, aby wybrać subskrypcję Azure i IoT Hub.
- Otwórz sekcję eksploratora Visual Studio Code, wybierając ikonę na pasku działań lub wybierając pozycję View > Explorer.
- W dolnej części sekcji eksploratora rozwiń zwinięte menu Azure IoT Hub/Urządzenia. Zostaną wyświetlone urządzenia i urządzenia IoT Edge skojarzone z IoT Hub wybrane za pomocą palety poleceń.
Instalowanie narzędzi specyficznych dla języka
Zainstaluj narzędzia specyficzne dla języka, w którym programujesz:
- .NET Core SDK
- rozszerzenie C# Visual Studio Code
Tworzenie rejestru kontenerów
W tym samouczku użyjesz rozszerzeń Azure IoT Edge i Azure IoT Hub do utworzenia modułu i utworzenia obrazu kontenera z plików. Następnie wypchniesz ten obraz do rejestru, który przechowuje obrazy i zarządza nimi. Na koniec wdrożysz obraz z rejestru, aby był uruchamiany na urządzeniu IoT Edge.
Ważne
Rozszerzenie Azure IoT Edge do Visual Studio Code jest w trybie konserwacji.
Do przechowywania obrazów kontenerów możesz użyć dowolnego rejestru zgodnego z platformą Docker. Dwie popularne usługi rejestru kontenerów Docker to Azure Container Registry i Docker Hub. Ten samouczek wykorzystuje Azure Container Registry.
Jeśli nie masz jeszcze rejestru kontenerów, wykonaj następujące kroki, aby utworzyć nowy w Azure:
W portalu Azure wybierz Utwórz zasób>Kontenery>Rejestr Kontenerów.
Podaj następujące wymagane wartości do utworzenia rejestru kontenerów:
Pole Wartość Subskrypcja Wybierz subskrypcję z listy rozwijanej. Grupa zasobów Użyj tej samej grupy zasobów dla wszystkich zasobów testowych tworzonych podczas szybkiego uruchamiania i samouczków IoT Edge, na przykład IoTEdgeResources. Nazwa rejestru Podaj unikatową nazwę. Lokalizacja Wybierz bliską lokalizację. SKU Wybierz pozycję Podstawowa. Wybierz Recenzuj + Utwórz, a następnie Utwórz.
Wybierz nowy rejestr kontenerów w sekcji Resources na stronie głównej portalu Azure, aby go otworzyć.
W okienku po lewej stronie rejestru kontenerów wybierz pozycję Klucze dostępu z menu znajdującego się w obszarze Ustawienia.
Włącz użytkownika administratora za pomocą przycisku przełącznika i wyświetl nazwę użytkownika i hasło dla rejestru kontenerów.
Skopiuj wartości serwera logowania, nazwy użytkownika i hasła i zapisz je w dogodnym miejscu. Tych wartości używasz w całym tym samouczku, aby zapewnić dostęp do rejestru kontenerów.
Tworzenie nowego projektu modułu
Rozszerzenie Azure IoT Edge oferuje szablony projektów dla wszystkich obsługiwanych języków modułów IoT Edge w Visual Studio Code. Te szablony obejmują wszystkie pliki i kod, które należy wdrożyć, aby przetestować IoT Edge, lub dać punkt wyjścia do dostosowania szablonu przy użyciu własnej logiki biznesowej.
Tworzenie szablonu projektu
IoT Edge Dev Tool upraszcza programowanie Azure IoT Edge za pomocą poleceń opartych na zmiennych środowiskowych. Ułatwia rozpoczęcie opracowywania IoT Edge przy użyciu kontenera deweloperskiego IoT Edge i szkieletu rozwiązania IoT Edge zawierającego domyślny moduł i wszystkie wymagane pliki konfiguracji.
Utwórz katalog dla rozwiązania w żądanej ścieżce. Przejdź do katalogu
iotedgesolution.mkdir c:\dev\iotedgesolution cd c:\dev\iotedgesolutionUżyj polecenia
iotedgedev solution init, aby utworzyć rozwiązanie i skonfigurować Azure IoT Hub w wybranym języku programowania:
Polecenie iotedgedev solution init wyświetla monit o wykonanie kilku kroków, w tym:
- Uwierzytelnianie w Azure
- Wybieranie subskrypcji Azure
- Wybieranie lub tworzenie grupy zasobów
- Wybieranie lub tworzenie Azure IoT Hub
- Wybieranie lub tworzenie urządzenia Azure IoT Edge
Użyj Visual Studio Code i rozszerzenia Azure IoT Edge. Zacznij od utworzenia rozwiązania, a następnie wygeneruj pierwszy moduł w tym rozwiązaniu. Każde rozwiązanie może zawierać wiele modułów.
- Wybierz pozycję Wyświetl > paletę poleceń.
- W palecie poleceń wprowadź i uruchom polecenie Azure IoT Edge: New IoT Edge Solution.
- Przejdź do folderu, w którym chcesz utworzyć nowe rozwiązanie, a następnie wybierz pozycję Wybierz folder.
- Wprowadź nazwę rozwiązania.
- Wybierz szablon modułu, aby preferowany język programowania był pierwszym modułem w rozwiązaniu.
- Wprowadź nazwę modułu. Wybierz unikatową nazwę w rejestrze kontenerów.
- Wprowadź nazwę repozytorium obrazów modułu. Visual Studio Code automatycznie wypełnia nazwę modułu jako localhost:5000/<twoja_nazwa_modułu>. Zastąp je własnymi informacjami rejestru. Użyj hosta lokalnego , jeśli używasz lokalnego rejestru platformy Docker do testowania. Jeśli używasz Azure Container Registry, użyj serwera Login z ustawień rejestru. Serwer logowania wygląda jak <nazwa rejestru>.azurecr.io. Zastąp tylko część ciągu localhost:5000, aby końcowy wynik wyglądał następująco: <nazwa rejestru>.azurecr.io/<nazwa modułu>.
Visual Studio Code pobiera podane informacje, tworzy rozwiązanie IoT Edge, a następnie ładuje je w nowym oknie.
Po utworzeniu rozwiązania te główne pliki znajdują się w rozwiązaniu:
Folder .vscode zawiera plik konfiguracji launch.json.
Folder modules zawiera podfoldery dla każdego modułu. W każdym podfolderze plik module.json kontroluje sposób kompilowania i wdrażania modułów.
Plik env zawiera listę zmiennych środowiskowych. Zmienna środowiskowa rejestru kontenerów jest domyślnie localhost:5000 .
Dwa pliki wdrażania modułu, deployment.template.json i deployment.debug.template.json, zawierają listę modułów do wdrożenia na urządzeniu. Domyślnie lista zawiera moduły systemu IoT Edge (edgeAgent i edgeHub) oraz przykładowe moduły, takie jak:
- filtermodule to przykładowy moduł, który implementuje prostą funkcję filtru.
- Moduł SimulatedTemperatureSensor symuluje dane, których można użyć do testowania. Aby uzyskać więcej informacji na temat sposobu działania manifestów wdrażania, zobacz Dowiedz się, jak używać manifestów wdrażania do wdrażania modułów i ustanawiania tras. Aby uzyskać więcej informacji na temat działania modułu symulowanej temperatury, zobacz kod źródłowy SimulatedTemperatureSensor.csproj.
Uwaga
Dokładne zainstalowane moduły mogą zależeć od wybranego języka.
Ustawianie wersji środowiska uruchomieniowego IoT Edge
Najnowsza stabilna wersja modułu systemu IoT Edge to 1.5. Ustaw moduły systemowe na wersję 1.5.
W Visual Studio Code otwórz plik manifestu wdrożenia deployment.template.json. Manifest deployment to dokument JSON opisujący moduły do skonfigurowania na docelowym urządzeniu IoT Edge.
Zmień wersję środowiska uruchomieniowego dla obrazów modułów środowiska uruchomieniowego systemu
edgeAgentiedgeHub. Jeśli na przykład chcesz użyć środowiska uruchomieniowego IoT Edge w wersji 1.5, zmień następujące wiersze w pliku manifestu wdrożenia:"systemModules": { "edgeAgent": { "image": "mcr.microsoft.com/azureiotedge-agent:1.5", "edgeHub": { "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
Podaj poświadczenia rejestru agentowi IoT Edge
Plik środowiska przechowuje poświadczenia dla rejestru kontenerów i udostępnia je środowisku uruchomieniowemu IoT Edge. Środowisko uruchomieniowe wymaga tych poświadczeń, aby ściągnąć obrazy kontenerów na urządzenie IoT Edge.
Rozszerzenie IoT Edge próbuje ściągnąć poświadczenia rejestru kontenerów z Azure i wypełnić je w pliku środowiska.
Uwaga
Plik środowiska jest tworzony tylko wtedy, gdy udostępnisz repozytorium obrazów dla modułu. Jeśli zaakceptowano domyślne ustawienia localhost do testowania i debugowania lokalnie, nie musisz deklarować zmiennych środowiskowych.
Sprawdź, czy twoje poświadczenia istnieją. Jeśli nie, dodaj je teraz:
Jeśli Azure Container Registry jest rejestrem, ustaw nazwę użytkownika i hasło Azure Container Registry. Pobierz te wartości z menu Ustawienia>Klucze dostępu w portalu Azure.
Otwórz plik .env w rozwiązaniu modułu.
Dodaj wartości username i password skopiowane z rejestru kontenerów usługi Azure. Na przykład:
CONTAINER_REGISTRY_SERVER="myacr.azurecr.io" CONTAINER_REGISTRY_USERNAME="myacr" CONTAINER_REGISTRY_PASSWORD="<registry_password>"Zapisz zmiany w pliku env .
Uwaga
W tym samouczku są używane poświadczenia administratora dla Azure Container Registry, co jest wygodne w przypadku scenariuszy rozwoju i testowania. Gdy jesteś gotowy na scenariusze produkcyjne, zalecamy użycie opcji uwierzytelniania o najniższych uprawnieniach, takich jak wewnętrzne identyfikatory lub tokeny z zakresem repozytorium. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do rejestru kontenerów.
Architektura docelowa
Wybierz architekturę docelową dla każdego rozwiązania, ponieważ ma to wpływ na sposób kompilowania i uruchamiania kontenera. Wartość domyślna to Linux AMD64. Na potrzeby tego samouczka użyj maszyny wirtualnej z systemem Ubuntu jako urządzenia IoT Edge i zachowaj domyślną amd64.
Jeśli musisz zmienić architekturę docelową rozwiązania, wykonaj następujące kroki.
- Otwórz paletę poleceń i wyszukaj Azure IoT Edge: Ustaw domyślną platformę docelową rozwiązania edge lub wybierz ikonę skrótu na pasku bocznym u dołu okna.
- Na palecie poleceń wybierz architekturę docelową z listy opcji.
Architektura docelowa jest ustawiana podczas tworzenia obrazu kontenera w późniejszym kroku.
Aktualizowanie modułu przy użyciu kodu niestandardowego
Każdy szablon zawiera przykładowy kod, który pobiera symulowane dane czujnika z modułu SimulatedTemperatureSensor i kieruje go do IoT Hub. Przykładowy moduł odbiera komunikaty i przekazuje je dalej. Funkcjonalność przepływu pracy pokazuje ważną koncepcję w IoT Edge: jak moduły komunikują się ze sobą.
Każdy moduł może mieć wiele kolejek wejściowych i wyjściowych zadeklarowanych w kodzie. Centrum IoT Edge uruchomione na urządzeniu kieruje komunikaty z danych wyjściowych jednego modułu do danych wejściowych co najmniej jednego modułu. Określony kod do deklarowania danych wejściowych i wyjściowych różni się między językami, ale koncepcja jest taka sama dla wszystkich modułów. Aby uzyskać więcej informacji na temat routingu między modułami, zobacz Deklarowanie tras.
Przykładowy kod języka C# dostarczany z szablonem projektu używa klasy ModuleClient z zestawu SDK IoT Hub dla .NET.
W eksploratorze Visual Studio Code otwórz modules > filtermodule > ModuleBackgroundService.cs.
Przed przestrzenią nazwową
filtermoduledodaj trzyusinginstrukcje dla typów, które są używane później:using System.Collections.Generic; // For KeyValuePair<> using Microsoft.Azure.Devices.Shared; // For TwinCollection using Newtonsoft.Json; // For JsonConvertDodaj zmienną
temperatureThresholddoModuleBackgroundServiceklasy . Ta zmienna ustawia wartość, która musi przekraczać mierzoną temperaturę, aby dane zostały wysłane do IoT Hub.static int temperatureThreshold { get; set; } = 25;Dodaj klasy
MessageBody,MachineiAmbient. Te klasy definiują oczekiwany schemat treści komunikatów przychodzących.class MessageBody { public Machine machine {get;set;} public Ambient ambient {get; set;} public string timeCreated {get; set;} } class Machine { public double temperature {get; set;} public double pressure {get; set;} } class Ambient { public double temperature {get; set;} public int humidity {get; set;} }ExecuteAsyncZnajdź funkcję. Ta funkcja tworzy i konfiguruje obiektModuleClient, który umożliwia modułowi łączenie się z lokalnym środowiskiem uruchomieniowym Azure IoT Edge w celu wysyłania i odbierania komunikatów. Po utworzeniuModuleClient, kod odczytuje wartośćtemperatureThresholdz konfigurowanych właściwości bliźniaka modułu. Kod rejestruje wywołanie zwrotne w celu odbierania komunikatów z centrum IoT Edge za pośrednictwem punktu końcowego o nazwieinput1.Zastąp wywołanie
ProcessMessageAsyncmetody nową, która aktualizuje nazwę punktu końcowego i metodę wywoływaną po nadejściu danych wejściowych. Ponadto dodaj metodęSetDesiredPropertyUpdateCallbackAsync, aby umożliwić aktualizacje żądanych właściwości. Aby wprowadzić tę zmianę, zastąp ostatni wierszExecuteAsyncmetody następującym kodem:// Register a callback for messages that are received by the module. // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken); // Read the TemperatureThreshold value from the module twin's desired properties var moduleTwin = await _moduleClient.GetTwinAsync(); await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient); // Attach a callback for updates to the module twin's desired properties. await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null); // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method. await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);Dodaj metodę
OnDesiredPropertiesUpdatedo klasyModuleBackgroundService. Ta metoda odbiera aktualizacje żądanych właściwości z bliźniaczej reprezentacji modułu i aktualizuje zmiennątemperatureThresholdw celu dopasowania. Wszystkie moduły mają swoje cyfrowe bliźniaki, dzięki czemu można skonfigurować kod działający wewnątrz modułu bezpośrednio z poziomu chmury.static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext) { try { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); if (desiredProperties["TemperatureThreshold"]!=null) temperatureThreshold = desiredProperties["TemperatureThreshold"]; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", exception); } } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error when receiving desired property: {0}", ex.Message); } return Task.CompletedTask; }Dodaj metodę
FilterMessages. Ta metoda jest wywoływana za każdym razem, gdy moduł odbiera komunikat z centrum IoT Edge. Filtrowane są komunikaty zgłaszające temperatury poniżej wartości progowej ustawionej w module. Dodaje również do komunikatu atrybutMessageTypez wartością ustawioną naAlert:async Task<MessageResponse> FilterMessages(Message message, object userContext) { var counterValue = Interlocked.Increment(ref _counter); try { ModuleClient moduleClient = (ModuleClient)userContext; var messageBytes = message.GetBytes(); var messageString = Encoding.UTF8.GetString(messageBytes); Console.WriteLine($"Received message {counterValue}: [{messageString}]"); // Get the message body. var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString); if (messageBody != null && messageBody.machine.temperature > temperatureThreshold) { Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " + $"exceeds threshold {temperatureThreshold}"); using (var filteredMessage = new Message(messageBytes)) { foreach (KeyValuePair<string, string> prop in message.Properties) { filteredMessage.Properties.Add(prop.Key, prop.Value); } filteredMessage.Properties.Add("MessageType", "Alert"); await moduleClient.SendEventAsync("output1", filteredMessage); } } // Indicate that the message treatment is completed. return MessageResponse.Completed; } catch (AggregateException ex) { foreach (Exception exception in ex.InnerExceptions) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", exception); } // Indicate that the message treatment is not completed. var moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); // Indicate that the message treatment is not completed. ModuleClient moduleClient = (ModuleClient)userContext; return MessageResponse.Abandoned; } }Zapisz plik ModuleBackgroundService.cs.
W eksploratorze Visual Studio Code otwórz plik deployment.template.json w obszarze roboczym rozwiązania IoT Edge.
Ponieważ zmieniliśmy nazwę punktu końcowego, na który nasłuchuje moduł, musimy również zaktualizować trasy w manifeście wdrożenia, aby usługa edgeHub wysyłała komunikaty do nowego punktu końcowego.
Znajdź sekcję
routesw bliźniaczej reprezentacji modułu $edgeHub . Zaktualizuj trasęsensorTofiltermodule, zastępującinput1przezinputFromSensor."sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"Dodaj bliźniacze reprezentację modułu filtermodule do manifestu wdrożenia. Wstaw następującą zawartość JSON na dole sekcji
modulesContent, po bliźniaczej reprezentacji modułu $edgeHub:"filtermodule": { "properties.desired":{ "TemperatureThreshold":25 } }Zapisz plik deployment.template.json.
Kompilowanie i publikowanie rozwiązania
Zaktualizowano kod modułu i szablon wdrożenia, aby ułatwić zrozumienie niektórych kluczowych pojęć związanych z wdrażaniem. Teraz możesz zbudować obraz kontenera modułu i przesłać go do rejestru kontenerów.
W Visual Studio Code otwórz plik manifestu wdrożenia deployment.template.json. Manifest deployment opisuje moduły do skonfigurowania na docelowym urządzeniu IoT Edge. Przed wdrożeniem należy zaktualizować dane uwierzytelniające Azure Container Registry i obrazy modułów z odpowiednimi wartościami createOptions. Aby uzyskać więcej informacji na temat wartości createOptions, zobacz Jak skonfigurować opcje tworzenia kontenera dla modułów IoT Edge.
Jeśli używasz Azure Container Registry do przechowywania obrazu modułu, dodaj poświadczenia do sekcji modulesContent > edgeAgent > settings > registryCredentials w deployment.template.json. Zastąp myacr własną nazwą rejestru i podaj hasło oraz adres serwera logowania. Na przykład:
"registryCredentials": {
"myacr": {
"username": "myacr",
"password": "<your_acr_password>",
"address": "myacr.azurecr.io"
}
}
Dodaj lub zastąp następującą zawartość reprezentowaną jako tekst wartością createOptions dla każdego systemu (edgeHub i *edgeAgent) oraz modułu niestandardowego (filtermodule i tempSensor). W razie potrzeby zmień wartości:
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
Na przykład konfiguracja powinna być podobna do następującej filtermodule :
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
Tworzenie obrazu modułu Docker
Otwórz zintegrowany terminal Visual Studio Code, wybierając Terminal > Nowy terminal.
Użyj polecenia , dotnet publish aby skompilować obraz kontenera dla architektury systemów Linux i amd64. Zmień katalog na katalog filtermodule w projekcie i uruchom dotnet publish polecenie .
dotnet publish --os linux --arch x64 /t:PublishContainer
Obecnie szablon narzędzia iotedgedev jest skierowany na .NET 7.0, który osiągnął koniec wsparcia w maju 2024 r. Zaktualizuj projekt do wersji docelowej .NET 8.0 (LTS, obsługiwanej do listopada 2026 r.), edytując0 filtermodule.csproj i zmieniając wartości TargetFramework i PackageReference. Plik filtermodule.csproj powinien wyglądać następująco:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
</Project>
Oznacz obraz Dockera informacjami o rejestrze kontenerów, wersją i architekturą. Zastąp myacr własną nazwą rejestru.
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64
Obraz Docker dla modułu push
Podaj poświadczenia rejestru kontenerów do platformy Docker, aby umożliwić wypchnięcie obrazu kontenera do magazynu w rejestrze.
Zaloguj się do platformy Docker przy użyciu poświadczeń usługi Azure Container Registry (ACR):
docker login -u <ACR username> -p <ACR password> <ACR login server>Może zostać wyświetlone ostrzeżenie o zabezpieczeniach, które zaleca użycie polecenia
--password-stdin. Chociaż jest to zalecane najlepsze rozwiązanie dla scenariuszy produkcyjnych, wykracza poza zakres tego samouczka. W przypadku uwierzytelniania rejestru kontenerów w środowisku produkcyjnym użyj tokenów o zakresie jednostki usługi lub repozytorium zamiast poświadczeń administratora. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do rejestru kontenerów i referencję do docker login.Zaloguj się do Azure Container Registry. Musisz install Azure CLI aby użyć polecenia
az. To polecenie prosi o podanie nazwy użytkownika i hasła znalezionego w rejestrze kontenerów w obszarze Ustawienia > Klucze dostępu:az acr login -n <ACR registry name>Wskazówka
Jeśli w dowolnym momencie tego samouczka zostaniesz wylogowany, powtórz kroki logowania do Docker i Azure Container Registry, aby kontynuować.
Wypchnij obraz modułu do rejestru lokalnego lub rejestru kontenerów:
docker push <ImageName>Na przykład:
# Push the Docker image to the local registry docker push localhost:5000/filtermodule:0.0.1-amd64 # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name. az acr login --name myacr docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
Aktualizowanie szablonu wdrożenia
Zaktualizuj szablon wdrożeniowy deployment.template.json, korzystając z lokalizacji obrazu rejestru kontenerów. Jeśli na przykład używasz Azure Container Registry myacr.azurecr.io, a obraz jest filtermodule:0.0.1-amd64, zaktualizuj konfigurację filtermodule:
"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
"image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}
}
W eksploratorze Visual Studio Code kliknij prawym przyciskiem myszy plik deployment.template.json i wybierz pozycję Build and Push IoT Edge Solution.
Polecenie kompilacji i wysyłania uruchamia trzy operacje. Najpierw tworzy nowy folder w rozwiązaniu o nazwie config , który zawiera pełny manifest wdrożenia, utworzony z informacji w szablonie wdrożenia i innych plikach rozwiązań. Po drugie, uruchamia docker build w celu skompilowania obrazu kontenera na podstawie odpowiedniego pliku dockerfile dla architektury docelowej. Następnie zostanie uruchomione polecenie docker push, aby przesłać repozytorium obrazów do rejestru kontenerów.
Ten proces może potrwać kilka minut po raz pierwszy, ale jest szybszy przy następnym uruchomieniu poleceń.
Opcjonalnie: aktualizowanie modułu i obrazu
Jeśli wprowadzisz zmiany w kodzie modułu, musisz skompilować ponownie i przesłać obraz modułu do rejestru kontenerów. Wykonaj kroki opisane w tej sekcji, aby zaktualizować obraz kompilacji i kontenera. Możesz pominąć tę sekcję, jeśli nie wprowadzono żadnych zmian w kodzie modułu.
Otwórz plik deployment.amd64.json w nowo utworzonym folderze konfiguracji. Nazwa pliku odzwierciedla architekturę docelową, więc różni się, jeśli wybrano inną architekturę.
Zwróć uwagę, że dwa parametry, które miały symbole zastępcze, zawierają teraz odpowiednie wartości. Sekcja registryCredentials zawiera nazwę użytkownika rejestru i hasło pobrane z pliku env . Plik filtermodule zawiera pełne repozytorium obrazów o nazwie, wersji i tagu architektury z pliku module.json .
Otwórz plik module.json w folderze filtermodule.
Zmień numer wersji obrazu modułu. Na przykład zwiększ numer wersji poprawki tak
"version": "0.0.2", jakby wprowadzono niewielką poprawkę w kodzie modułu.Wskazówka
Wersje modułów umożliwiają kontrolę wersji i umożliwiają testowanie zmian na małym zestawie urządzeń przed wdrożeniem aktualizacji w środowisku produkcyjnym. Jeśli nie zwiększysz wersji modułu przed zbudowaniem i wypchnięciem, nadpiszesz repozytorium w rejestrze kontenerów.
Zapisz zmiany w pliku module.json .
Skompiluj i wypchnij zaktualizowany obraz z tagiem wersji 0.0.2 . Aby na przykład skompilować i wypchnąć obraz dla rejestru lokalnego lub rejestru kontenerów Azure, użyj następujących poleceń:
# Build the container image for Linux and amd64 architecture.
dotnet publish --os linux --arch x64
# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.
docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64
# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.
docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64
Kliknij prawym przyciskiem myszy plik deployment.template.json i ponownie wybierz Build and Push IoT Edge Solution.
Otwórz ponownie plik deployment.amd64.json. Zwróć uwagę, że system budowania nie tworzy nowego pliku podczas ponownego wykonania polecenia budowania i wypychania. Zamiast tego ten sam plik jest aktualizowany, aby odzwierciedlić zmiany. Obraz filtermodule wskazuje teraz wersję 0.0.2 kontenera.
Aby dokładniej zweryfikować, co zrobiło polecenie kompilacji i wypychania, przejdź do portalu Azure i zlokalizuj swój rejestr kontenerów. W rejestrze kontenerów wybierz pozycję Repozytoria, a następnie filtermodule. Sprawdź, czy obie wersje obrazu są wypychane do rejestru.
Rozwiązywanie problemów
Jeśli podczas kompilowania i wypychania obrazu modułu wystąpią błędy, często trzeba to zrobić z konfiguracją platformy Docker na maszynie dewelopera. Aby przejrzeć konfigurację, wykonaj następujące testy:
- Czy uruchomiłeś polecenie
docker loginprzy użyciu poświadczeń skopiowanych z rejestru kontenerów? Te dane uwierzytelniające różnią się od tych, których używasz do logowania się do Azure. - Czy używasz właściwego repozytorium kontenerów? Czy ma poprawną nazwę rejestru kontenerów i poprawną nazwę Twojego modułu? Otwórz plik module.json w folderze filtermodule, aby sprawdzić. Wartość repozytorium powinna być podobna do <nazwa rejestru>.azurecr.io/filtermodule.
- Jeśli dla modułu użyto innej nazwy niż filtermodule , czy nazwa jest spójna w całym rozwiązaniu?
- Czy maszyna korzysta z tego samego typu kontenerów, które tworzysz? Ten samouczek dotyczy urządzeń z systemem Linux IoT Edge, dlatego Visual Studio Code powinien powiedzieć amd64 lub arm32v7 na pasku bocznym, a na pulpicie platformy Docker powinny być uruchomione kontenery systemu Linux.
Wdrażanie modułów na urządzeniu
Sprawdzono, że istnieją wbudowane obrazy kontenerów przechowywane w rejestrze kontenerów, więc nadszedł czas, aby wdrożyć je na urządzeniu. Upewnij się, że urządzenie IoT Edge jest uruchomione.
Użyj polecenia IoT Edge Azure CLI set-modules, aby wdrożyć moduły w Azure IoT Hub. Aby na przykład wdrożyć moduły zdefiniowane w pliku deployment.template.json do pliku IoT Hub my-iot-hub dla urządzenia IoT Edge my-device użyj następującego polecenia. Zastąp wartości hub-namedevice-id i login IoT Hub connection string własnymi wartościami.
az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"
Wskazówka
Znajdź IoT Hub connection string, w tym klucz dostępu współdzielonego, w portalu Azure. Przejdź do IoT Hub i wybierz pozycję Ustawienia zabezpieczeń > Zasady dostępu współdzielonego > iothubowner.
W eksploratorze Visual Studio Code w sekcji Azure IoT Hub rozwiń Urządzenia, aby zobaczyć listę urządzeń IoT.
Kliknij prawym przyciskiem myszy urządzenie IoT Edge, do którego chcesz wdrożyć, a następnie wybierz pozycję Utwórz wdrożenie dla pojedynczego urządzenia.
W Eksploratorze plików przejdź do folderu config , a następnie wybierz plik deployment.amd64.json .
Nie używaj pliku deployment.template.json, który nie zawiera poświadczeń rejestru kontenerów ani wartości obrazu modułu. Jeśli docelowe jest urządzenie z systemem Linux ARM32, nazwa manifestu wdrożenia jest deployment.arm32v7.json.
Pod swoim urządzeniem rozwiń węzeł Moduły, aby wyświetlić listę wdrożonych i uruchomionych modułów. Wybierz przycisk odświeżenia. Na urządzeniu powinny zostać wyświetlone nowe moduły tempSensor i filtermodule .
Uruchomienie modułów może potrwać kilka minut. Środowisko uruchomieniowe IoT Edge odbiera nowy manifest wdrożenia, pobiera obrazy modułów ze środowiska uruchomieniowego kontenera, a następnie uruchamia każdy nowy moduł.
Wyświetlanie komunikatów z urządzenia
Przykładowy kod modułu pobiera komunikaty za pośrednictwem kolejki wejściowej i wysyła je za pośrednictwem kolejki wyjściowej. Manifest wdrożenia konfiguruje trasy, które wysyłają komunikaty do filtermodule z tempSensor, a następnie przesyłają dalej komunikaty z filtermodule do IoT Hub. Rozszerzenia Azure IoT Edge i Azure IoT Hub umożliwiają wyświetlanie komunikatów w miarę ich docierania do IoT Hub z urządzenia.
W eksploratorze Visual Studio Code wybierz urządzenie IoT Edge, które chcesz monitorować, a następnie wybierz pozycję Rozpocznij monitorowanie wbudowanego punktu końcowego zdarzeń.
Obejrzyj okno danych wyjściowych w Visual Studio Code, aby zobaczyć komunikaty docierające do IoT Hub.
Wyświetlanie zmian na urządzeniu
Aby zobaczyć, co się dzieje na urządzeniu, użyj poleceń w tej sekcji, aby sprawdzić środowisko uruchomieniowe i moduły IoT Edge uruchomione na urządzeniu.
Te polecenia są przeznaczone dla urządzenia IoT Edge, a nie maszyny dewelopera. Jeśli używasz maszyny wirtualnej dla urządzenia IoT Edge, połącz się z nim teraz. W Azure przejdź do strony przeglądu maszyny wirtualnej i wybierz Połącz w celu uzyskania dostępu do połączenia SSH.
Wyświetl wszystkie moduły wdrożone na urządzeniu i sprawdź ich stan:
iotedge listZobaczysz cztery moduły: dwa moduły środowiska uruchomieniowego IoT Edge, tempSensor i filtermodule. Wszystkie cztery powinny być wyświetlane jako uruchomione.
Sprawdź dzienniki dla określonego modułu:
iotedge logs <module name>W nazwach modułów jest rozróżniana wielkość liter.
Dzienniki tempSensor i filtermodule pokazują komunikaty, które przetwarzają. Moduł edgeAgent uruchamia inne moduły, więc jego dzienniki zawierają informacje o manifeście wdrożenia. Jeśli moduł nie znajduje się na liście lub nie jest uruchomiony, sprawdź dzienniki edgeAgent pod kątem błędów. Moduł edgeHub zarządza komunikacją między modułami a IoT Hub. Jeśli moduły są uruchomione, ale komunikaty nie docierają do IoT Hub, sprawdź dzienniki edgeHub pod kątem błędów.
Czyszczenie zasobów
Jeśli chcesz przejść do następnego zalecanego artykułu, zachowaj utworzone zasoby i konfiguracje i użyj ich ponownie. Możesz również nadal używać tego samego urządzenia IoT Edge co urządzenie testowe. W przeciwnym razie, aby uniknąć opłat, usuń konfigurację lokalną i zasoby Azure użyte w tym artykule.
Usuwanie zasobów Azure
Nie można cofnąć usuwania Azure zasobów i grup zasobów. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub niewłaściwej grupy zasobów. Jeśli utworzono IoT Hub wewnątrz istniejącej grupy zasobów zawierającej zasoby, które chcesz zachować, usuń tylko zasób IoT Hub, a nie grupę zasobów.
Aby usunąć zasoby:
- Zaloguj się do portalu Azure, a następnie wybierz pozycję Grupy zasobów.
- Wybierz nazwę grupy zasobów zawierającej zasoby testowe IoT Edge.
- Przejrzyj listę zasobów, które zawiera grupa zasobów. Jeśli chcesz usunąć je wszystkie, możesz wybrać pozycję Usuń grupę zasobów. Jeśli chcesz usunąć tylko niektóre z nich, wybierz każdy zasób, aby usunąć je indywidualnie.
Następne kroki
W tym samouczku skonfigurujesz Visual Studio Code na komputerze deweloperskim i wdrożysz swój pierwszy moduł IoT Edge, korzystając z kodu filtrującego dane nieprzetworzone, które są generowane przez twoje urządzenie IoT Edge.
Przejdź do następnych samouczków, aby dowiedzieć się, jak Azure IoT Edge umożliwia wdrażanie Azure usług w chmurze w celu przetwarzania i analizowania danych na brzegu sieci.