Udostępnij za pośrednictwem


Samouczek: przechowywanie danych na brzegu sieci przy użyciu baz danych programu SQL Server

Dotyczy:Znacznik wyboru usługi IoT Edge 1.5 IoT Edge 1.5 Znacznik wyboru usługi IoT Edge 1.4 IoT Edge 1.4

Ważne

Obsługiwane są wersje usługi IoT Edge 1.5 LTS i IoT Edge 1.4 LTS. Usługa IoT Edge 1.4 LTS kończy się 12 listopada 2024 r. Jeśli korzystasz z wcześniejszej wersji, zobacz aktualizację Azure IoT Edge.

Wdróż moduł programu SQL Server do przechowywania danych na urządzeniu z usługą Azure IoT Edge z kontenerami systemu Linux.

Usługi Azure IoT Edge i programu SQL Server można używać do przechowywania danych i wykonywania zapytań dotyczących danych na brzegu sieci. Usługa Azure IoT Edge ma podstawowe funkcje magazynu w celu buforowania komunikatów, jeśli urządzenie przejdzie w tryb offline, a następnie przekazania ich dalej po ponownym ustanowieniu połączenia. Możesz jednak potrzebować bardziej zaawansowanych możliwości magazynu, takich jak możliwość lokalnego wykonywania zapytań o dane. Urządzenia usługi IoT Edge mogą używać lokalnych baz danych do wykonywania bardziej złożonych obliczeń bez konieczności utrzymywania połączenia z usługą IoT Hub.

Ten artykuł zawiera instrukcje dotyczące wdrażania bazy danych programu SQL Server na urządzeniu usługi IoT Edge. Usługa Azure Functions, uruchomiona na urządzeniu usługi IoT Edge, strukturyzuje dane przychodzące, a następnie wysyła je do bazy danych. Kroki opisane w tym artykule można zastosować również do innych baz danych, które działają w kontenerach, na przykład MySQL lub PostgreSQL.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Używanie programu Visual Studio Code do tworzenia funkcji platformy Azure
  • Wdrażanie bazy danych SQL na urządzeniu usługi IoT Edge
  • Używanie programu Visual Studio Code do kompilowania modułów i wdrażania ich na urządzeniu usługi IoT Edge
  • Wyświetlanie wygenerowanych danych

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Przed rozpoczęciem tego samouczka należy przejść przez poprzedni samouczek, aby skonfigurować środowisko projektowe na potrzeby tworzenia kontenerów systemu Linux: opracowywanie modułów usługi Azure IoT Edge przy użyciu programu Visual Studio Code. Ukończenie tego samouczka wymaga spełnienia następujących wymagań wstępnych:

W tym samouczku użyto modułu usługi Azure Functions do wysyłania danych do programu SQL Server. Aby utworzyć moduł usługi IoT Edge w usłudze Azure Functions, zainstaluj następujące dodatkowe wymagania wstępne na maszynie dewelopera:

Tworzenie projektu funkcji

Aby wysyłać dane do bazy danych, potrzebujesz modułu, który może poprawnie tworzyć struktury danych, a następnie przechowywać je w tabeli.

Tworzenie nowego projektu

W następujących krokach przedstawiono sposób tworzenia funkcji usługi IoT Edge przy użyciu programu Visual Studio Code i rozszerzenia usługi Azure IoT Edge.

  1. Otwórz Visual Studio Code.

  2. Otwórz paletę poleceń programu Visual Studio Code, wybierając pozycję Wyświetl>paletę poleceń.

  3. W palecie poleceń wpisz i uruchom polecenie Azure IoT Edge: nowe rozwiązanie usługi IoT Edge. W palecie poleceń podaj następujące informacje, aby utworzyć rozwiązanie:

    Pole Wartość
    Wybierz folder Wybierz lokalizację na komputerze deweloperskim dla programu Visual Studio Code, aby utworzyć pliki rozwiązania.
    Podaj nazwę rozwiązania Wprowadź opisową nazwę rozwiązania, na przykład SqlSolution, lub zaakceptuj nazwę domyślną.
    Wybierz szablon modułu Wybierz pozycję Azure Functions — C#.
    Podaj nazwę modułu Nadaj modułowi nazwę sqlFunction.
    Podaj repozytorium obrazów platformy Docker dla modułu Repozytorium obrazów zawiera nazwę rejestru kontenerów oraz nazwę obrazu kontenera. Obraz kontenera jest wstępnie wypełniany w ostatnim kroku. Zastąp wartość localhost:5000 wartością serwera logowania z rejestru kontenerów platformy Azure. Serwer logowania można pobrać ze strony Przegląd rejestru kontenerów w witrynie Azure Portal.

    Ostatni ciąg wygląda jak <nazwa> rejestru.azurecr.io/sqlfunction.

    W oknie programu Visual Studio Code zostanie załadowany obszar roboczy rozwiązania usługi IoT Edge.

Dodawanie poświadczeń rejestru

W pliku środowiska przechowywane są poświadczenia rejestru kontenerów udostępniane środowisku uruchomieniowemu usługi IoT Edge. Środowisko uruchomieniowe wymaga tych poświadczeń do ściągnięcia prywatnych obrazów na urządzenie usługi IoT Edge.

Rozszerzenie usługi IoT Edge próbuje ściągnąć poświadczenia rejestru kontenerów z platformy Azure i wypełnić je w pliku środowiska. Sprawdź, czy poświadczenia zostały już uwzględnione. Jeśli nie, dodaj je teraz:

  1. W eksploratorze programu Visual Studio Code otwórz plik env.
  2. Zaktualizuj pola, używając nazwy użytkownika i hasła, które zostały skopiowane z usługi Azure Container Registry.
  3. Zapisz ten plik.

Uwaga

W tym samouczku są używane poświadczenia logowania administratora dla usługi Azure Container Registry, które są wygodne w scenariuszach tworzenia i testowania. Gdy wszystko będzie gotowe do scenariuszy produkcyjnych, zalecamy opcję uwierzytelniania z najmniejszymi uprawnieniami, taką jak jednostki usługi. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do rejestru kontenerów.

Wybieranie architektury docelowej

Musisz wybrać architekturę docelową dla każdego rozwiązania, ponieważ kontener jest kompilowany i uruchamiany inaczej dla każdego typu architektury. Wartość domyślna to Linux AMD64.

  1. Otwórz paletę poleceń i wyszukaj pozycję Azure IoT Edge: ustaw domyślną platformę docelową rozwiązania Edge lub wybierz ikonę skrótu na pasku bocznym w dolnej części okna.

  2. Na palecie poleceń wybierz architekturę docelową z listy opcji. Na potrzeby tego samouczka używamy maszyny wirtualnej z systemem Ubuntu jako urządzenia usługi IoT Edge, więc zachowamy domyślną wartość amd64.

Aktualizowanie modułu przy użyciu kodu niestandardowego

  1. W eksploratorze programu Visual Studio Code otwórz moduły >sqlFunction sqlFunction.csproj.>

  2. Znajdź grupę odwołań do pakietu i dodaj nową, aby uwzględnić element SqlClient.

    <PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>
    
  3. Zapisz plik sqlFunction.csproj.

  4. Otwórz plik sqlFunction.cs.

  5. Zastąp całą zawartość pliku następującym kodem:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.EdgeHub;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    using Sql = System.Data.SqlClient;
    
    namespace Functions.Samples
    {
        public static class sqlFunction
        {
            [FunctionName("sqlFunction")]
            public static async Task FilterMessageAndSendMessage(
                [EdgeHubTrigger("input1")] Message messageReceived,
                [EdgeHub(OutputName = "output1")] IAsyncCollector<Message> output,
                ILogger logger)
            {
                const int temperatureThreshold = 20;
                byte[] messageBytes = messageReceived.GetBytes();
                var messageString = System.Text.Encoding.UTF8.GetString(messageBytes);
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    logger.LogInformation("Info: Received one non-empty message");
                    // Get the body of the message and deserialize it.
                    var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
                    //Store the data in SQL db
                    const string str = "<sql connection string>";
                    using (Sql.SqlConnection conn = new Sql.SqlConnection(str))
                    {
                        conn.Open();
                        var insertMachineTemperature = "INSERT INTO MeasurementsDB.dbo.TemperatureMeasurements VALUES (CONVERT(DATETIME2,'" + messageBody.timeCreated + "', 127), 'machine', " + messageBody.machine.temperature + ");";
                        var insertAmbientTemperature = "INSERT INTO MeasurementsDB.dbo.TemperatureMeasurements VALUES (CONVERT(DATETIME2,'" + messageBody.timeCreated + "', 127), 'ambient', " + messageBody.ambient.temperature + ");";
                        using (Sql.SqlCommand cmd = new Sql.SqlCommand(insertMachineTemperature + "\n" + insertAmbientTemperature, conn))
                        {
                            //Execute the command and log the # rows affected.
                            var rows = await cmd.ExecuteNonQueryAsync();
                            logger.LogInformation($"{rows} rows were updated");
                        }
                    }
    
                    if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
                    {
                        // Send the message to the output as the temperature value is greater than the threashold.
                        using (var filteredMessage = new Message(messageBytes))
                        {
                             // Copy the properties of the original message into the new Message object.
                             foreach (KeyValuePair<string, string> prop in messageReceived.Properties)
                             {filteredMessage.Properties.Add(prop.Key, prop.Value);}
                             // Add a new property to the message to indicate it is an alert.
                             filteredMessage.Properties.Add("MessageType", "Alert");
                             // Send the message.
                             await output.AddAsync(filteredMessage);
                             logger.LogInformation("Info: Received and transferred a message with temperature above the threshold");
                        }
                    }
                }
            }
        }
        //Define the expected schema for the body of incoming messages.
        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;}
        }
    }
    
  6. W wierszu 35 zastąp ciąg <sql connection string> następującym ciągiem. Właściwość Źródło danych odwołuje się do kontenera programu SQL Server, który jeszcze nie istnieje. Utworzysz go przy użyciu nazwy SQL w następnej sekcji.

    Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=Strong!Passw0rd;TrustServerCertificate=False;Connection Timeout=30;
    
  7. Zapisz plik sqlFunction.cs.

Dodawanie kontenera programu SQL Server

Manifest wdrożenia deklaruje moduły, które środowisko uruchomieniowe usługi IoT Edge zainstaluje na urządzeniu usługi IoT Edge. Podano kod umożliwiający utworzenie dostosowanego modułu funkcji w poprzedniej sekcji, ale moduł programu SQL Server został już skompilowany i dostępny w usłudze Azure Rejestr Artefaktów Microsoft. Wystarczy poinstruować środowisko uruchomieniowe usługi IoT Edge, że ma dołączyć ten moduł, a następnie skonfigurować go na urządzeniu.

  1. W programie Visual Studio Code otwórz paletę poleceń, wybierając pozycję Wyświetl>paletę poleceń.

  2. W palecie poleceń wpisz i uruchom polecenie Azure IoT Edge: Dodaj moduł usługi IoT Edge. W palecie poleceń podaj następujące informacje, aby dodać nowy moduł:

    Pole Wartość
    Wybierz plik szablonu wdrożenia Paleta poleceń wyróżnia plik deployment.template.json w bieżącym folderze rozwiązania. Wybierz ten plik.
    Wybierz szablon modułu Wybierz pozycję Istniejący moduł (wprowadź pełny adres URL obrazu).
    Podaj nazwę modułu Wprowadź sql. Ta nazwa jest zgodna z nazwą kontenera zadeklarowaną w parametry połączenia w pliku sqlFunction.cs.
    Udostępnianie obrazu platformy Docker dla modułu Wprowadź następujący identyfikator URI, aby ściągnąć obraz kontenera programu SQL Server z Rejestr Artefaktów Microsoft. W przypadku obrazów opartych na systemie Ubuntu użyj polecenia mcr.microsoft.com/mssql/server:latest. W przypadku obrazów opartych na systemie Red Hat Enterprise Linux (RHEL) użyj polecenia mcr.microsoft.com/mssql/rhel/server:latest.

    Obraz kontenera usługi Azure SQL Edge to uproszczona, konteneryzowana wersja programu SQL Server, która może działać na urządzeniach usługi IoT Edge. Jest zoptymalizowany pod kątem scenariuszy brzegowych i może działać na urządzeniach ARM i AMD64.

  3. W folderze rozwiązania otwórz plik deployment.template.json .

  4. Znajdź sekcję modules. Powinny zostać wyświetlone trzy moduły. Moduł SimulatedTemperatureSensor jest domyślnie dołączany do nowych rozwiązań i udostępnia dane testowe do użycia z innymi modułami. Moduł sqlFunction to moduł, który został utworzony i zaktualizowany przy użyciu nowego kodu. Na koniec moduł sql został zaimportowany z witryny Azure Marketplace.

    Napiwek

    Moduł programu SQL Server zawiera domyślny zestaw haseł w zmiennych środowiskowych manifestu wdrożenia. Za każdym razem, gdy tworzysz kontener programu SQL Server w środowisku produkcyjnym, zaleca się zmienić domyślne hasło administratora systemu.

  5. Zamknij plik deployment.template.json.

Kompilowanie rozwiązania usługi IoT Edge

W poprzednich sekcjach utworzono rozwiązanie z jednym modułem, a następnie dodano drugi do szablonu manifestu wdrożenia. Moduł PROGRAMU SQL Server jest hostowany publicznie przez firmę Microsoft, ale musisz konteneryzować kod w module usługi Functions. W tej sekcji utworzysz rozwiązanie, utworzysz obrazy kontenerów dla modułu sqlFunction i wypchniesz obraz do rejestru kontenerów.

  1. W programie Visual Studio Code otwórz zintegrowany terminal, wybierając pozycję Widok>Terminal.

  2. Zaloguj się do rejestru kontenerów w programie Visual Studio Code, aby mógł on wypchnąć obrazy do rejestru. Użyj tych samych poświadczeń usługi Azure Container Registry (ACR), które zostały dodane do pliku env. W zintegrowanym terminalu wprowadź następujące polecenie:

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    Może zostać wyświetlone ostrzeżenie o zabezpieczeniach zalecające użycie parametru --password-stdin. Użycie tego parametru wykracza poza zakres tego artykułu, jednak zalecamy zastosowanie tego najlepszego rozwiązania. Aby uzyskać więcej informacji, zobacz dokumentację poleceń logowania platformy Docker.

  3. W eksploratorze programu Visual Studio Code kliknij prawym przyciskiem myszy plik deployment.template.json i wybierz pozycję Kompiluj i wypychaj rozwiązanie usługi IoT Edge.

    Polecenie kompilacji i wypychania uruchamia trzy operacje. Najpierw tworzy nowy folder w rozwiązaniu o nazwie config , który zawiera pełny manifest wdrożenia, który jest zbudowany z informacji w szablonie wdrożenia i innych plikach rozwiązań. Po drugie uruchamia docker build polecenie w celu skompilowania obrazu kontenera na podstawie odpowiedniego pliku dockerfile dla architektury docelowej. Następnie zostanie uruchomione polecenie docker push , aby wypchnąć 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ń.

    Możesz sprawdzić, czy moduł sqlFunction został pomyślnie wypchnięty do rejestru kontenerów. W witrynie Azure Portal przejdź do rejestru kontenerów. Wybierz repozytoria i wyszukaj ciąg sqlFunction. Pozostałe dwa moduły SimulatedTemperatureSensor i sql nie zostaną wypchnięte do rejestru kontenerów, ponieważ ich repozytoria znajdują się już w rejestrach firmy Microsoft.

Wdrażanie rozwiązania na urządzeniu

Moduły można ustawić na urządzeniu za pomocą usługi IoT Hub, ale dostęp do usługi IoT Hub i urządzeń można również uzyskać za pomocą programu Visual Studio Code. W tej sekcji skonfigurujesz dostęp do usługi IoT Hub, a następnie użyjesz programu Visual Studio Code do wdrożenia rozwiązania na urządzeniu usługi IoT Edge.

  1. W eksploratorze programu Visual Studio Code w sekcji Azure IoT Hub rozwiń węzeł Urządzenia , aby wyświetlić listę urządzeń IoT.

  2. Kliknij prawym przyciskiem myszy urządzenie, które ma być docelowe we wdrożeniu, a następnie wybierz pozycję Utwórz wdrożenie dla pojedynczego urządzenia.

  3. Wybierz plik deployment.amd64.json w folderze config, a następnie kliknij pozycję Wybierz manifest wdrożenia przeglądarki Edge. Nie używaj pliku deployment.template.json.

  4. W obszarze urządzenia rozwiń węzeł Moduły , aby wyświetlić listę wdrożonych i uruchomionych modułów. Kliknij przycisk Odśwież. Powinny zostać wyświetlone nowe moduły sql i sqlFunction uruchomione wraz z modułem SimulatedTemperatureSensor oraz $edgeAgent i $edgeHub.

    Możesz również sprawdzić, czy wszystkie moduły są wdrożone i uruchomione na urządzeniu. Na urządzeniu usługi IoT Edge uruchom następujące polecenie, aby wyświetlić stan modułów.

    iotedge list
    

    Uruchomienie modułów może potrwać kilka minut. Środowisko uruchomieniowe usługi IoT Edge musi otrzymać nowy manifest wdrożenia, ściągnąć obrazy modułów ze środowiska uruchomieniowego kontenera, a następnie uruchomić każdy nowy moduł.

Tworzenie bazy danych SQL

Po zastosowaniu manifestu wdrożenia do urządzenia uzyskujesz trzy uruchomione moduły. Moduł SimulatedTemperatureSensor generuje symulowane dane środowiska. Moduł sqlFunction pobiera dane i formatuje je na potrzeby bazy danych. Ta sekcja zawiera opis konfigurowania bazy danych SQL do przechowywania danych dotyczących temperatury.

Uruchom następujące polecenia na urządzeniu usługi IoT Edge. Te polecenia łączą się z modułem sql działającym na urządzeniu oraz tworzą bazę danych i tabelę na potrzeby przechowywania przesyłanych do niego danych o temperaturze.

  1. W narzędziu wiersza polecenia na urządzeniu usługi IoT Edge nawiąż połączenie z bazą danych.

    sudo docker exec -it sql bash
    
  2. Otwórz narzędzie polecenia SQL.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Strong!Passw0rd'
    
  3. Utwórz bazę danych:

    CREATE DATABASE MeasurementsDB
    ON
    (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf')
    GO
    
  4. Zdefiniuj tabelę.

    CREATE TABLE MeasurementsDB.dbo.TemperatureMeasurements (measurementTime DATETIME2, location NVARCHAR(50), temperature FLOAT)
    GO
    

Plik docker programu SQL Server możesz dostosować, aby automatycznie skonfigurować program SQL Server do wdrożenia na wielu urządzeniach usługi IoT Edge. Aby uzyskać więcej informacji, zobacz projekt demonstracyjny kontenera programu Microsoft SQL Server.

Wyświetlanie danych lokalnych

Po utworzeniu tabeli moduł sqlFunction uruchamia przechowywanie danych w lokalnej bazie danych programu SQL Server 2017 na urządzeniu usługi IoT Edge.

W narzędziu polecenia SQL uruchom następujące polecenie, aby wyświetlić sformatowane dane tabeli:

SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO

Wyświetlanie zawartości lokalnej bazy danych

Czyszczenie zasobów

Jeśli zamierzasz przejść do kolejnego zalecanego artykułu, możesz zachować utworzone zasoby oraz konfiguracje i użyć ich ponownie. Możesz także nadal używać tego samego urządzenia usługi IoT Edge jako urządzenia testowego.

W przeciwnym razie możesz usunąć konfigurację lokalną i zasoby platformy Azure utworzone podczas pracy z tym artykułem, aby uniknąć naliczania opłat.

Usuwanie zasobów platformy Azure

Usuwanie zasobów i grup zasobów platformy Azure jest nieodwracalne. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub niewłaściwej grupy zasobów. Jeśli centrum IoT zostało utworzone w istniejącej grupie zasobów zawierającej zasoby, które chcesz zachować, usuń tylko sam zasób centrum IoT, a nie grupę zasobów.

Aby usunąć zasoby:

  1. Zaloguj się do witryny Azure Portal, a następnie wybierz pozycję Grupy zasobów.

  2. Wybierz nazwę grupy zasobów, która zawiera zasoby testowe usługi IoT Edge.

  3. Przejrzyj listę zasobów zawartych w grupie 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, możesz kliknąć poszczególne zasoby, aby usunąć je pojedynczo.

W tym samouczku został utworzony moduł usługi Azure Functions zawierający kod służący do filtrowania nieprzetworzonych danych wygenerowanych przez urządzenie usługi IoT Edge. Gdy wszystko będzie gotowe do utworzenia własnych modułów, możesz dowiedzieć się więcej na temat tworzenia modułów usługi Azure IoT Edge przy użyciu programu Visual Studio Code.

Następne kroki

Jeśli chcesz wypróbować inną metodę magazynu na brzegu sieci, przeczytaj, jak używać usługi Azure Blob Storage w usłudze IoT Edge.