Anmerkung
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:
IoT Edge 1.4
Von Bedeutung
IoT Edge 1.5 LTS und IoT Edge 1.4 werden versionen unterstützt. Wenn Sie eine frühere Version verwenden, lesen Sie Update IoT Edge.
Stellen Sie ein SQL Server-Modul zum Speichern von Daten auf einem Gerät bereit, auf dem Azure IoT Edge mit Linux-Containern ausgeführt wird.
Verwenden Sie Azure IoT Edge und SQL Server, um Daten am Edge zu speichern und abzufragen. Azure IoT Edge verfügt über grundlegende Speicherfunktionen zum Zwischenspeichern von Nachrichten, wenn ein Gerät offline ist, und leitet sie dann weiter, wenn die Verbindung wiederhergestellt wird. Möglicherweise möchten Sie jedoch erweiterte Speicherfunktionen wie die Möglichkeit haben, Daten lokal abzufragen. Ihre IoT Edge-Geräte können lokale Datenbanken verwenden, um komplexere Computer auszuführen, ohne eine Verbindung mit IoT Hub pflegen zu müssen.
Dieser Artikel enthält Anweisungen zum Bereitstellen einer SQL Server-Datenbank auf einem IoT Edge-Gerät. Azure Functions, ausgeführt auf dem IoT Edge-Gerät, strukturiert die eingehenden Daten und sendet sie dann an die Datenbank. Die Schritte in diesem Artikel können auch auf andere Datenbanken angewendet werden, die in Containern funktionieren, z. B. MySQL oder PostgreSQL.
In diesem Tutorial lernen Sie Folgendes:
- Verwenden von Visual Studio Code zum Erstellen einer Azure-Funktion
- Bereitstellen einer SQL-Datenbank auf Ihrem IoT Edge-Gerät
- Verwenden von Visual Studio Code zum Erstellen von Modulen und Bereitstellen auf Ihrem IoT Edge-Gerät
- Anzeigen generierter Daten
Wenn Sie nicht über ein Azure-Konto verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.
Voraussetzungen
Bevor Sie mit diesem Lernprogramm beginnen, sollten Sie das vorherige Lernprogramm durchlaufen haben, um Ihre Entwicklungsumgebung für die Entwicklung von Linux-Containern einzurichten: Entwickeln von Azure IoT Edge-Modulen mit Visual Studio Code. Wenn Sie dieses Lernprogramm abschließen, sollten Sie die folgenden Voraussetzungen erfüllt haben:
- Ein kostenloser oder standardmäßiger IoT-Hub in Azure.
- Ein AMD64-Gerät mit Azure IoT Edge mit Linux-Containern. Sie können die Schnellstarts verwenden, um ein Linux-Gerät oder Windows-Gerät einzurichten.
- ARM-Geräte wie Raspberry Pis können SQL Server nicht ausführen. Wenn Sie SQL auf einem ARM-Gerät verwenden möchten, können Sie Azure SQL Edge verwenden.
- Eine Containerregistrierung, z. B. Azure Container Registry.
- Visual Studio Code , der mit den Erweiterungen Azure IoT Edge und Azure IoT Hub konfiguriert ist. Die Azure IoT Edge-Tools für die Visual Studio Code-Erweiterung befinden sich im Wartungsmodus.
- Laden Sie ein dockerkompatibles Containerverwaltungssystem auf Ihrem Entwicklungscomputer herunter, und installieren Sie es. Konfigurieren Sie sie zum Ausführen von Linux-Containern.
In diesem Lernprogramm wird ein Azure Functions-Modul verwendet, um Daten an den SQL Server zu senden. Um ein IoT Edge-Modul mit Azure Functions zu entwickeln, installieren Sie die folgenden zusätzlichen Voraussetzungen auf Ihrem Entwicklungscomputer:
- C# für Visual Studio Code -Erweiterung (unterstützt von OmniSharp) für Visual Studio Code.
- .NET Core SDK.
Erstellen eines Funktionsprojekts
Zum Senden von Daten in eine Datenbank benötigen Sie ein Modul, das die Daten ordnungsgemäß strukturieren und dann in einer Tabelle speichert.
Erstellen eines neuen Projekts
Die folgenden Schritte zeigen, wie Sie eine IoT Edge-Funktion mit Visual Studio Code und der Azure IoT Edge-Erweiterung erstellen.
Öffnen Sie Visual Studio Code.
Öffnen Sie die Befehlspalette von Visual Studio Code, indem Sie dieBefehlspaletteanzeigen> auswählen.
Geben Sie in der Befehlspalette den Befehl Azure IoT Edge: Neue IoT Edge-Lösung ein, und führen Sie sie aus. Geben Sie in der Befehlspalette die folgenden Informationen zum Erstellen Ihrer Lösung an:
Feld Wert Ordner auswählen Wählen Sie den Speicherort auf Ihrem Entwicklungscomputer für Visual Studio Code aus, um die Lösungsdateien zu erstellen. Bereitstellen eines Lösungsnamens Geben Sie einen beschreibenden Namen für Ihre Lösung ein, z. B. SqlSolution, oder übernehmen Sie die Standardeinstellung. Modulvorlage auswählen Wählen Sie Azure-Funktionen – C# aus. Angeben eines Modulnamens Benennen Sie das Modul "sqlFunction". Bereitstellen des Docker-Image-Repositorys für das Modul Ein Image-Repository enthält den Namen Ihrer Containerregistrierung und den Namen Ihres Containerimages. Ihr Containerimage wird aus dem letzten Schritt vorab aufgefüllt. Ersetzen Sie localhost:5000 durch den Anmeldeserverwert aus Ihrer Azure-Containerregistrierung. Sie können den Anmeldeserver über die Übersichtsseite Ihrer Containerregistrierung im Azure-Portal abrufen.
Die letzte Zeichenfolge sieht wie <registrierungsname.azurecr.io/sqlfunction> aus.Das Visual Studio Code-Fenster lädt Ihren IoT Edge-Lösungsarbeitsbereich.
Hinzufügen Ihrer Registrierungsanmeldeinformationen
Die Umgebungsdatei speichert die Anmeldeinformationen für Ihre Containerregistrierung und teilt sie mit der IoT Edge-Laufzeit. Die Laufzeit benötigt diese Anmeldeinformationen, um Ihre privaten Images auf das IoT Edge-Gerät zu übertragen.
Die IoT Edge-Erweiterung versucht, Ihre Containerregistrierungsanmeldeinformationen aus Azure abzurufen und in der Umgebungsdatei aufzufüllen. Überprüfen Sie, ob Ihre Anmeldeinformationen bereits enthalten sind. Wenn nicht, fügen Sie sie jetzt hinzu:
- Öffnen Sie im Visual Studio Code-Explorer die env-Datei.
- Aktualisieren Sie die Felder mit den Benutzernamen - und Kennwortwerten , die Sie aus Ihrer Azure-Containerregistrierung kopiert haben.
- Speichern Sie diese Datei.
Hinweis
In diesem Lernprogramm werden Administratoranmeldeinformationen für die Azure-Containerregistrierung verwendet, die für Entwicklungs- und Testszenarien geeignet sind. Wenn Sie für Produktionsszenarien bereit sind, empfehlen wir eine Option für die Authentifizierung mit geringsten Berechtigungen wie Dienstprinzipale. Weitere Informationen finden Sie unter Verwalten des Zugriffs auf Ihre Containerregistrierung.
Auswählen der Zielarchitektur
Sie müssen auswählen, auf welche Architektur Sie mit jeder Lösung abzielen, da der Container für jeden Architekturtyp erstellt und unterschiedlich ausgeführt wird. Der Standardwert ist Linux AMD64.
Öffnen Sie die Befehlspalette, und suchen Sie nach Azure IoT Edge: Legen Sie die Standardzielplattform für Edge-Lösung fest, oder wählen Sie das Verknüpfungssymbol in der Randleiste unten im Fenster aus.
Wählen Sie in der Befehlspalette die Zielarchitektur aus der Liste der Optionen aus. In diesem Lernprogramm verwenden wir einen virtuellen Ubuntu-Computer als IoT Edge-Gerät, sodass der Standard amd64 beibehalten wird.
Aktualisieren des Moduls mit benutzerdefiniertem Code
Öffnen Sie im Visual Studio Code-Explorer die Module>sqlFunction sqlFunction.csproj>.
Suchen Sie die Gruppe der Paketverweise, und fügen Sie einen neuen hinzu, um SqlClient einzuschließen.
<PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>Speichern Sie die Datei "sqlFunction.csproj ".
Öffnen Sie die datei sqlFunction.cs .
Ersetzen Sie den gesamten Inhalt der Datei durch den folgenden 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;} } }Ersetzen Sie in Zeile 35 die sql-Verbindungszeichenfolge der Zeichenfolge< durch die folgende Zeichenfolge>. Die Datenquelleneigenschaft verweist auf den SQL Server-Container, der noch nicht vorhanden ist. Sie erstellen ihn mit dem Namen SQL im nächsten Abschnitt. Wählen Sie ein sicheres Kennwort für das Schlüsselwort "Password" aus.
Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=<YOUR-STRONG-PASSWORD>;TrustServerCertificate=False;Connection Timeout=30;Speichern Sie die sqlFunction.cs Datei.
Hinzufügen des SQL Server-Containers
Ein Bereitstellungsmanifest deklariert, welche Module die IoT Edge-Laufzeit auf Ihrem IoT Edge-Gerät installiert. Sie haben den Code bereitgestellt, um ein benutzerdefiniertes Funktionsmodul im vorherigen Abschnitt zu erstellen, aber das SQL Server-Modul ist bereits in der Microsoft Artifact Registry integriert und verfügbar. Sie müssen lediglich die IoT Edge-Laufzeit anweisen, sie einzuschließen, und konfigurieren Sie sie dann auf Ihrem Gerät.
Öffnen Sie in Visual Studio Code die Befehlspalette, indem Sie dieBefehlspaletteanzeigen> auswählen.
Geben Sie in der Befehlspalette den Befehl Azure IoT Edge ein, und führen Sie den Befehl aus: Add IoT Edge module. Geben Sie in der Befehlspalette die folgenden Informationen an, um ein neues Modul hinzuzufügen:
Feld Wert Bereitstellungsvorlagendatei auswählen Die Befehlspalette hebt die deployment.template.json Datei im aktuellen Lösungsordner hervor. Wählen Sie diese Datei aus. Modulvorlage auswählen Wählen Sie vorhandenes Modul aus (Geben Sie die vollständige Bild-URL ein). Angeben eines Modulnamens Geben Sie "sql" ein. Dieser Name entspricht dem containernamen, der in der Verbindungszeichenfolge in der datei sqlFunction.cs deklariert ist. Bereitstellen des Docker-Images für das Modul Geben Sie den folgenden URI ein, um das SQL Server-Containerimage aus der Microsoft Artifact-Registrierung abzurufen. Verwenden Sie mcr.microsoft.com/mssql/server:latestfür Ubuntu-basierte Bilder . Verwenden Siemcr.microsoft.com/mssql/rhel/server:latestfür Red Hat Enterprise Linux (RHEL)-basierte Images.Das Azure SQL Edge-Containerimage ist eine einfache containerisierte Version von SQL Server, die auf IoT Edge-Geräten ausgeführt werden kann. Es ist für Edgeszenarien optimiert und kann auf ARM- und AMD64-Geräten ausgeführt werden.
Öffnen Sie im Lösungsordner die deployment.template.json Datei.
Suchen Sie den Abschnitt "Module ". Es sollten drei Module angezeigt werden. Das Modul SimulatedTemperatureSensor ist standardmäßig in neuen Lösungen enthalten und stellt Testdaten bereit, die mit ihren anderen Modulen verwendet werden können. Das Modul sqlFunction ist das Modul, das Sie zunächst mit neuem Code erstellt und aktualisiert haben. Schließlich wurde das Modul SQL aus der Microsoft Artifact Registry importiert.
Tipp
Das SQL Server-Modul enthält einen Standardkennwortsatz in den Umgebungsvariablen des Bereitstellungsmanifests. Jedes Mal, wenn Sie einen SQL Server-Container in einer Produktionsumgebung erstellen, sollten Sie das Standardkennwort des Systemadministrators ändern.
Schließen Sie die deployment.template.json Datei.
Erstellen Ihrer IoT Edge-Lösung
In den vorherigen Abschnitten haben Sie eine Lösung mit einem Modul erstellt und dann der Bereitstellungsmanifestvorlage eine weitere hinzugefügt. Das SQL Server-Modul wird öffentlich von Microsoft gehostet, Sie müssen den Code jedoch im Funktionsmodul containern. In diesem Abschnitt erstellen Sie die Lösung, erstellen Containerimages für das sqlFunction-Modul und übertragen das Image in die Containerregistrierung.
Öffnen Sie in Visual Studio Code das integrierte Terminal, indem Sie "Terminal anzeigen"> auswählen.
Melden Sie sich bei Ihrer Containerregistrierung in Visual Studio Code an, damit Sie Ihre Bilder an Ihre Registrierung übertragen können. Verwenden Sie die gleichen Azure Container Registry (ACR)-Anmeldeinformationen, die Sie der env-Datei hinzugefügt haben. Geben Sie den folgenden Befehl im integrierten Terminal ein:
docker login -u <ACR username> -p <ACR password> <ACR login server>Möglicherweise wird eine Sicherheitswarnung angezeigt, die die Verwendung des Parameters "--password-stdin" empfiehlt. Während die Verwendung außerhalb des Gültigkeitsbereichs dieses Artikels liegt, empfehlen wir, diese bewährte Methode zu verwenden. Weitere Informationen finden Sie in der Docker-Anmeldebefehlsreferenz .
Klicken Sie im Visual Studio Code-Explorer mit der rechten Maustaste auf die deployment.template.json Datei, und wählen Sie "Build" und "Push IoT Edge"-Lösung aus.
Der Build- und Pushbefehl startet drei Vorgänge. Zunächst wird ein neuer Ordner in der Lösung namens "config " erstellt, der das vollständige Bereitstellungsmanifest enthält, das aus Informationen in der Bereitstellungsvorlage und anderen Lösungsdateien erstellt wird. Zweitens wird das Containerimage basierend auf der entsprechenden Dockerfile-Datei für Ihre Zielarchitektur erstellt
docker build. Anschließend wird es ausgeführtdocker push, um das Image-Repository an Ihre Containerregistrierung zu übertragen.Dieser Vorgang kann mehrere Minuten dauern, ist aber schneller, wenn Sie die Befehle das nächste Mal ausführen.
Sie können überprüfen, ob das sqlFunction-Modul erfolgreich an die Containerregistrierung übertragen wurde. Navigieren Sie im Azure-Portal zu Ihrer Containerregistrierung. Wählen Sie Repositorys aus, und suchen Sie nach sqlFunction. Die anderen beiden Module", "SimulatedTemperatureSensor" und "sql", werden nicht an Ihre Containerregistrierung übertragen, da sich ihre Repositorys bereits in den Microsoft-Registrierungen befinden.
Bereitstellen der Lösung auf einem Gerät
Sie können Module auf einem Gerät über den IoT Hub festlegen, aber Sie können auch über Visual Studio Code auf Ihren IoT Hub und Ihre Geräte zugreifen. In diesem Abschnitt richten Sie den Zugriff auf Ihren IoT Hub ein, und verwenden Sie Dann Visual Studio Code, um Ihre Lösung auf Ihrem IoT Edge-Gerät bereitzustellen.
Erweitern Sie im Visual Studio Code-Explorer unter dem Abschnitt "Azure IoT Hub" "Geräte", um Ihre Liste der IoT-Geräte anzuzeigen.
Klicken Sie mit der rechten Maustaste auf das Gerät, auf das Sie mit Ihrer Bereitstellung abzielen möchten, und wählen Sie "Bereitstellung für einzelnes Gerät erstellen" aus.
Wählen Sie die deployment.amd64.json Datei im Konfigurationsordner aus, und klicken Sie dann auf Edgebereitstellungsmanifest auswählen. Verwenden Sie die deployment.template.json Datei nicht.
Erweitern Sie unter Ihrem Gerät Module , um eine Liste der bereitgestellten und ausgeführten Module anzuzeigen. Klicken Sie auf die Schaltfläche "Aktualisieren". Die neuen SQL - und SQLFunction-Module sollten zusammen mit dem SimulatedTemperatureSensor-Modul und dem $edgeAgent und $edgeHub ausgeführt werden.
Sie können auch überprüfen, ob alle Module auf Ihrem Gerät ausgeführt werden. Führen Sie auf Ihrem IoT Edge-Gerät den folgenden Befehl aus, um den Status der Module anzuzeigen.
iotedge listEs kann einige Minuten dauern, bis die Module beginnen. Die IoT Edge-Laufzeit muss das neue Bereitstellungsmanifest empfangen, die Modulimages aus der Containerlaufzeit herunterziehen und dann jedes neue Modul starten.
Erstellen der SQL-Datenbank
Wenn Sie das Bereitstellungsmanifest auf Ihr Gerät anwenden, werden drei Module ausgeführt. Das SimulatedTemperatureSensor-Modul generiert simulierte Umgebungsdaten. Das sqlFunction-Modul verwendet die Daten und formatiert sie für eine Datenbank. Dieser Abschnitt führt Sie durch das Einrichten der SQL-Datenbank zum Speichern der Temperaturdaten.
Führen Sie die folgenden Befehle auf Ihrem IoT Edge-Gerät aus. Diese Befehle stellen eine Verbindung mit dem sql-Modul her, das auf Ihrem Gerät ausgeführt wird, und erstellen eine Datenbank und Tabelle, um die Temperaturdaten zu speichern, die an das Gerät gesendet werden. Ersetzen Sie <IHR SICHERES KENNWORT> durch das sichere Kennwort, das Sie in Ihrer Verbindungszeichenfolge ausgewählt haben.
Stellen Sie in einem Befehlszeilentool auf Ihrem IoT Edge-Gerät eine Verbindung mit Ihrer Datenbank her.
sudo docker exec -it sql bashÖffnen Sie das SQL-Befehlstool.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YOUR-STRONG-PASSWORD>'Erstellen Sie Ihre Datenbank:
CREATE DATABASE MeasurementsDB ON (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf') GODefinieren Sie Ihre Tabelle.
CREATE TABLE MeasurementsDB.dbo.TemperatureMeasurements (measurementTime DATETIME2, location NVARCHAR(50), temperature FLOAT) GO
Sie können Ihre SQL Server-Docker-Datei anpassen, um Ihren SQL Server automatisch so einzurichten, dass er auf mehreren IoT Edge-Geräten bereitgestellt wird. Weitere Informationen finden Sie im Demoprojekt des Microsoft SQL Server-Containers.
Anzeigen der lokalen Daten
Nachdem Die Tabelle erstellt wurde, beginnt das sqlFunction-Modul mit dem Speichern von Daten in einer lokalen SQL Server 2017-Datenbank auf Ihrem IoT Edge-Gerät.
Führen Sie im SQL-Befehlstool den folgenden Befehl aus, um die formatierten Tabellendaten anzuzeigen:
SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO
Bereinigen von Ressourcen
Wenn Sie den nächsten empfohlenen Artikel fortsetzen möchten, können Sie die von Ihnen erstellten Ressourcen und Konfigurationen beibehalten und wiederverwenden. Sie können auch dasselbe IoT Edge-Gerät wie ein Testgerät verwenden.
Andernfalls können Sie die lokalen Konfigurationen und die Azure-Ressourcen löschen, die Sie in diesem Artikel erstellt haben, um Gebühren zu vermeiden.
Löschen von Azure-Ressourcen
Das Löschen von Azure-Ressourcen und Ressourcengruppen ist unumkehrbar. Achten Sie daher darauf, dass Sie nicht versehentlich die falsche Ressourcengruppe oder die falschen Ressourcen löschen. Wenn Sie den IoT-Hub in einer vorhandenen Ressourcengruppe erstellt haben, die Ressourcen enthält, die Sie behalten möchten, löschen Sie nur die IoT-Hubressource selbst, nicht die Ressourcengruppe.
So löschen Sie die Ressourcen:
Melden Sie sich beim Azure-Portal an, und wählen Sie dann "Ressourcengruppen" aus.
Wählen Sie den Namen der Ressourcengruppe aus, die Ihre IoT Edge-Testressourcen enthält.
Überprüfen Sie die Liste der Ressourcen, die in Ihrer Ressourcengruppe enthalten sind. Wenn Sie alle löschen möchten, können Sie " Ressourcengruppe löschen" auswählen. Wenn Sie nur einige von ihnen löschen möchten, können Sie in jede Ressource klicken, um sie einzeln zu löschen.
In diesem Lernprogramm haben Sie ein Azure Functions-Modul erstellt, das Code zum Filtern von Rohdaten enthält, die von Ihrem IoT Edge-Gerät generiert werden. Wenn Sie bereit sind, eigene Module zu erstellen, erfahren Sie mehr darüber, wie Sie Azure IoT Edge-Module mit Visual Studio Code entwickeln.
Nächste Schritte
Wenn Sie eine andere Speichermethode am Edge ausprobieren möchten, erfahren Sie, wie Sie Azure Blob Storage auf IoT Edge verwenden.