Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:
IoT Edge 1.4
Belangrijk
IoT Edge 1.5 LTS en IoT Edge 1.4 worden ondersteund. Zie IoT Edge bijwerken als u een eerdere versie gebruikt.
Implementeer een SQL Server-module voor het opslaan van gegevens op een apparaat met Azure IoT Edge met Linux-containers.
Gebruik Azure IoT Edge en SQL Server om gegevens aan de rand op te slaan en er query's op uit te voeren. Azure IoT Edge heeft basisopslagmogelijkheden om berichten in de cache op te slaan als een apparaat offline gaat en deze vervolgens door te sturen wanneer de verbinding opnieuw tot stand is gebracht. Mogelijk wilt u echter meer geavanceerde opslagmogelijkheden, zoals het lokaal kunnen opvragen van gegevens. Uw IoT Edge-apparaten kunnen lokale databases gebruiken om complexere computing uit te voeren zonder dat er een verbinding met IoT Hub hoeft te worden onderhouden.
Dit artikel bevat instructies voor het implementeren van een SQL Server-database op een IoT Edge-apparaat. Azure Functions, uitgevoerd op het IoT Edge-apparaat, structureert de binnenkomende gegevens en verzendt deze vervolgens naar de database. De stappen in dit artikel kunnen ook worden toegepast op andere databases die in containers werken, zoals MySQL of PostgreSQL.
In deze tutorial leer je hoe je:
- Visual Studio Code gebruiken om een Azure-functie te maken
- Een SQL-database implementeren op uw IoT Edge-apparaat
- Visual Studio Code gebruiken om modules te bouwen en te implementeren op uw IoT Edge-apparaat
- Gegenereerde gegevens weergeven
Als u geen Azure-account hebt, maak dan een gratis account aan voordat u begint.
Vereiste voorwaarden
Voordat u met deze zelfstudie begint, moet u de vorige zelfstudie hebben doorlopen om uw ontwikkelomgeving in te stellen voor het ontwikkelen van Linux-containers: Azure IoT Edge-modules ontwikkelen met behulp van Visual Studio Code. Als u deze zelfstudie voltooit, moet aan de volgende vereisten zijn voldaan:
- Een gratis of Standard-laag IoT Hub in Azure.
- Een AMD64-apparaat met Azure IoT Edge met Linux-containers. U kunt de quickstarts gebruiken om een Linux-apparaat of Windows-apparaat in te stellen.
- ARM-apparaten, zoals Raspberry, kunnen SQL Server niet uitvoeren. Als u SQL op een ARM-apparaat wilt gebruiken, kunt u Azure SQL Edge gebruiken.
- Een containerregister, zoals Azure Container Registry.
- Visual Studio Code geconfigureerd met de Azure IoT Edge - en Azure IoT Hub-extensies . De Azure IoT Edge-hulpprogramma's voor de Visual Studio Code-extensie bevindt zich in de onderhoudsmodus.
- Download en installeer een docker-compatibel containerbeheersysteem op uw ontwikkelcomputer. Configureer deze om Linux-containers uit te voeren.
In deze zelfstudie wordt gebruikgemaakt van een Azure Functions-module voor het verzenden van gegevens naar de SQL Server. Als u een IoT Edge-module wilt ontwikkelen met Azure Functions, installeert u de volgende aanvullende vereisten op uw ontwikkelcomputer:
- C# voor Visual Studio Code -extensie (mogelijk gemaakt door OmniSharp) voor Visual Studio Code.
- .NET Core SDK.
Een functieproject maken
Als u gegevens naar een database wilt verzenden, hebt u een module nodig die de gegevens goed kan structuren en deze vervolgens in een tabel kan opslaan.
Een nieuw project maken
In de volgende stappen ziet u hoe u een IoT Edge-functie maakt met behulp van Visual Studio Code en de Azure IoT Edge-extensie.
Open Visual Studio Code.
Open het opdrachtenpalet van Visual Studio Code door hetopdrachtenpaletWeergeven> te selecteren.
Typ en voer in het opdrachtpalet de opdracht Azure IoT Edge: Nieuwe IoT Edge-oplossing uit. Geef in het opdrachtpalet de volgende informatie op om uw oplossing te maken:
Veld Waarde Map selecteren Kies de locatie op uw ontwikkelcomputer voor Visual Studio Code om de oplossingsbestanden te maken. Geef een oplossingsnaam op Voer een beschrijvende naam in voor uw oplossing, zoals SqlSolution, of accepteer de standaardwaarde. Modulesjabloon selecteren Kies Azure Functions - C#. Geef een modulenaam op Geef uw module de naam sqlFunction. Opslagplaats voor Docker-installatiekopieën opgeven voor de module Een opslagplaats voor installatiekopieën bevat de naam van uw containerregister en de naam van de containerinstallatiekopieën. De containerinstallatiekopieën worden vooraf ingevuld in de laatste stap. Vervang localhost:5000 door de waarde van de aanmeldingsserver uit uw Azure-containerregister. U kunt de aanmeldingsserver ophalen op de overzichtspagina van uw containerregister in Azure Portal.
De uiteindelijke tekenreeks ziet eruit als <registernaam.azurecr.io/sqlfunction>.Het Visual Studio Code-venster laadt uw IoT Edge-oplossingswerkruimte.
Uw registerreferenties toevoegen
Het omgevingsbestand slaat de referenties voor uw containerregister op en deelt deze met de IoT Edge-runtime. De runtime heeft deze referenties nodig om uw persoonlijke installatiekopieën naar het IoT Edge-apparaat te halen.
De IoT Edge-extensie probeert uw containerregisterreferenties op te halen uit Azure en vult deze in het omgevingsbestand. Controleer of uw referenties al zijn opgenomen. Zo niet, voeg ze nu toe:
- Open in Visual Studio Code Explorer het .env-bestand.
- Werk de velden bij met de gebruikersnaam - en wachtwoordwaarden die u hebt gekopieerd uit uw Azure-containerregister.
- Sla dit bestand op.
Opmerking
In deze zelfstudie worden aanmeldingsreferenties voor beheerders gebruikt voor Azure Container Registry, wat handig is voor ontwikkelings- en testscenario's. Wanneer u klaar bent voor productiescenario's, wordt u aangeraden een optie voor verificatie met minimale bevoegdheden, zoals service-principals. Zie Toegang tot uw containerregister beheren voor meer informatie.
Uw doelarchitectuur selecteren
U moet selecteren welke architectuur u wilt gebruiken voor elke oplossing, omdat de container voor elk architectuurtype anders wordt gebouwd en uitgevoerd. De standaardwaarde is Linux AMD64.
Open het opdrachtenpalet en zoek naar Azure IoT Edge: Stel standaarddoelplatform voor Edge-oplossing in of selecteer het snelkoppelingspictogram in de zijbalk onder aan het venster.
Selecteer in het opdrachtpalet de doelarchitectuur in de lijst met opties. Voor deze zelfstudie gebruiken we een virtuele Ubuntu-machine als het IoT Edge-apparaat, dus blijven de standaard amd64 behouden.
De module bijwerken met aangepaste code
Open in Visual Studio Code Explorer modules>sqlFunction>sqlFunction.csproj.
Zoek de groep pakketverwijzingen en voeg een nieuwe toe om SqlClient op te nemen.
<PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>Sla het bestand sqlFunction.csproj op.
Open het bestand sqlFunction.cs .
Vervang de volledige inhoud van het bestand door de volgende code:
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;} } }Vervang in regel 35 de sql-verbindingsreeks van> de tekenreeks< door de volgende tekenreeks. De eigenschap Gegevensbron verwijst naar de SQL Server-container, die nog niet bestaat. U maakt deze met de naam SQL in de volgende sectie. Kies een sterk wachtwoord voor het trefwoord Wachtwoord .
Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=<YOUR-STRONG-PASSWORD>;TrustServerCertificate=False;Connection Timeout=30;Sla het sqlFunction.cs bestand op.
De SQL Server-container toevoegen
Een implementatiemanifest declareert welke modules de IoT Edge-runtime op uw IoT Edge-apparaat installeert. U hebt de code opgegeven voor het maken van een aangepaste functiemodule in de vorige sectie, maar de SQL Server-module is al gebouwd en beschikbaar in het Microsoft Artifact Registry. U hoeft alleen de IoT Edge-runtime te vertellen om deze op te nemen en deze vervolgens op uw apparaat te configureren.
Open in Visual Studio Code het opdrachtenpalet door hetopdrachtenpaletWeergeven> te selecteren.
Typ en voer de opdracht Azure IoT Edge uit in het opdrachtenpalet : IoT Edge-module toevoegen. Geef in het opdrachtenpalet de volgende informatie op om een nieuwe module toe te voegen:
Veld Waarde Sjabloonbestand voor implementatie selecteren Het opdrachtpalet markeert het deployment.template.json bestand in de huidige oplossingsmap. Selecteer dat bestand. Modulesjabloon selecteren Selecteer de bestaande module (voer de URL van de volledige installatiekopieën in). Geef een modulenaam op Voer sql in. Deze naam komt overeen met de containernaam die is gedeclareerd in de verbindingsreeks in het sqlFunction.cs-bestand. Docker-installatiekopieën opgeven voor de module Voer de volgende URI in om de SQL Server-containerinstallatiekopie op te halen uit het Microsoft Artifact Registry. Voor Ubuntu-installatiekopieën gebruikt u mcr.microsoft.com/mssql/server:latest. Gebruikmcr.microsoft.com/mssql/rhel/server:latestvoor RHEL-installatiekopieën (Red Hat Enterprise Linux) .De Azure SQL Edge-containerinstallatiekopieën zijn een lichtgewicht, containerversie van SQL Server die kan worden uitgevoerd op IoT Edge-apparaten. Het is geoptimaliseerd voor edge-scenario's en kan worden uitgevoerd op ARM- en AMD64-apparaten.
Open het bestanddeployment.template.jsonin de oplossingsmap .
Zoek de sectie modules . Als het goed is, ziet u drie modules. De module SimulatedTemperatureSensor is standaard opgenomen in nieuwe oplossingen en biedt testgegevens voor gebruik met uw andere modules. De module sqlFunction is de module die u in eerste instantie hebt gemaakt en bijgewerkt met nieuwe code. Ten slotte is de module sql geïmporteerd uit het Microsoft Artifact Registry.
Aanbeveling
De SQL Server-module wordt geleverd met een standaardwachtwoord dat is ingesteld in de omgevingsvariabelen van het implementatiemanifest. Telkens wanneer u een SQL Server-container in een productieomgeving maakt, moet u het standaardwachtwoord voor de systeembeheerder wijzigen.
Sluit het bestanddeployment.template.json .
Uw IoT Edge-oplossing bouwen
In de vorige secties hebt u een oplossing gemaakt met één module en vervolgens een oplossing toegevoegd aan de sjabloon voor het distributiemanifest. De SQL Server-module wordt openbaar gehost door Microsoft, maar u moet de code in de Functions-module in een container opnemen. In deze sectie bouwt u de oplossing, maakt u containerinstallatiekopieën voor de sqlFunction-module en pusht u de installatiekopieën naar uw containerregister.
Open in Visual Studio Code de geïntegreerde terminal door View>Terminal te selecteren.
Meld u aan bij uw containerregister in Visual Studio Code, zodat u uw installatiekopieën naar uw register kunt pushen. Gebruik dezelfde ACR-referenties (Azure Container Registry) die u hebt toegevoegd aan het .env-bestand. Voer de volgende opdracht in de geïntegreerde terminal in:
docker login -u <ACR username> -p <ACR password> <ACR login server>Mogelijk ziet u een beveiligingswaarschuwing die het gebruik van de parameter --password-stdin aanbeveelt. Hoewel het gebruik ervan buiten het bereik van dit artikel valt, raden we u aan deze best practice te volgen. Zie de naslaginformatie over de docker-aanmeldingsopdracht voor meer informatie.
Klik in Visual Studio Code Explorer met de rechtermuisknop op het bestanddeployment.template.json en selecteer De oplossing Build en Push IoT Edge.
De build- en push-opdracht start drie bewerkingen. Eerst wordt er een nieuwe map gemaakt in de oplossing met de naam config die het volledige implementatiemanifest bevat, dat is opgebouwd uit informatie in de implementatiesjabloon en andere oplossingsbestanden. Ten tweede wordt
docker buildde containerinstallatiekopieën gebouwd op basis van de juiste dockerfile voor uw doelarchitectuur. Vervolgens wordtdocker pushde opslagplaats voor installatiekopieën naar uw containerregister gepusht.Dit proces kan enkele minuten duren, maar is sneller wanneer u de opdrachten de volgende keer uitvoert.
U kunt controleren of de sqlFunction-module is gepusht naar uw containerregister. Navigeer in Azure Portal naar uw containerregister. Selecteer opslagplaatsen en zoek naar sqlFunction. De andere twee modules, SimulatedTemperatureSensor en sql, worden niet naar uw containerregister gepusht omdat hun opslagplaatsen zich al in de Microsoft-registers bevinden.
De oplossing implementeren op een apparaat
U kunt modules op een apparaat instellen via de IoT Hub, maar u hebt ook toegang tot uw IoT Hub en apparaten via Visual Studio Code. In deze sectie stelt u de toegang tot uw IoT Hub in en gebruikt u Visual Studio Code om uw oplossing te implementeren op uw IoT Edge-apparaat.
Vouw in visual Studio Code Explorer, onder de sectie Azure IoT Hub , apparaten uit om uw lijst met IoT-apparaten weer te geven.
Klik met de rechtermuisknop op het apparaat waarop u de implementatie wilt toepassen en selecteer Implementatie voor één apparaat maken.
Selecteer het bestanddeployment.amd64.json in de configuratiemap en klik vervolgens op Edge-implementatiemanifest selecteren. Gebruik het bestand deployment.template.json niet.
Vouw modules onder uw apparaat uit om een lijst met geïmplementeerde en actieve modules weer te geven. Klik op de knop Vernieuwen. De nieuwe sql - en sqlFunction-modules worden samen met de module SimulatedTemperatureSensor en de $edgeAgent en $edgeHub weergegeven.
U kunt ook controleren of alle modules actief zijn op uw apparaat. Voer op uw IoT Edge-apparaat de volgende opdracht uit om de status van de modules te bekijken.
iotedge listHet kan enkele minuten duren voordat de modules zijn gestart. De IoT Edge-runtime moet het nieuwe implementatiemanifest ontvangen, de moduleinstallatiekopieën uit de containerruntime ophalen en vervolgens elke nieuwe module starten.
De SQL-database maken
Wanneer u het implementatiemanifest toepast op uw apparaat, worden er drie modules uitgevoerd. De module SimulatedTemperatureSensor genereert gesimuleerde omgevingsgegevens. De sqlFunction-module gebruikt de gegevens en maakt deze op voor een database. In deze sectie wordt u begeleid bij het instellen van de SQL-database om de temperatuurgegevens op te slaan.
Voer de volgende opdrachten uit op uw IoT Edge-apparaat. Met deze opdrachten maakt u verbinding met de SQL-module die op uw apparaat wordt uitgevoerd en maakt u een database en tabel om de temperatuurgegevens op te slaan die naar deze module worden verzonden. Vervang <UW STERKE WACHTWOORD> door het sterke wachtwoord dat u hebt gekozen in uw verbindingsreeks.
Maak in een opdrachtregelprogramma op uw IoT Edge-apparaat verbinding met uw database.
sudo docker exec -it sql bashOpen het SQL-opdrachtprogramma.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YOUR-STRONG-PASSWORD>'Uw database maken:
CREATE DATABASE MeasurementsDB ON (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf') GODefinieer de tabel.
CREATE TABLE MeasurementsDB.dbo.TemperatureMeasurements (measurementTime DATETIME2, location NVARCHAR(50), temperature FLOAT) GO
U kunt uw SQL Server Docker-bestand aanpassen om uw SQL Server automatisch in te stellen voor implementatie op meerdere IoT Edge-apparaten. Zie het microsoft SQL Server-containerdemoproject voor meer informatie.
De lokale gegevens weergeven
Zodra de tabel is gemaakt, wordt de sqlFunction-module gestart met het opslaan van gegevens in een lokale SQL Server 2017-database op uw IoT Edge-apparaat.
Voer vanuit het SQL-opdrachtprogramma de volgende opdracht uit om de opgemaakte tabelgegevens weer te geven:
SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO
De hulpbronnen opschonen
Als u van plan bent door te gaan naar het volgende aanbevolen artikel, kunt u de resources en configuraties die u hebt gemaakt behouden en opnieuw gebruiken. U kunt ook hetzelfde IoT Edge-apparaat blijven gebruiken als een testapparaat.
Anders kunt u de lokale configuraties en de Azure-resources die u in dit artikel hebt gemaakt, verwijderen om kosten te voorkomen.
Azure-resources verwijderen
Het verwijderen van Azure-resources en -resourcegroepen kan niet ongedaan worden gemaakt. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of middelen verwijdert. Als u de IoT-hub hebt gemaakt in een bestaande resourcegroep met resources die u wilt behouden, verwijdert u alleen de IoT-hubresource zelf, niet de resourcegroep.
De resources verwijderen:
Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.
Selecteer de naam van de resourcegroep die uw IoT Edge-testresources bevat.
Bekijk de lijst met resources die zich in uw resourcegroep bevinden. Als u deze allemaal wilt verwijderen, kunt u resourcegroep verwijderen selecteren. Als u slechts enkele van deze resources wilt verwijderen, kunt u op elke resource klikken om ze afzonderlijk te verwijderen.
In deze zelfstudie hebt u een Azure Functions-module gemaakt die code bevat voor het filteren van onbewerkte gegevens die zijn gegenereerd door uw IoT Edge-apparaat. Wanneer u klaar bent om uw eigen modules te bouwen, kunt u meer informatie krijgen over het ontwikkelen van Azure IoT Edge-modules met behulp van Visual Studio Code.
Volgende stappen
Als u een andere opslagmethode aan de rand wilt proberen, leest u meer over het gebruik van Azure Blob Storage in IoT Edge.