Tutorial: Menyimpan data di tepi dengan database SQL Server
Berlaku untuk: IoT Edge 1.5
Penting
IoT Edge 1.5 LTS adalah rilis yang didukung. IoT Edge 1.4 LTS adalah akhir masa pakai per 12 November 2024. Jika Anda menggunakan rilis sebelumnya, lihat Memperbarui IoT Edge.
Sebarkan modul SQL Server untuk menyimpan data di perangkat yang menjalankan Azure IoT Edge dengan kontainer Linux.
Gunakan Azure IoT Edge dan SQL Server untuk menyimpan dan mengkueri data di tepi. Azure IoT Edge memiliki kemampuan penyimpanan dasar untuk menyimpan cache pesan jika perangkat offline, lalu meneruskannya saat koneksi tersambung kembali. Namun, Anda mungkin menginginkan kapabilitas penyimpanan yang lebih canggih, seperti dapat mengkueri data secara lokal. Perangkat IoT Edge Anda dapat menggunakan database lokal untuk melakukan komputasi yang lebih kompleks tanpa harus mempertahankan koneksi ke IoT Hub.
Artikel ini menyediakan petunjuk untuk menyebarkan database SQL Server ke perangkat IoT Edge. Azure Functions, yang berjalan di perangkat IoT Edge, menyusun data masuk lalu mengirimkannya ke database. Langkah-langkah dalam artikel ini juga dapat diterapkan ke database lain yang berfungsi dalam kontainer, seperti MySQL atau PostgreSQL.
Dalam tutorial ini, Anda akan mempelajari cara:
- Menggunakan Visual Studio Code untuk membuat Azure Function
- Menyebarkan database SQL ke perangkat IoT Edge
- Menggunakan Visual Studio Code untuk membuat modul dan menyebarkannya ke perangkat IoT Edge Anda
- Melihat data yang dibuat
Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.
Prasyarat
Sebelum memulai tutorial ini, Anda harus telah melalui tutorial sebelumnya untuk menyiapkan lingkungan pengembangan Anda untuk pengembangan kontainer Linux: Mengembangkan modul Azure IoT Edge menggunakan Visual Studio Code. Setelah menyelesaikan tutorial tersebut, Anda akan memiliki prasyarat berikut:
- Tingkat standar atau gratis Azure IoT Hub di Azure.
- Perangkat AMD64 yang menjalankan Azure IoT Edge dengan kontainer Linux. Anda dapat menggunakan mulai cepat untuk menyiapkan perangkat Linux atau perangkat Windows.
- Perangkat ARM, seperti Raspberry Pis, tidak dapat menjalankan SQL Server. Jika ingin menggunakan SQL di perangkat ARM, Anda dapat menggunakan Azure SQL Edge.
- Registri kontainer seperti Azure Container Registry.
- Visual Studio Code dikonfigurasi dengan ekstensi Azure IoT Edge dan Azure IoT Hub . Alat Azure IoT Edge untuk ekstensi Visual Studio Code berada dalam mode pemeliharaan.
- Unduh dan instal sistem manajemen kontainer yang kompatibel dengan Docker di komputer pengembangan Anda. Konfigurasikan untuk menjalankan kontainer Linux.
Tutorial ini menggunakan modul Azure Functions untuk mengirim data ke SQL Server. Untuk mengembangkan modul IoT Edge dengan Azure Functions, instal prasyarat tambahan berikut di komputer pengembangan Anda:
- C# untuk ekstensi Visual Studio Code (didukung oleh OmniSharp) untuk VIsual Studio Code.
- .NET Core SDK.
Buat proyek fungsi
Untuk mengirim data ke dalam database, Anda memerlukan modul yang dapat menyusun data dengan benar lalu menyimpannya dalam tabel.
Membuat proyek baru
Langkah-langkah berikut menunjukkan kepada Anda cara membuat fungsi IoT Edge menggunakan Visual Studio Code dan ekstensi Azure IoT Edge.
Buka Visual Studio Code.
Buka palet perintah Visual Studio Code dengan memilih Tampilkan>palet Perintah.
Di palet perintah, ketik dan jalankan perintah Azure IoT Edge: Solusi IoT Edge baru. Di palet perintah, berikan informasi berikut untuk membuat solusi Anda:
Bidang Nilai Pilih folder Pilih lokasi pada komputer pengembangan Anda untuk Visual Studio Code guna membuat file solusi. Beri nama solusi Masukkan nama deskriptif untuk solusi Anda, seperti SqlSolution, atau terima default-nya. Memilih templat modul Pilih Azure Functions - C#. Beri nama modul Beri nama modul sqlFunction. Sediakan repositori gambar Docker untuk modul tersebut Repositori gambar mencakup nama registri kontainer dan nama gambar kontainer Anda. Gambar kontainer Anda sudah terisi dari langkah terakhir. Ganti localhost:5000 dengan nilai Server masuk dari registri kontainer Azure Anda. Anda dapat mengambil server Masuk dari halaman Gambaran Umum registri kontainer di portal Microsoft Azure.
String akhir terlihat seperti <nama> registri.azurecr.io/sqlfunction.Jendela Visual Studio Code memuat ruang kerja solusi Azure IoT Edge Anda.
Menambahkan informasi masuk registri
File lingkungan menyimpan informasi masuk untuk repositori kontainer Anda dan membagikannya dengan runtime Azure IoT Edge. Runtime memerlukan kredensial ini untuk menyediakan file privat Anda di perangkat IoT Edge.
Ekstensi IoT Edge mencoba menarik kredensial registri kontainer Anda dari Azure dan mengisinya dalam file lingkungan. Periksa untuk melihat apakah info masuk Anda sudah disertakan. Jika belum, tambahkan sekarang:
- Di penjelajah Visual Studio Code, buka file .env.
- Perbarui bidang dengan nilai nama pengguna dan kata sandi yang Anda salin dari registri kontainer Azure Anda.
- Simpan file ini.
Catatan
Tutorial ini menggunakan kredensial masuk admin untuk Azure Container Registry, yang memudahkan pengembangan dan pengujian skenario. Saat Anda siap untuk skenario produksi, kami merekomendasikan opsi autentikasi dengan hak paling rendah seperti perwakilan layanan. Untuk informasi selengkapnya, lihat Kelola akses ke registri kontainer Anda.
Memilih arsitektur target Anda
Anda harus memilih arsitektur mana yang ditargetkan dengan setiap solusi, karena kontainer dibuat dan dijalankan secara berbeda untuk setiap jenis arsitektur. Defaultnya adalah Linux AMD64.
Buka palet perintah dan cari Azure IoT Edge: Tetapkan Platform Target Default untuk Solusi Edge, atau pilih ikon pintasan di bilang samping di bagian bawah jendela.
Di palet perintah, pilih arsitektur target dari daftar opsi. Untuk tutorial ini, gunakan komputer virtual Ubuntu sebagai perangkat IoT Edge, untuk menjadikan amd64 tetap sebagai default.
Memperbarui modul dengan kode kustom
Di penjelajah Visual Studio Code, buka modul>sqlFunction>sqlFunction.csproj.
Cari grup referensi paket, dan tambahkan referensi baru untuk menyertakan SqlClient.
<PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>
Simpan file sqlFunction.csproj.
Buka file sqlFunction.cs.
Ganti seluruh konten file dengan kode berikut:
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;} } }
Di baris 35, ganti string <sql string koneksi> dengan string berikut. Properti Sumber Data mereferensikan kontainer SQL Server, yang belum ada. Anda akan membuatnya dengan nama SQL di bagian berikutnya. Pilih kata sandi yang kuat untuk kata kunci Kata Sandi .
Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=<YOUR-STRONG-PASSWORD>;TrustServerCertificate=False;Connection Timeout=30;
Simpan file sqlFunction.cs.
Menambahkan kontainer SQL Server
Manifes penyebaran mendeklarasikan modul runtime IoT Edge yang akan diinstal di perangkat IoT Edge Anda. Anda menyediakan kode untuk membuat modul Fungsi yang disesuaikan di bagian sebelumnya, tetapi modul SQL Server sudah dibuat dan tersedia di Registri Artefak Microsoft. Anda hanya perlu memberi tahu runtime IoT Edge untuk menyertakannya, lalu mengonfigurasinya di perangkat.
Di Visual Studio Code, buka palet perintah dengan memilih Tampilan>Palet perintah.
Di palet perintah, ketik dan jalankan perintah Azure IoT Edge: Menambahkan modul IoT Edge. Di palet perintah, berikan informasi berikut untuk menambahkan modul baru:
Bidang Nilai Pilih file templat penyebaran Palet perintah menyoroti file deployment.template.json di folder solusi Anda saat ini. Pilih file tersebut. Memilih templat modul Pilih Modul yang Ada (Masukkan URL Gambar Lengkap). Berikan Nama Modul Masukkan sql. Nama ini cocok dengan nama kontainer yang dinyatakan dalam string koneksi dalam file sqlFunction.cs. Menyediakan Gambar Docker untuk Modul Masukkan URI berikut untuk menarik gambar kontainer SQL Server dari Registri Artefak Microsoft. Untuk gambar berbasis Ubuntu, gunakan mcr.microsoft.com/mssql/server:latest
. Untuk gambar berbasis Red Hat Enterprise Linux (RHEL), gunakanmcr.microsoft.com/mssql/rhel/server:latest
.Gambar kontainer Azure SQL Edge adalah versi SQL Server kontainer ringan yang dapat berjalan pada perangkat IoT Edge. Ini dioptimalkan untuk skenario tepi dan dapat berjalan pada perangkat ARM dan AMD64.
Buka file deployment.template.json di folder solusi.
Temukan bagian modul. Anda akan melihat tiga modul. SimulatedTemperatureSensor modul disertakan secara default dalam solusi baru, dan menyediakan data pengujian untuk digunakan dengan modul Anda yang lain. sqlFunction modul adalah modul yang awalnya dibuat dan diperbarui dengan kode baru. Terakhir, modul sql diimpor dari Registri Artefak Microsoft.
Tip
Modul SQL Server dilengkapi dengan kata sandi default yang diatur dalam variabel lingkungan manifes penyebaran. Setiap kali membuat kontainer SQL Server di lingkungan produksi, Anda harus mengubah kata sandi administrator sistem default.
Tutup file deployment.template.json.
Membangun solusi IoT Edge Anda
Di bagian sebelumnya, Anda membuat solusi dengan satu modul, lalu menambahkan modul lain ke templat manifes penyebaran. Modul SQL Server dihosting secara publik oleh Microsoft, tetapi Anda perlu menjalankan kode dalam modul Functions. Di bagian ini, Anda membuat solusi, membuat gambar kontainer untuk modul sqlFunction, dan mendorong gambar ke registri kontainer.
Di Visual Studio Code, buka terminal yang terintegrasi dengan memilih Tampilan>Terminal.
Masuk ke registri kontainer di Visual Studio Code sehingga Anda dapat mendorong gambar ke registri. Gunakan info masuk Azure Container Registry (ACR) yang sama dengan yang Anda tambahkan ke file .env. Masukkan perintah berikut di terminal terpadu:
docker login -u <ACR username> -p <ACR password> <ACR login server>
Anda mungkin melihat peringatan keamanan yang merekomendasikan penggunaan parameter --password-stdin. Meskipun penggunaannya berada di luar cakupan artikel ini, kami sarankan untuk mengikuti praktik terbaik ini. Untuk mengetahui informasi selengkapnya, lihat referensi perintah masuk docker.
Di penjelajah Visual Studio Code, klik kanan file deployment.template.json dan pilih Bangun dan Dorong solusi IoT Edge.
Perintah bangun dan dorong memulai tiga operasi. Pertama, hal ini membuat folder baru dalam solusi yang disebut konfigurasi yang menampung manifes penyebaran penuh, yang dibangun dari informasi dalam templat penyebaran dan file solusi lainnya. Kedua, perintah ini menjalankan
docker build
untuk membangun file kontainer, berdasarkan dockerfile yang sesuai untuk arsitektur target Anda. Kemudian, perintah ini menjalankandocker push
untuk mendorong repositori gambar ke registri kontainer Anda.Proses ini mungkin memakan waktu beberapa menit saat pertama kali, tetapi menjadi lebih cepat saat Anda menjalankan perintah berikutnya.
Anda dapat memverifikasi bahwa modul sqlFunction berhasil didorong ke registri kontainer. Di portal Azure, navigasi ke registri kontainer Anda. Pilih repositori, lalu cari sqlFunction. Dua modul lainnya, SimulatedTemperatureSensor dan sql, tidak akan didorong ke registri kontainer Anda karena repositori mereka sudah ada di registri Microsoft.
Menyebarkan solusi ke perangkat
Anda dapat mengatur modul di perangkat melalui IoT Hub, tetapi Anda juga dapat mengakses IoT Hub dan perangkat melalui Visual Studio Code. Di bagian ini, Anda menyiapkan akses ke IoT Hub, lalu menggunakan Visual Studio Code untuk menyebarkan solusi Anda ke perangkat IoT Edge Anda.
Di penjelajah Visual Studio Code, pada bagian Azure IoT Hub, luaskan Perangkat untuk melihat daftar perangkat IoT Anda.
Klik kanan perangkat yang ingin Anda targetkan dengan penyebaran, lalu pilih Buat Penyebaran untuk Satu Perangkat.
Pilih file deployment.amd64.json di folder config, lalu klik Pilih Manifes Penyebaran Azure Stack Edge. Jangan gunakan file deployment.template.json.
Pada perangkat Anda, luaskan Modul untuk melihat daftar modul yang disebarkan dan berjalan. Klik tombol {i>refreshsql dan sqlFunction baru yang berjalan besama dengan modul SimulatedTemperatureSensor dan $edgeAgent serta $edgeHub.
Anda juga dapat memeriksa untuk melihat bahwa semua modul aktif dan berjalan di perangkat Anda. Pada perangkat Azure IoT Edge Anda, jalankan perintah berikut untuk melihat status modul.
iotedge list
Mungkin perlu beberapa menit untuk memulai modul. Runtime Azure IoT Edge perlu menerima manifes penyebaran barunya, menarik gambar modul dari runtime kontainer, lalu memulai setiap modul baru.
Membuat database SQL
Saat menerapkan manifes penyebaran ke perangkat, Anda membuat tiga modul berjalan. Modul SimulatedTemperatureSensor membuat data lingkungan yang disimulasikan. Modul sqlFunction mengambil data dan memformatnya untuk database. Bagian ini memandu Anda menyiapkan database SQL untuk menyimpan data suhu.
Jalankan perintah berikut di perangkat IoT Edge Anda. Perintah ini tersambung ke modul sql yang berjalan di perangkat dan membuat database serta tabel untuk menyimpan data suhu yang dikirim ke sana. Ganti <YOUR-STRONG-PASSWORD> dengan kata sandi kuat yang Anda pilih di string koneksi Anda.
Di alat baris perintah di perangkat IoT Edge Anda, sambungkan ke database.
sudo docker exec -it sql bash
Buka alat perintah SQL.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YOUR-STRONG-PASSWORD>'
Buat database Anda:
CREATE DATABASE MeasurementsDB ON (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf') GO
Tentukan tabel Anda.
CREATE TABLE MeasurementsDB.dbo.TemperatureMeasurements (measurementTime DATETIME2, location NVARCHAR(50), temperature FLOAT) GO
Anda dapat menyesuaikan file docker SQL Server untuk otomatis menyiapkan SQL Server Anda guna disebarkan di beberapa perangkat IoT Edge. Untuk mengetahui informasi selengkapnya, lihat proyek demo kontainer Microsoft SQL Server.
Menampilkan data lokal
Setelah tabel Anda dibuat, modul sqlFunction mulai menyimpan data dalam database SQL Server 2017 lokal di perangkat IoT Edge Anda.
Dari dalam alat perintah SQL, jalankan perintah berikut untuk menampilkan data tabel Anda yang diformat:
SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO
Membersihkan sumber daya
Jika berencana untuk melanjutkan ke artikel yang disarankan berikutnya, Anda dapat menyimpan sumber daya dan konfigurasi yang Anda buat dan menggunakannya kembali. Anda juga dapat tetap menggunakan perangkat IoT Edge yang sama sebagai perangkat uji.
Atau, Anda dapat menghapus konfigurasi lokal dan sumber daya Azure yang dibuat di artikel ini untuk menghindari biaya.
Menghapus sumber daya Azure
Menghapus sumber daya Azure dan grup sumber daya tidak dapat diubah. Pastikan Anda tidak menghapus grup atau sumber daya yang salah secara tidak sengaja. Jika Anda membuat hub IoT di dalam grup sumber daya yang sudah ada yang berisi sumber daya yang ingin Anda simpan, hapus hanya sumber daya hub IoT itu sendiri, bukan grup sumber daya.
Untuk menghapus sumber daya:
Masuk ke portal Azure, lalu pilih Grup sumber daya.
Pilih nama grup sumber daya yang berisi sumber daya pengujian IoT Edge Anda.
Tinjau daftar sumber daya yang dimuat grup sumber daya Anda. Jika ingin menghapus semuanya, Anda dapat memilih Hapus grup sumber daya. Jika Anda hanya ingin menghapus beberapa dari mereka, Anda dapat memilih setiap sumber daya untuk menghapusnya satu per satu.
Dalam tutorial ini, Anda telah membuat modul Azure Functions yang berisi kode untuk memfilter data mentah yang dibuat oleh perangkat IoT Edge. Saat Anda siap untuk membangun modul Anda sendiri, Anda dapat mempelajari selengkapnya tentang cara Mengembangkan modul Azure IoT Edge menggunakan Visual Studio Code.
Langkah berikutnya
Jika Anda ingin mencoba metode penyimpanan lain di tepi, baca tentang cara menggunakan Azure Blob Storage di IoT Edge.