Sdílet prostřednictvím


Kurz: Ukládání dat na hraničních zařízeních s využitím databází SQL Serveru

Platí pro: Značka zaškrtnutí IoT Edge 1.5 IoT Edge 1.5 Značka zaškrtnutí IoT Edge 1.4 IoT Edge 1.4

Důležité

Podporovanou verzí je IoT Edge 1.5 LTS. IoT Edge 1.4 LTS je konec životnosti od 12. listopadu 2024. Pokud používáte starší verzi, podívejte se na článek Aktualizace IoT Edge.

Nasaďte modul SQL Serveru pro ukládání dat na zařízení s Azure IoT Edge s kontejnery Linuxu.

Pomocí Azure IoT Edge a SQL Serveru můžete ukládat a dotazovat data na hraničních zařízeních. Azure IoT Edge má základní možnosti úložiště pro ukládání zpráv do mezipaměti, pokud zařízení přejde do offline režimu, a pak je při opětovném publikování připojení přeposílejte. Můžete však chtít pokročilejší možnosti úložiště, jako je možnost dotazovat data místně. Vaše zařízení IoT Edge můžou používat místní databáze k provádění složitějších výpočtů bez nutnosti udržovat připojení ke službě IoT Hub.

Tento článek obsahuje pokyny k nasazení databáze SQL Serveru do zařízení IoT Edge. Služba Azure Functions spuštěná na zařízení IoT Edge strukturuje příchozí data a pak je odesílá do databáze. Kroky v tomto článku je možné použít i pro další databáze, které fungují v kontejnerech, jako je MySQL nebo PostgreSQL.

V tomto kurzu se naučíte:

  • Použití Visual Studio Code k vytvoření funkce Azure
  • Nasazení databáze SQL do zařízení IoT Edge
  • Sestavení modulů a jejich nasazení do zařízení IoT Edge pomocí Visual Studio Code
  • Zobrazit vygenerovaná data

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet Azure před tím, než začnete.

Požadavky

Než začnete s tímto kurzem, měli byste si projít předchozí kurz a nastavit vývojové prostředí pro vývoj kontejnerů s Linuxem: Vývoj modulů Azure IoT Edge pomocí editoru Visual Studio Code. Dokončením tohoto kurzu byste měli mít splněné následující požadavky:

  • IoT Hub úrovně Free nebo Standard v Azure.
  • Zařízení AMD64 s Azure IoT Edge s kontejnery Linuxu. Pomocí rychlých startů můžete nastavit zařízení s Linuxem nebo zařízení s Windows.
    • Zařízení ARM, jako je Raspberry Pis, nemůžou spouštět SQL Server. Pokud chcete použít SQL na zařízení ARM, můžete použít Azure SQL Edge.
  • Registr kontejneru, jako je Azure Container Registry.
  • Visual Studio Code nakonfigurované s rozšířeními Azure IoT Edge a Azure IoT Hubu Nástroje Azure IoT Edge pro rozšíření Visual Studio Code jsou v režimu údržby.
  • Stáhněte a nainstalujte do vývojového počítače systém pro správu kontejnerů kompatibilní s Dockerem. Nakonfigurujte ho pro spouštění kontejnerů Linuxu.

Tento kurz používá modul Azure Functions k odesílání dat do SQL Serveru. Pokud chcete vyvíjet modul IoT Edge pomocí Azure Functions, nainstalujte na svůj vývojový počítač následující další požadavky:

Vytvoření projektu funkce

Pokud chcete odeslat data do databáze, potřebujete modul, který dokáže data správně strukturovat a následně je uložit do tabulky.

Vytvoření nového projektu

Následující kroky ukazují, jak vytvořit funkci IoT Edge pomocí Visual Studio Code a rozšíření Azure IoT Edge.

  1. Otevřete Visual Studio Code.

  2. Výběrem palety příkazů Zobrazit>příkaz otevřete paletu příkazů editoru Visual Studio Code.

  3. Na paletě příkazů zadejte a spusťte příkaz Azure IoT Edge: New IoT Edge solution (Azure IoT Edge: Nové řešení IoT Edge). Na paletě příkazů zadejte následující informace k vytvoření řešení:

    Pole Hodnota
    Vybrat složku Zvolte umístění na vývojovém počítači pro Visual Studio Code a vytvořte soubory řešení.
    Zadejte název řešení Zadejte popisný název vašeho řešení, například SqlSolution, nebo přijměte výchozí hodnotu.
    Vyberte šablonu modulu Zvolte Azure Functions – C#.
    Zadejte název modulu Zadejte název modulu sqlFunction.
    Zadejte pro modul úložiště imagí Dockeru Úložiště imagí zahrnuje název registru kontejneru a název image kontejneru. Image kontejneru je předem vyplněná z předchozího kroku. Nahraďte localhost:5000 hodnotou přihlašovacího serveru z registru kontejneru Azure. Přihlašovací server můžete načíst ze stránky Přehled registru kontejneru na webu Azure Portal.

    Konečný řetězec vypadá jako <název> registru.azurecr.io/sqlfunction.

    V okně Visual Studio Code se načte pracovní prostor řešení IoT Edge.

Přidání přihlašovacích údajů registru

V souboru prostředí jsou uložené přihlašovací údaje pro registr kontejneru, které soubor sdílí s modulem runtime IoT Edge. Modul runtime tyto přihlašovací údaje potřebuje k přetažení vašich privátních imagí do zařízení IoT Edge.

Rozšíření IoT Edge se pokusí načíst přihlašovací údaje registru kontejneru z Azure a naplní je v souboru prostředí. Zkontrolujte, jestli už jsou vaše přihlašovací údaje zahrnuté. Pokud ne, přidejte je teď:

  1. V průzkumníku editoru Visual Studio Code otevřete soubor .env.
  2. Aktualizujte pole hodnotami uživatelské jméno a heslo, které jste zkopírovali z registru kontejneru Azure.
  3. Soubor uložte.

Poznámka:

Tento kurz používá přihlašovací údaje správce pro Službu Azure Container Registry, které jsou vhodné pro scénáře vývoje a testování. Až budete připraveni na produkční scénáře, doporučujeme použít možnost ověřování s nejnižšími oprávněními, jako jsou instanční objekty. Další informace najdete v tématu Správa přístupu k registru kontejneru.

Výběr cílové architektury

Potřebujete vybrat, na kterou architekturu cílíte u každého řešení, protože kontejner je sestavený a spouštěný odlišně pro každý typ architektury. Výchozí hodnota je Linux AMD64.

  1. Otevřete paletu příkazů a vyhledejte Azure IoT Edge: Nastavte výchozí cílovou platformu pro řešení Edge nebo vyberte ikonu zástupce na bočním panelu v dolní části okna.

  2. Na paletě příkazů vyberte cílovou architekturu ze seznamu možností. Pro účely tohoto kurzu používáme jako zařízení IoT Edge virtuální počítač s Ubuntu, takže ponecháme výchozí amd64.

Aktualizace modulu pomocí vlastního kódu

  1. V průzkumníku editoru Visual Studio Code otevřete moduly>sqlFunction sqlFunction.csproj.>

  2. Vyhledejte skupinu odkazů na balíčky a přidejte novou, která bude obsahovat SqlClient.

    <PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>
    
  3. Uložte soubor sqlFunction.csproj.

  4. Otevřete soubor sqlFunction.cs.

  5. Celý obsah souboru nahraďte následujícím kódem:

    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 threshold.
                        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. Na řádku 35 nahraďte řetězec <sql připojovací řetězec> následujícím řetězcem. Vlastnost Zdroj dat odkazuje na kontejner SQL Serveru, který ještě neexistuje. V další části ho vytvoříte s názvem SQL . Zvolte silné heslo pro klíčové slovo Heslo .

    Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=<YOUR-STRONG-PASSWORD>;TrustServerCertificate=False;Connection Timeout=30;
    
  7. Uložte soubor sqlFunction.cs.

Přidání kontejneru SQL Serveru

Manifest nasazení deklaruje, které moduly nainstaluje modul runtime IoT Edge na vaše zařízení IoT Edge. Zadali jste kód pro vytvoření přizpůsobeného modulu funkce v předchozí části, ale modul SQL Serveru je už vytvořený a dostupný v Registr artefaktů Microsoft. Stačí pouze sdělit modulu runtime IoT Edge, aby ho zahrnul, a pak ho nakonfigurovat na zařízení.

  1. V editoru Visual Studio Code otevřete paletu příkazů výběrem palety Příkazů zobrazení>.

  2. Na paletě příkazů zadejte a spusťte příkaz Azure IoT Edge: Přidání modulu IoT Edge. Na paletě příkazů zadejte následující informace pro přidání nového modulu:

    Pole Hodnota
    Vyberte soubor šablony nasazení Paleta příkazů zvýrazní soubor deployment.template.json ve vaší aktuální složce řešení. Vyberte tento soubor.
    Vyberte šablonu modulu Vyberte existující modul (zadejte adresu URL úplného obrázku).
    Zadejte název modulu. Zadejte sql. Tento název odpovídá názvu kontejneru deklarovanému v připojovací řetězec v souboru sqlFunction.cs.
    Poskytnutí image Dockeru pro modul Zadejte následující identifikátor URI pro načtení image kontejneru SQL Serveru z Registr artefaktů Microsoft. Pro image založené na Ubuntu použijte mcr.microsoft.com/mssql/server:latest. Pro image založené na RHEL (Red Hat Enterprise Linux) použijte mcr.microsoft.com/mssql/rhel/server:latest.

    Image kontejneru Azure SQL Edge je jednoduchá a kontejnerizovaná verze SQL Serveru, která se dá spustit na zařízeních IoT Edge. Je optimalizovaná pro hraniční scénáře a může běžet na zařízeních ARM a AMD64.

  3. Ve složce řešení otevřete soubor deployment.template.json .

  4. Najděte část moduly. Měli byste vidět tři moduly. Modul SimulatedTemperatureSensor je ve výchozím nastavení součástí nových řešení a poskytuje testovací data pro použití s ostatními moduly. Modul sqlFunction je modul, který jste původně vytvořili a aktualizovali novým kódem. Nakonec se modul SQL naimportoval z Registr artefaktů Microsoft.

    Tip

    Modul SQL Serveru obsahuje výchozí heslo nastavené v proměnných prostředí manifestu nasazení. Po vytvoření kontejneru SQL Serveru v produkčním prostředí byste vždy měli změnit výchozí heslo správce systému.

  5. Zavřete soubor deployment.template.json.

Vytvoření řešení IoT Edge

V předchozích částech jste vytvořili řešení s jedním modulem a pak jste přidali další modul do šablony manifestu nasazení. Modul SQL Serveru je hostovaný veřejně Microsoftem, ale potřebujete kontejnerizovat kód v modulu Functions. V této části sestavíte řešení, vytvoříte image kontejneru pro modul sqlFunction a nasdílíte image do registru kontejneru.

  1. Ve Visual Studio Code otevřete integrovaný terminál tím, že vyberete Zobrazit>Terminál.

  2. Ve Visual Studio Code se přihlaste ke svému registru kontejneru, abyste do něj mohli odeslat své image. Použijte stejné přihlašovací údaje služby Azure Container Registry (ACR), které jste přidali do souboru .env. V integrovaném terminálu zadejte následující příkaz:

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

    Může se zobrazit upozornění zabezpečení, které doporučuje použití parametru --password-stdin. I když je jeho použití nad rámec tohoto článku, doporučujeme řídit se osvědčeným postupem. Další informace najdete v referenčních informacích k příkazu docker login .

  3. V Průzkumníku editoru Visual Studio Code klikněte pravým tlačítkem na soubor deployment.template.json a vyberte Sestavit a odeslat řešení IoT Edge.

    Příkaz sestavení a nabízení spustí tři operace. Nejprve vytvoří v řešení novou složku s názvem config , která obsahuje úplný manifest nasazení, který je sestavený z informací v šabloně nasazení a dalších souborech řešení. Za druhé se spustí docker build sestavení image kontejneru na základě příslušného souboru Dockerfile pro vaši cílovou architekturu. Potom se spustí docker push pro nasdílení úložiště imagí do registru kontejneru.

    Tento proces může trvat několik minut poprvé, ale při příštím spuštění příkazů je rychlejší.

    Můžete ověřit, že se modul sqlFunction úspěšně odeslal do registru kontejneru. Na webu Azure Portal přejděte do svého registru kontejneru. Vyberte úložiště a vyhledejte sqlFunction. Další dva moduly SimulatedTemperatureSensor a SQL se do registru kontejneru nenasdílí, protože jejich úložiště už jsou v registrech Microsoftu.

Nasazení řešení do zařízení

Moduly na zařízení můžete nastavit prostřednictvím služby IoT Hub, ale přistupovat ke službě IoT Hub a zařízením můžete také přes Visual Studio Code. V této části nastavíte přístup ke službě IoT Hub a pak pomocí editoru Visual Studio Code nasadíte řešení do zařízení IoT Edge.

  1. V Průzkumníku editoru Visual Studio Code v části Azure IoT Hub rozbalte zařízení , abyste viděli seznam zařízení IoT.

  2. Klikněte pravým tlačítkem myši na zařízení, na které chcete cílit s nasazením, a vyberte Vytvořit nasazení pro jedno zařízení.

  3. Vyberte soubor deployment.amd64.json ve složce konfigurace a potom klikněte na Vybrat manifest nasazení Edge. Nepoužívejte soubor deployment.template.json.

  4. V zařízení rozbalte moduly a zobrazte seznam nasazených a spuštěných modulů. Klikněte na tlačítko pro obnovení. Měli byste vidět nové moduly SQL a sqlFunction spuštěné společně s modulem SimulatedTemperatureSensor a $edgeAgent a $edgeHub.

    Můžete také zkontrolovat, jestli jsou na vašem zařízení zprovozněné všechny moduly. Spuštěním následujícího příkazu na vašem zařízení IoT Edge zobrazte stav modulů.

    iotedge list
    

    Spuštění modulů může trvat několik minut. Modul runtime IoT Edge potřebuje získat nový manifest nasazení, stáhnout image modulů z modulu runtime kontejneru a pak spustit každý nový modul.

Vytvoření databáze SQL

Když pro své zařízení použijete manifest nasazení, získáte tři spuštěné moduly. Modul SimulatedTemperatureSensor generuje simulovaná data prostředí. Modul sqlFunction přebírá data a formátuje je pro databázi. Tato část vás provede nastavením databáze SQL pro ukládání údajů o teplotě.

Na zařízení IoT Edge spusťte následující příkazy. Tyto příkazy se připojují k modulu SQL spuštěného na vašem zařízení a vytvoří databázi a tabulku pro uložení dat o teplotě, která se do něj odesílají. Nahraďte <SVÉ-STRONG-PASSWORD> silným heslem, které jste zvolili ve svém připojovací řetězec.

  1. V nástroji příkazového řádku na zařízení IoT Edge se připojte k databázi.

    sudo docker exec -it sql bash
    
  2. Otevřete nástroj příkazového řádku SQL.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YOUR-STRONG-PASSWORD>'
    
  3. Vytvořte databázi:

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

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

Souboru Dockeru pro SQL Server můžete upravit tak, aby automaticky nastavil nasazení SQL Serveru do několika zařízení IoT Edge. Další informace najdete v ukázkovém projektu kontejneru Microsoft SQL Serveru.

Zobrazení místních dat

Po vytvoření tabulky začne modul sqlFunction ukládat data do místní databáze SQL Serveru 2017 na vašem zařízení IoT Edge.

Spuštěním následujícího příkazu v nástroji příkazového řádku SQL zobrazte formátovaná tabulková data:

SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO

Zobrazení obsahu místní databáze

Vyčištění prostředků

Pokud máte v plánu pokračovat k dalšímu doporučenému článku, můžete si vytvořené prostředky a konfigurace uschovat a znovu je použít. Také můžete dál používat stejné zařízení IoT Edge jako testovací zařízení.

Jinak můžete místní konfigurace a prostředky Azure vytvořené v tomto článku odstranit, abyste se vyhnuli poplatkům.

Odstranění prostředků Azure

Odstranění prostředků Azure a skupin prostředků je nevratná akce. Ujistěte se, že nechtěně neodstraníte nesprávnou skupinu prostředků nebo prostředky. Pokud jste centrum IoT vytvořili ve stávající skupině prostředků, která obsahuje prostředky, které chcete zachovat, odstraňte pouze samotný prostředek ioT Hubu, nikoli skupinu prostředků.

Odstranění prostředků:

  1. Přihlaste se k portálu Azure Portal a potom vyberte Skupiny prostředků.

  2. Vyberte název skupiny prostředků, která obsahuje vaše testovací prostředky služby IoT Edge.

  3. Zkontrolujte seznam prostředků, které vaše skupina prostředků obsahuje. Pokud chcete odstranit všechny prostředky, můžete vybrat možnost Odstranit skupinu prostředků. Pokud chcete odstranit jenom některé z nich, můžete vybrat jednotlivé prostředky, které chcete odstranit jednotlivě.

V tomto kurzu jste vytvořili modul Azure Functions obsahující kód pro filtrování nezpracovaných dat generovaných vaším zařízením IoT Edge. Až budete připraveni vytvářet vlastní moduly, můžete se dozvědět více o tom, jak vyvíjet moduly Azure IoT Edge pomocí editoru Visual Studio Code.

Další kroky

Pokud chcete vyzkoušet jinou metodu úložiště na hraničních zařízeních, přečtěte si, jak používat Azure Blob Storage ve službě IoT Edge.