Share via


Öğretici: SQL Server veritabanları ile uç cihazlarda veri depolama

Şunlar için geçerlidir:IoT Edge 1.5 onay işareti IoT Edge 1.5 IoT Edge 1.4 onay işareti IoT Edge 1.4

Önemli

IoT Edge 1.5 LTS ve IoT Edge 1.4 LTS desteklenen sürümlerdir. IoT Edge 1.4 LTS, 12 Kasım 2024'te kullanım ömrü sona erer. Önceki bir sürümdeyseniz bkz. IoT Edge’i güncelleştirme.

Linux kapsayıcıları ile Azure IoT Edge çalıştıran bir cihazda veri depolamak için bir SQL Server modülü dağıtın.

Uç cihazlarda veri depolamak ve sorgulamak için Azure IoT Edge ve SQL Server işlevlerini kullanın. Azure IoT Edge, bir cihaz çevrimdışı olduğunda iletileri önbelleğe almak ve bağlantı yeniden başlatıldığında bunları iletmek için temel depolama özelliklerine sahiptir. Ancak sorgu verilerini yerel ortamda sorgulayabilme gibi daha gelişmiş depolama özelliklerine ihtiyaç duyabilirsiniz. IoT Edge cihazlarınız, IoT Hub bağlantısını sürdürmek zorunda kalmadan daha karmaşık bilgi işlem gerçekleştirmek için yerel veritabanlarını kullanabilir.

Bu makalede bir IoT Edge cihazına SQL Server veritabanı dağıtma yönergeleri yer almaktadır. IoT Edge cihazında çalışan Azure İşlevleri, gelen verileri yapılandırıp veritabanına gönderir. Bu makaledeki adımlar MySQL veya PostgreSQL gibi kapsayıcılarda çalışan diğer veritabanlarına da uygulanabilir.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Visual Studio Code kullanarak Azure İşlevi oluşturma
  • IoT Edge cihazınıza bir SQL veritabanı dağıtma
  • Visual Studio Code uygulamasını kullanarak modülleri derleme ve IoT Edge cihazınıza dağıtma
  • Oluşturulan verileri görüntüleme

Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.

Önkoşullar

Bu öğreticiye başlamadan önce, Linux kapsayıcı geliştirme için geliştirme ortamınızı ayarlamak için önceki öğreticiyi incelemiş olmanız gerekir: Visual Studio Code kullanarak Azure IoT Edge modülleri geliştirme. Bu öğreticiyi tamamladığınızda aşağıdaki önkoşullara sahip olmanız gerekir:

  • Azure'da ücretsiz veya standart katman IoT Hub'ı.
  • Linux kapsayıcıları ile Azure IoT Edge çalıştıran bir AMD64 cihazı. Linux cihazı veya Windows cihazı ayarlamak için hızlı başlangıçları kullanabilirsiniz.
    • Raspberry Pis gibi ARM cihazları SQL Server'ı çalıştıramaz. SQL'i bir ARM cihazında kullanmak istiyorsanız Azure SQL Edge'i kullanabilirsiniz.
  • Azure Container Registry gibi bir kapsayıcı kayıt defteri.
  • Azure IoT Edge ve Azure IoT Hub uzantılarıyla yapılandırılmış Visual Studio Code. Visual Studio Code uzantısı için Azure IoT Edge araçları bakım modundadır.
  • Geliştirme makinenize Docker uyumlu bir kapsayıcı yönetim sistemi indirip yükleyin. Linux kapsayıcılarını çalıştıracak şekilde yapılandırın.

Bu öğreticide SQL Server'a veri göndermek için bir Azure İşlevleri modülü kullanılır. Azure İşlevleri ile bir IoT Edge modülü geliştirmek için geliştirme makinenize aşağıdaki ek önkoşulları yükleyin:

İşlev projesi oluşturma

Bir veritabanına veri göndermek için verileri doğru şekilde yapılandırıp tabloda kaydeden bir modüle ihtiyacınız vardır.

Yeni proje oluşturma

Aşağıdaki adımlarda, Visual Studio Code'u ve Azure IoT Edge uzantısını kullanarak IoT Edge işlevinin nasıl oluşturulduğu gösterilir.

  1. Visual Studio Code'u açın.

  2. Komut paletini Görüntüle'yi seçerek Visual Studio Code komut paletini açın.>

  3. Komut paletinde Azure IoT Edge: New IoT Edge solution komutunu yazıp çalıştırın. Komut paletinde çözümünüzü oluşturmak için aşağıdaki bilgileri girin:

    Alan Değer
    Klasör seçin Çözüm dosyalarını oluşturmak için Visual Studio Code geliştirme makinenizde konumu seçin.
    Çözüm adı sağlayın Çözümünüz için SqlSolution gibi açıklayıcı bir ad girin veya varsayılanı kabul edin.
    Modül şablonunu seçin Azure İşlevleri - C# seçeneğini belirleyin.
    Modül adı sağlayın Modülünüze sqlFunction adını verin.
    Modül için Docker görüntü deposunu sağlama Görüntü deposu, kapsayıcı kayıt defterinizin adını ve kapsayıcı görüntünüzün adını içerir. Kapsayıcı görüntünüz bir önceki adımdaki değerle önceden doldurulur. localhost:5000 değerini Azure kapsayıcı kayıt defterinizdeki Oturum açma sunucusu değeriyle değiştirin. Oturum açma sunucusunu Azure portalındaki kapsayıcı kayıt defterinizin Genel Bakış sayfasından alabilirsiniz.

    Son dize kayıt defteri adı.azurecr.io/sqlfunction> gibi <görünür.

    Ardından Visual Studio Code penceresi IoT Edge çözümü çalışma alanınızı yükler.

Kayıt defteri kimlik bilgilerinizi ekleme

Ortam dosyası, kapsayıcı kayıt defterinizin kimlik bilgilerini depolar ve bu bilgileri IoT Edge çalışma zamanı ile paylaşır. Çalışma zamanı, özel görüntülerinizi IoT Edge cihazına çekmek için bu kimlik bilgilerine ihtiyaç duyar.

IoT Edge uzantısı, kapsayıcı kayıt defteri kimlik bilgilerinizi Azure'dan çekip ortam dosyasında doldurmaya çalışır. Kimlik bilgilerinizin zaten dahil olup olmadığını denetleyin. Yoksa, şimdi ekleyin:

  1. Visual Studio Code gezgininde .env dosyasını açın.
  2. Alanları Azure kapsayıcı kayıt defterinizden kopyaladığınız kullanıcı adı ve parola değerleriyle güncelleştirin.
  3. Bu dosyayı kaydedin.

Not

Bu öğreticide, geliştirme ve test senaryoları için uygun olan Azure Container Registry için yönetici oturum açma kimlik bilgileri kullanılır. Üretim senaryolarına hazır olduğunuzda, hizmet sorumluları gibi en az ayrıcalıklı bir kimlik doğrulama seçeneği öneririz. Daha fazla bilgi için bkz . Kapsayıcı kayıt defterinize erişimi yönetme.

Hedef mimarinizi seçin

Kapsayıcı her mimari türü için farklı şekilde oluşturulduğundan ve çalıştırıldığından, her çözümle hedeflediğiniz mimariyi seçmeniz gerekir. Varsayılan değer Linux AMD64'dür.

  1. Komut paletini açın ve Azure IoT Edge: Edge Çözümü için Varsayılan Hedef Platformu Ayarla'yı arayın veya pencerenin alt kısmındaki yan çubuktaki kısayol simgesini seçin.

  2. Komut paletinde, seçenekler listesinden hedef mimariyi seçin. Bu öğreticide IoT Edge cihazı olarak bir Ubuntu sanal makinesi kullanıyoruz, dolayısıyla varsayılan amd64'ü kullanmaya devam edeceğiz.

Modülü özel kodla güncelleştirme

  1. Visual Studio Code gezgininde sqlFunction sqlFunction.csproj> modüllerini>açın.

  2. Paket başvuruları grubunu bulun ve SqlClient'ı içerecek yeni bir başvuru ekleyin.

    <PackageReference Include="System.Data.SqlClient" Version="4.5.1"/>
    
  3. sqlFunction.csproj dosyasını kaydedin.

  4. sqlFunction.cs dosyasını açın.

  5. Dosyanın tüm içeriğini aşağıdaki kodla değiştirin:

    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. 35. satırda sql bağlantı dizesi> dizesini <aşağıdaki dizeyle değiştirin. Veri Kaynağı özelliği henüz mevcut olmayan SQL Server kapsayıcısını başvurur. Sonraki bölümde SQL adıyla oluşturacaksınız.

    Data Source=tcp:sql,1433;Initial Catalog=MeasurementsDB;User Id=SA;Password=Strong!Passw0rd;TrustServerCertificate=False;Connection Timeout=30;
    
  7. sqlFunction.cs dosyasını kaydedin.

SQL Server kapsayıcısını ekleme

Dağıtım bildirimi, IoT Edge çalışma zamanının hangi modüllerinin IoT Edge cihazınıza yükleneceğini bildirir. Önceki bölümde özelleştirilmiş bir İşlev modülü oluşturmak için kodu sağladınız, ancak SQL Server modülü Azure Market zaten oluşturulmuş ve kullanılabilir durumda. Tek yapmanız gereken IoT Edge çalışma zamanına bunu dahil etmek ve cihazınızda yapılandırmaktır.

  1. Visual Studio Code'da Komut paletini Görüntüle'yi seçerek komut paletini açın.>

  2. Komut paletinde Azure IoT Edge: IoT Edge modülü ekleme komutunu yazın ve çalıştırın. Komut paletinde, yeni bir modül eklemek için aşağıdaki bilgileri sağlayın:

    Alan Değer
    Dağıtım şablonu dosyasını seçin Komut paleti, geçerli çözüm klasörünüzdeki deployment.template.json dosyasını vurgular. Bu dosyayı seçin.
    Modül şablonunu seçin Azure Market Modül'e tıklayın.
  3. Azure IoT Edge modülü marketinde SQL Server Modülü'ni arayın ve seçin.

  4. Tümü küçük harfle olmak üzere modül adını sql olarak değiştirin. Bu ad, sqlFunction.cs dosyasındaki bağlantı dizesi bildirilen kapsayıcı adıyla eşleşir.

  5. Modülü çözümünüze eklemek için İçeri Aktar'ı seçin.

  6. Çözüm klasörünüzde deployment.template.json dosyasını açın.

  7. Modüller bölümünü bulun. Üç modül görmeniz gerekir. SimulatedTemperatureSensor modülü yeni çözümlere varsayılan olarak eklenir ve diğer modüllerinizle birlikte kullanılacak test verilerini sağlar. sqlFunction modülü, başlangıçta oluşturduğunuz ve yeni kodla güncelleştirdiğiniz modüldür. Son olarak sql modülü Azure Market içeri aktarıldı.

    İpucu

    SQL Server modülü, dağıtım bildiriminin ortam değişkenlerinde ayarlanmış bir varsayılan parola ile birlikte gelir. Üretim ortamında bir SQL Server kapsayıcısı oluşturduğunuzda varsayılan sistem yöneticisi parolasını değiştirmeniz gerekir.

  8. deployment.template.json dosyasını kapatın.

IoT Edge çözümünüzü derleyin

Önceki bölümlerde tek modüle sahip bir çözüm oluşturdunuz ve dağıtım bildirimi şablonuna başka bir modül daha eklediniz. SQL Server modülü Microsoft tarafından genel olarak barındırılır, ancak kodu İşlevler modülünde kapsayıcılı hale getirmelisiniz. Bu bölümde çözümü derleyip sqlFunction modülü için kapsayıcı görüntüleri oluşturacak ve görüntüyü kapsayıcı kayıt defterinize göndereceksiniz.

  1. Visual Studio Code'da Görünüm>Terminal'i seçerek tümleşik terminali açın.

  2. Görüntüleri kayıt defterinize gönderebilmeniz için kapsayıcı kayıt defterinizi Visual Studio Code'a ekleyin. .env dosyasına eklediğiniz Azure Container Registry (ACR) kimlik bilgilerini kullanın. Tümleşik terminale aşağıdaki komutu girin:

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

    --password-stdin parametresinin kullanılmasını öneren bir güvenlik uyarısı görebilirsiniz. Bunun kullanımı bu makalenin kapsamında olmasa da bu en iyi yöntemin izlenmesi önerilir. Daha fazla bilgi için docker oturum açma komutu başvurusuna bakın.

  3. Visual Studio Code gezgininde deployment.template.json dosyasına sağ tıklayın ve IoT Edge çözümü oluştur ve gönder'i seçin.

    Derleme ve gönderme komutu üç işlem başlatır. İlk olarak, çözümde, dağıtım şablonundaki ve diğer çözüm dosyalarındaki bilgilerle oluşturulmuş olan tam dağıtım bildirimini tutan yapılandırma adlı yeni bir klasör oluşturur. İkincisi, hedef mimariniz için uygun dockerfile'ı temel alarak kapsayıcı görüntüsünü derlemek için çalışır docker build . Ardından, görüntü deposunu kapsayıcı kayıt defterinize göndermek için çalışır docker push .

    Bu işlem ilk kez birkaç dakika sürebilir, ancak komutları bir sonraki çalıştırmanızda daha hızlıdır.

    sqlFunction modülünün kapsayıcı kayıt defterinize başarıyla gönderildiğini doğrulayabilirsiniz. Azure portalında kapsayıcı kayıt defterinize gidin. Depoları seçin ve sqlFunction araması yapın. SimulatedTemperatureSensor ve sql adlı diğer iki modül, depoları zaten Microsoft kayıt defterlerinde olduğundan kapsayıcı kayıt defterinize gönderilmez.

Çözümü bir cihaza dağıtma

IoT Hub üzerinden bir cihazda modül ayarlayabilirsiniz ancak IoT Hub ve cihazlara Visual Studio Code aracılığıyla da erişebilirsiniz. Bu bölümde IoT Hub'ınıza erişimi ayarlayıp Visual Studio Code kullanarak çözümünüzü IoT Edge cihazınıza dağıtacaksınız.

  1. Visual Studio Code gezginindeki Azure IoT Hub bölümünün altında, IoT cihazları listenizi görmek için Cihazlar'ı genişletin.

  2. Dağıtımınızla hedeflemek istediğiniz cihaza sağ tıklayın ve Tek Cihaz için Dağıtım Oluştur'u seçin.

  3. Yapılandırma klasöründeki deployment.amd64.json dosyasını seçin ve ardından Edge Dağıtım Bildirimi Seç'e tıklayın. deployment.template.json dosyasını kullanmayın.

  4. Dağıtılan ve çalışan modüllerin listesini görmek için cihazınızın altında Modüller'i genişletin. Yenile düğmesine tıklayın. SimulatedTemperatureSensor modülü ve $edgeAgent ve $edgeHub ile birlikte çalışan yeni sqlve sqlFunction modüllerini görmeniz gerekir.

    Tüm modüllerin cihazınızda çalışıp çalışmadığını da kontrol edebilirsiniz. IoT Edge cihazında modüllerin durumunu görmek için aşağıdaki komutu çalıştırın.

    iotedge list
    

    Modüllerin başlatılması birkaç dakika sürebilir. IoT Edge çalışma zamanının yeni dağıtım bildirimini alması, kapsayıcı çalışma zamanından modül görüntülerini çekmesi ve ardından her yeni modülü başlatması gerekir.

SQL veritabanını oluşturma

Dağıtım bildirimini cihazınıza uyguladığınızda üç modül çalışmaya başlar. SimulatedTemperatureSensor modülü, sanal ortam verileri oluşturur. sqlFunction modülü verileri alır ve veritabanı için biçimlendirir. Bu bölüm, sıcaklık verilerini depolamak için kullanılacak SQL veritabanını ayarlama sürecinde size yardımcı olacaktır.

IoT Edge cihazınızda aşağıdaki komutları çalıştırın. Bu komutlar cihazınızda çalışan SQL modülüne bağlanır ve gönderilen sıcaklık verilerini tutmak için bir veritabanı ve tablo oluşturur.

  1. IoT Edge cihazınızdaki bir komut satırı aracında veritabanınıza bağlanın.

    sudo docker exec -it sql bash
    
  2. SQL komut aracını açın.

    /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Strong!Passw0rd'
    
  3. Veritabanınızı oluşturun:

    CREATE DATABASE MeasurementsDB
    ON
    (NAME = MeasurementsDB, FILENAME = '/var/opt/mssql/measurementsdb.mdf')
    GO
    
  4. Tablonuzu tanımlayın.

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

SQL Server Docker dosyanızı özelleştirerek SQL Server örneğinizin birden fazla IoT Edge cihazına otomatik olarak dağıtılmasını sağlayabilirsiniz. Daha fazla bilgi için bkz. Microsoft SQL Server kapsayıcısı demo proje.

Yerel verileri görüntüleme

Tablonuz oluşturulduktan sonra sqlFunction modülü verileri IoT Edge cihazınızdaki yerel bir SQL Server 2017 veritabanında depolamaya başlar.

SQL komut aracında biçimlendirilmiş tablo verilerinizi görüntülemek için aşağıdaki komutu çalıştırın:

SELECT * FROM MeasurementsDB.dbo.TemperatureMeasurements
GO

Yerel veritabanının içeriğini görüntüleme

Kaynakları temizleme

Bir sonraki önerilen makaleye geçmeyi planlıyorsanız, oluşturduğunuz kaynaklarla yapılandırmaları tutabilir ve yeniden kullanabilirsiniz. Aynı IoT Edge cihazını test cihazı olarak kullanmaya devam edebilirsiniz.

Geçmeyecekseniz ücret kesilmesini önlemek için yerel yapılandırmalarınızı ve bu makalede oluşturulan Azure kaynaklarını silebilirsiniz.

Azure kaynaklarını silme

Azure kaynaklarını ve kaynak gruplarını silme işlemi geri alınamaz. Yanlış kaynak grubunu veya kaynakları yanlışlıkla silmediğinizden emin olun. IoT hub'ını tutmak istediğiniz kaynakların yer aldığı mevcut bir kaynak grubunda oluşturduysanız, kaynak grubunu değil yalnızca IoT hub kaynağını silin.

Kaynakları silmek için:

  1. Azure portalında oturum açın ve Kaynak grupları’nı seçin.

  2. IoT Edge test kaynaklarınızı içeren kaynak grubunun adını seçin.

  3. Kaynak grubunuzda bulunan kaynakların listesini gözden geçirin. Tümünü silmek isterseniz Kaynak grubunu sil'i seçebilirsiniz. Kaynakların yalnızca bazılarını silmek istiyorsanız tek tek tıklayarak silebilirsiniz.

Bu öğreticide, IoT Edge cihazınız tarafından oluşturulan ham verileri filtreleme kodunu içeren bir Azure İşlevleri modülü oluşturdunuz. Kendi modüllerinizi oluşturmaya hazır olduğunuzda Visual Studio Code kullanarak Azure IoT Edge modülleri geliştirme hakkında daha fazla bilgi edinebilirsiniz.

Sonraki adımlar

Uçta başka bir depolama yöntemi denemek istiyorsanız IoT Edge'de Azure Blob Depolama kullanma hakkında bilgi edinin.