Megosztás a következőn keresztül:


Oktatóanyag: Adatok tárolása a peremhálózaton SQL Server-adatbázisokkal

A következőkre vonatkozik: IoT Edge 1.5 pipa IoT Edge 1.5 IoT Edge 1.4 pipa IoT Edge 1.4

Fontos

Az IoT Edge 1.5 LTS és az IoT Edge 1.4 LTS támogatott kiadások. Az IoT Edge 1.4 LTS 2024. november 12-én megszűnik. Ha egy korábbi kiadáson dolgozik, olvassa el az IoT Edge frissítése című témakört.

Sql Server-modul üzembe helyezése adatok tárolására egy Azure IoT Edge-et futtató eszközön Linux-tárolókkal.

Az Azure IoT Edge és az SQL Server segítségével adatokat tárolhat és kérdezhet le a peremhálózaton. Az Azure IoT Edge alapvető tárolási képességekkel rendelkezik az üzenetek gyorsítótárazásához, ha egy eszköz offline állapotba kerül, majd továbbítja őket a kapcsolat újbóli létrehozásakor. Szüksége lehet azonban ennél fejlettebb tárolási képességekre is, például az adatok helyi lekérdezéséhez. Az IoT Edge-eszközök helyi adatbázisok használatával összetettebb számításokat végezhetnek anélkül, hogy kapcsolatot kellene fenntartaniuk az IoT Hubbal.

A jelen cikk az SQL Server-adatbázisok IoT Edge-eszközön történő üzembe helyezésének utasításait tartalmazza. Az IoT Edge-eszközön futó Azure Functions-függvények elvégzik a bejövő adatok rendszerezését, majd elküldik azokat az adatbázisnak. A cikkben szereplő lépések a tárolókban üzemeltetett egyéb adatbázisokra (például MySQL vagy PostgreSQL) is alkalmazhatók.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Azure-függvény létrehozása a Visual Studio Code használatával
  • SQL-adatbázis üzembe helyezése az IoT Edge-eszközön
  • A Visual Studio Code használatával modulokat hozhat létre és helyezhet üzembe az IoT Edge-eszközön
  • A létrejött adatok megtekintése

Ha nem rendelkezik Azure-előfizetéssel, első lépésként hozzon létre egy ingyenes Azure-fiókot.

Előfeltételek

Az oktatóanyag megkezdése előtt végig kellett volna haladnia az előző oktatóanyagon a Linux-tárolók fejlesztéséhez szükséges fejlesztői környezet beállításához: Azure IoT Edge-modulok fejlesztése a Visual Studio Code használatával. Az oktatóanyag elvégzésével a következő előfeltételeknek kell teljesülnie:

Ez az oktatóanyag egy Azure Functions-modullal küld adatokat az SQL Servernek. Ha IoT Edge-modult szeretne fejleszteni az Azure Functions használatával, telepítse a következő további előfeltételeket a fejlesztőgépre:

Függvényprojekt létrehozása

Ahhoz, hogy adatokat küldhessen egy adatbázisba, egy olyan modulra van szüksége, amely képes megfelelően rendszerezni, majd egy táblába elmenteni az adatokat.

Új projekt létrehozása

A következő lépések azt mutatják be, hogyan hozhat létre IoT Edge-függvényt a Visual Studio Code és az Azure IoT Edge bővítmény használatával.

  1. Nyissa meg a Visual Studio Code-ot.

  2. Nyissa meg a Visual Studio Code parancskatalógusát a Parancspaletta megtekintése>gombra kattintva.

  3. A parancskatalógusban írja be és futtassa az Azure IoT Edge: New IoT Edge solution (Azure IoT Edge: új IoT Edge-megoldás) parancsot. A parancskatalógusban adja meg az alábbi információkat a megoldás létrehozásához:

    Mező Érték
    Mappa kiválasztása Válassza ki a fejlesztési gép helyét a Visual Studio Code-hoz a megoldásfájlok létrehozásához.
    Provide a solution name (Megoldásnév megadása) Adjon meg egy leíró nevet a megoldásnak, például az SqlSolutionnak, vagy fogadja el az alapértelmezett értéket.
    Select module template (Modulsablon kiválasztása) Válassza az Azure Functions – C# lehetőséget.
    Provide a module name (Modulnév megadása) A modulnak adja az sqlFunction nevet.
    Provide Docker image repository for the module (Docker-rendszerkép adattárának megadása a modulhoz) Egy rendszerképadattár a tárolóregisztrációs adatbázis nevét és a tárolórendszerkép nevét tartalmazza. A tárolórendszerkép előre fel van töltve az előző lépésből. Cserélje le a localhost:5000 értéket az Azure-tárolóregisztrációs adatbázis bejelentkezési kiszolgálójának értékére. A bejelentkezési kiszolgáló az Azure Portal tárolóregisztrációs adatbázisának Áttekintés oldaláról kérhető le.

    Az utolsó sztring úgy néz ki, mint a <beállításjegyzék neve.azurecr.io/sqlfunction>.

    A Visual Studio Code-ablak betölti az IoT Edge-megoldás munkaterületét.

A regisztrációs adatbázis hitelesítő adatainak hozzáadása

A környezeti fájl tárolja a tárolóregisztrációs adatbázis hitelesítő adatait, és megosztja őket az IoT-Edge futtatókörnyezettel. A futtatókörnyezetnek szüksége van ezekre a hitelesítő adatokra a privát rendszerképek letöltéséhez az IoT Edge-eszközre.

Az IoT Edge-bővítmény megpróbálja lekérni a tárolóregisztrációs adatbázis hitelesítő adatait az Azure-ból, és feltölti őket a környezeti fájlban. Ellenőrizze, hogy a hitelesítő adatok már szerepelnek-e benne. Ha nem, vegye fel őket most:

  1. A Visual Studio Code Explorerben nyissa meg az .env fájlt.
  2. Adja meg az Azure Container Registryből kimásolt felhasználónevet és jelszót a megfelelő mezőkben.
  3. Mentse el ezt a fájlt.

Feljegyzés

Ez az oktatóanyag rendszergazdai bejelentkezési hitelesítő adatokat használ az Azure Container Registryhez, amelyek fejlesztési és tesztelési forgatókönyvek esetén kényelmesek. Ha készen áll az éles helyzetekre, javasoljuk a minimális jogosultságú hitelesítési lehetőséget, például a szolgáltatásnevek használatát. További információ: A tárolóregisztrációs adatbázishoz való hozzáférés kezelése.

A célarchitektúra kiválasztása

Ki kell választania az egyes megoldásokkal megcélzott architektúrát, mert a tároló minden architektúratípushoz más-más módon van felépítve és futtatva. Az alapértelmezett a Linux AMD64.

  1. Nyissa meg a parancskatalógust, és keresse meg az Azure IoT Edge: Set Default Target Platform for Edge Solution (Alapértelmezett célplatform beállítása edge-megoldáshoz) parancskatalógust, vagy válassza a parancsikon ikont az ablak alján található oldalsávon.

  2. A parancskatalógusban válassza ki a célarchitektúrát a lehetőségek listájából. Ebben az oktatóanyagban egy Ubuntu virtuális gépet használunk IoT Edge-eszközként, így megtartjuk az alapértelmezett amd64-et.

A modul módosítása egyéni kóddal

  1. A Visual Studio Code Explorerben nyissa meg az sqlFunction>sqlFunction.csproj modulokat.>

  2. Keresse meg a csomaghivatkozások csoportját, és adjon hozzá egy újat az SqlClient hozzáadásához.

    <PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>
    
  3. Mentse az sqlFunction.csproj fájlt.

  4. Nyissa meg a sqlFunction.cs fájlt.

  5. Cserélje le a fájl teljes tartalmát a következő kódra:

    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. A 35. sorban cserélje le az sql kapcsolati sztring> sztringet <a következő sztringre. Az Adatforrás tulajdonság az SQL Server-tárolóra hivatkozik, amely még nem létezik. A következő szakaszban SQL névvel fogja létrehozni.

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

Az SQL Server-tároló hozzáadása

Az IoT Edge-futtatókörnyezet által az IoT Edge-eszközön telepítendő modulokat az üzembehelyezési jegyzékfájl határozza meg. Az előző szakaszban egy testre szabott függvénymodul létrehozásához adta meg a kódot, de az SQL Server-modul már meg van építve és elérhető a Microsoft Eszközjegyzék. Utasítsa az IoT Edge-futtatókörnyezetet ennek belefoglalására, majd végezze el a konfigurálást az eszközön.

  1. A Visual Studio Code-ban nyissa meg a parancspalettát a Parancspaletta megtekintése>gombra kattintva.

  2. A parancskatalógusba írja be és futtassa az Azure IoT Edge: Add IoT Edge modul parancsot. A parancskatalógusban adja meg a következő információkat egy új modul hozzáadásához:

    Mező Érték
    Select deployment template file (Üzembehelyezési sablonfájl kiválasztása) A parancskatalógus kiemeli az aktuális megoldásmappában lévő deployment.template.json fájlt. Jelölje ki a fájlt.
    Select module template (Modulsablon kiválasztása) Válassza a Meglévő modult (írja be a teljes kép URL-címét).
    Adja meg a modul nevét Adja meg az sql-t. Ez a név megegyezik a sqlFunction.cs fájl kapcsolati sztring deklarált tároló nevével.
    Docker-rendszerkép megadása a modulhoz Írja be a következő URI-t az SQL Server-tároló lemezképének lekéréséhez a Microsoft Eszközjegyzék. Ubuntu-alapú képekhez használja mcr.microsoft.com/mssql/server:latesta . Red Hat Enterprise Linux (RHEL) alapú rendszerképekhez használja a következőt mcr.microsoft.com/mssql/rhel/server:latest: .

    Az Azure SQL Edge tárolórendszerkép az SQL Server egy egyszerű, tárolóalapú verziója, amely IoT Edge-eszközökön futtatható. Peremhálózati forgatókönyvekhez van optimalizálva, és ARM- és AMD64-eszközökön is futtatható.

  3. Nyissa meg a deployment.template.json fájlt a megoldásmappában.

  4. Keresse meg a modulok szakaszt. Három modulnak kell megjelennie. A SimulatedTemperatureSensor modul alapértelmezés szerint szerepel az új megoldásokban, és a többi modulhoz használható tesztadatokat biztosít. Az sqlFunction modul az a modul, amelyet eredetileg létrehozott és frissített új kóddal. Végül a modul sql-jének importálása a Microsoft Eszközjegyzék.

    Tipp.

    Az SQL Server modulhoz tartozik egy alapértelmezett jelszókészlet az üzembehelyezési jegyzék környezeti változóiban. Ha éles környezetben hoz létre SQL Server-tárolót, minden esetben módosítsa az alapértelmezett rendszergazdai jelszót.

  5. Zárja be a deployment.template.json fájlt.

Az IoT Edge-megoldás összeállítása

Az előző szakaszokban egyetlen modullal hozott létre megoldást, majd hozzáadott egy másik modult az üzembehelyezési jegyzéksablonfájlhoz. Az SQL Server-modult a Microsoft üzemelteti nyilvánosan, de a kódot tárolóba kell helyeznie a Functions modulban. Ebben a szakaszban elkészíti a megoldást, tárolórendszerképeket hoz létre az sqlFunction modulhoz, és leküldi a lemezképet a tárolóregisztrációs adatbázisba.

  1. A Visual Studio Code-ban válassza a View (Nézet) >Terminal (Terminál) elemet az integrált terminál megnyitásához.

  2. Jelentkezzen be a tárolóregisztrációs adatbázisba a Visual Studio Code felületén, hogy le tudja küldeni a rendszerképeket a regisztrációs adatbázisba. Használja ugyanazokat az Azure Container Registry-hitelesítő adatokat, amelyeket az .env fájlhoz adott. Az integrált terminálon írja be a következő parancsot:

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

    Megjelenhet egy biztonsági figyelmeztetés, amely a --password-stdin paraméter használatát javasolja. Bár a paraméter használatát a cikk nem tárgyalja, javasoljuk, kövesse ezt az ajánlott eljárást. További információ: docker login command reference.

  3. A Visual Studio Code Explorerben kattintson a jobb gombbal a deployment.template.json fájlra, és válassza az IoT Edge-megoldás összeállítása és leküldése lehetőséget.

    A buildelési és leküldéses parancs három műveletet indít el. Először létrehoz egy új mappát a konfiguráció nevű megoldásban, amely tartalmazza a teljes üzembehelyezési jegyzékfájlt, amely az üzembehelyezési sablonban és más megoldásfájlokban található információkból épül fel. Másodszor, a tárolórendszerkép létrehozásához fut docker build a célarchitektúra megfelelő dockerfile-fájlja alapján. Ezután leküldi docker push a rendszerkép-adattárat a tárolóregisztrációs adatbázisba.

    Ez a folyamat első alkalommal több percet is igénybe vehet, de a parancsok legközelebbi futtatása gyorsabb lesz.

    Ellenőrizheti, hogy az sqlFunction modul sikeresen le lett-e küldve a tárolóregisztrációs adatbázisba. Az Azure Portalon keresse meg a tárolóregisztrációs adatbázist. Válassza ki az adattárakat, és keressen rá az sqlFunction kifejezésre. A másik két modul, a SimulatedTemperatureSensor és az sql nem lesz leküldve a tárolóregisztrációs adatbázisba, mert az adattáraik már szerepelnek a Microsoft-adatbázisokban.

A megoldás üzembe helyezése egy eszközön

Az IoT Hub felületén keresztül modulokat állíthat be egy eszközön, de az IoT Hubhoz és az eszközökhöz a Visual Studio Code felületén keresztül is hozzáférhet. Ebben a szakaszban be kell állítania az IoT Hubhoz való hozzáférést, majd a Visual Studio Code használatával üzembe helyezheti a megoldást az IoT Edge-eszközön.

  1. A Visual Studio Code Explorer Azure IoT Hub szakaszában bontsa ki az Eszközök elemet az IoT-eszközök listájának megtekintéséhez.

  2. Kattintson a jobb gombbal arra az eszközre, amelyet az üzembe helyezéssel meg szeretne célozni, és válassza az Üzembe helyezés létrehozása önálló eszközhöz lehetőséget.

  3. Válassza ki a deployment.amd64.json fájlt a konfigurációs mappában, majd kattintson az Edge központi telepítési jegyzékének kiválasztása elemre. Ne használja a deployment.template.json fájlt.

  4. Az eszköz alatt bontsa ki a Modulok elemet az üzembe helyezett és a futó modulok listájának megtekintéséhez. Kattintson a frissítés gombra. A SimulatedTemperatureSensor modullal, valamint a $edgeAgent és $edgeHub együtt futó új SQL- és sqlFunction-modulokat is látnia kell.

    Azt is ellenőrizheti, hogy üzemel-e az összes modul az eszközön. Futtassa az alábbi parancsot az IoT Edge-eszközön a modulok állapotának megtekintéséhez.

    iotedge list
    

    A modulok elindítása eltarthat néhány percig. Az IoT Edge-futtatókörnyezetnek meg kell kapnia az új üzembehelyezési jegyzékfájlt, le kell húznia a modul lemezképeit a tároló futtatókörnyezetéből, majd el kell indítania minden új modult.

Az SQL-adatbázis létrehozása

Ha alkalmazza az üzembehelyezési jegyzékfájlt az eszközön, akkor három futó modulja lesz. A SimulatedTemperatureSensor modul szimulált környezeti adatokat hoz létre. Az sqlFunction modul az adatbázis számára megfelelő formátumba konvertálja az adatokat. Ez a szakasz az SQL-adatbázis beállítását mutatja be a hőmérsékletadatok mentéséhez.

Futtassa az alábbi parancsokat az IoT Edge-eszközön. Ezek a parancsok csatlakoznak az eszközön futó SQL-modulhoz , és létrehoznak egy adatbázist és egy táblát a neki küldött hőmérsékleti adatok tárolásához.

  1. Az IoT Edge-eszköz parancssori eszközén csatlakozzon az adatbázishoz.

    sudo docker exec -it sql bash
    
  2. Nyissa meg az SQL-parancssori eszközt.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Strong!Passw0rd'
    
  3. Adatbázis létrehozása:

    CREATE DATABASE MeasurementsDB
    ON
    (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf')
    GO
    
  4. Végezze el a tábla definiálását.

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

Az SQL Server Docker-fájljának testreszabásával megadhatja, hogy a rendszer automatikusan elvégezze az SQL Server üzembe helyezését több IoT Edge-eszközön. További információkért lásd a Microsoft SQL Server-tároló demóprojektjét.

A helyi adatok megtekintése

Ha a tábla létrejött, az sqlFunction modul elkezdi menteni az adatokat az IoT Edge-eszköz helyi SQL Server 2017-adatbázisába.

Futtassa a következő parancsot az SQL-parancssori eszközből a formázott tábla adatainak megtekintéséhez:

SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO

A helyi adatbázis tartalmának megtekintése

Az erőforrások eltávolítása

Ha azt tervezi, hogy a következő ajánlott cikkel folytatja, megtarthatja és újból felhasználhatja a létrehozott erőforrásokat és konfigurációkat. Azt is megteheti, hogy ugyanezt az IoT Edge-eszközt használja teszteszközként.

Ellenkező esetben a díjak elkerülése érdekében törölheti a jelen cikkben létrehozott helyi konfigurációkat és Azure-erőforrásokat.

Azure-erőforrások törlése

Az Azure-erőforrások és -erőforráscsoportok törlése visszafordíthatatlan. Figyeljen, nehogy véletlenül rossz erőforráscsoportot vagy erőforrásokat töröljön. Ha egy meglévő erőforráscsoporton belül hozta létre az IoT Hubot, amelynek erőforrásait meg szeretné tartani, csak magát az IoT Hub-erőforrást törölje, nem pedig az erőforráscsoportot.

Az erőforrások törlése:

  1. Jelentkezzen be az Azure Portalra, és válassza az Erőforráscsoportok elemet.

  2. Válassza ki az IoT Edge teszterőforrásokat tartalmazó erőforráscsoport nevét.

  3. Tekintse át az erőforráscsoportban található erőforrások listáját. Ha mindet törölni szeretné, válassza az Erőforráscsoport törlése lehetőséget. Ha csak bizonyos elemeket szeretne törölni, az egyes erőforrásokra kattintva külön törölheti őket.

Ebben az oktatóanyagban olyan kódot tartalmazó Azure Functions-modult hozott létre, amely szűri az IoT Edge-eszköz által létrehozott nyers adatokat. Ha készen áll saját modulok létrehozására, többet is megtudhat arról, hogyan fejleszthet Azure IoT Edge-modulokat a Visual Studio Code használatával.

Következő lépések

Ha egy másik tárolási módszert szeretne kipróbálni a peremhálózaton, olvassa el, hogyan használhatja az Azure Blob Storage-t az IoT Edge-en.