Öğretici: Visual Studio Code kullanarak IoT Edge modülleri geliştirme

Şunlar için geçerlidir:IoT Edge 1.4 checkmark IoT Edge 1.4

Önemli

IoT Edge 1.4 desteklenen sürümdür. Önceki bir sürümdeyseniz bkz. IoT Edge’i güncelleştirme.

Bu öğreticide ioT Edge cihazına kendi kodunuzu geliştirme ve dağıtma adımları açıklanmıştır. İş mantığınızı uygulayan kodu doğrudan IoT Edge cihazlarınıza dağıtmak için Azure IoT Edge modüllerini kullanabilirsiniz. Linux cihazına kod dağıtma hızlı başlangıcında bir IoT Edge cihazı oluşturdunuz ve Azure Market bir modül dağıttınız.

Bu makale, iki IoT Edge geliştirme aracına yönelik adımları içerir.

  • Azure IoT Edge Geliştirme Aracı komut satırı (CLI). Bu araç geliştirme için tercih edilir.
  • Visual Studio Code uzantısı için Azure IoT Edge araçları. Uzantı bakım modundadır.

Araç sürümünü seçmek için bu makalenin başındaki araç seçici düğmesini kullanın.

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

  • Geliştirme makinenizi ayarlayın.
  • Yeni bir proje oluşturmak için IoT Edge araçlarını kullanın.
  • Projenizi Docker kapsayıcısı olarak derleyin ve bir Azure kapsayıcı kayıt defterinde depolayın.
  • Kodunuzu bir IoT Edge cihazına dağıtın.

Bu öğreticide oluşturduğunuz IoT Edge modülü, cihazınızın oluşturduğu sıcaklık verilerini filtreler. İletileri yalnızca sıcaklık belirtilen bir eşiğin üzerindeyse yukarı yönde gönderir. Bu tür bir analiz, buluta iletilen ve bulutta depolanan veri miktarını azaltmak için yararlıdır.

Önkoşullar

Geliştirme makinesi:

  • Kendi bilgisayarınızı veya sanal makinenizi kullanın.
  • Geliştirme makineniz bir kapsayıcı altyapısı çalıştırmak için iç içe sanallaştırmayı desteklemelidir.
  • Kapsayıcı altyapısı çalıştırabilen çoğu işletim sistemi, Linux cihazları için IoT Edge modülleri geliştirmek için kullanılabilir. Bu öğreticide bir Windows bilgisayarı kullanılır, ancak macOS veya Linux'ta bilinen farklılıklara dikkat edin.
  • Visual Studio Code'u yükleme
  • Azure CLI’yi yükleyin.

Bir Azure IoT Edge cihazı:

  • IoT Edge'i ayrı bir cihazda çalıştırmanız gerekir. Geliştirme makinesi ile IoT Edge cihazı arasındaki bu ayrım gerçek bir dağıtım senaryosunun benzetimini gerçekleştirir ve farklı kavramların ayrı tutulmasına yardımcı olur. Azure'da IoT Edge cihazı oluşturmak için Linux Cihazına kod dağıtma veya IoT Edge özellikli bir VM dağıtmak için Azure Kaynak Şablonu hızlı başlangıç makalesini kullanın.

Bulut kaynakları:

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

İpucu

Visual Studio Code veya Visual Studio 2022'de etkileşimli hata ayıklama yönergeleri için:

Bu öğreticide Visual Studio Code geliştirme adımları öğretilmektedir.

Temel kavramlar

Bu öğreticide IoT Edge modülü geliştirme adımları açıklanmıştır. IoT Edge modülü yürütülebilir kod içeren bir kapsayıcıdır. IoT Edge cihazına bir veya daha fazla modül dağıtabilirsiniz. Modüller algılayıcılardan veri alma, verileri temizleme ve analiz etme veya IoT hub'ına ileti gönderme gibi belirli görevleri gerçekleştirir. Daha fazla bilgi için bkz . Azure IoT Edge modüllerini anlama.

IoT Edge modülleri geliştirirken geliştirme makinesi ile modülün dağıtıldığı hedef IoT Edge cihazı arasındaki farkı anlamak önemlidir. Modül kodunuzu tutmak için oluşturduğunuz kapsayıcının hedef cihazın işletim sistemiyle (OS) eşleşmesi gerekir. Örneğin, en yaygın senaryo, Bir Windows bilgisayarda IoT Edge çalıştıran bir Linux cihazını hedeflemeyi hedefleyen bir modül geliştiren bir kişidir. Bu durumda kapsayıcı işletim sistemi Linux olacaktır. Bu öğreticiyi tamamladığınızda, geliştirme makinesi işletim sistemi ile kapsayıcı işletim sistemi arasındaki farkı aklınızda bulundurun.

İpucu

Windows üzerinde Linux için IoT Edge kullanıyorsanız, senaryonuzdaki hedef cihaz Windows konağı değil Linux sanal makinesidir.

Bu öğretici, Linux kapsayıcıları ile IoT Edge çalıştıran cihazları hedefler. Geliştirme makineniz Linux kapsayıcıları çalıştırdıkça tercih ettiğiniz işletim sistemini kullanabilirsiniz. Linux kapsayıcıları ile geliştirmek için Visual Studio Code kullanmanızı öneririz, bu nedenle bu öğreticide bu kullanılır. İki araç arasında destek farklılıkları olsa da Visual Studio'yu da kullanabilirsiniz.

Aşağıdaki tabloda, Visual Studio Code ve Visual Studio'da Linux kapsayıcıları için desteklenen geliştirme senaryoları listelenmektedir.

Visual Studio Code Visual Studio 2019/2022
Linux cihaz mimarisi Linux AMD64
Linux ARM32v7
Linux ARM64
Linux AMD64
Linux ARM32
Linux ARM64
Azure hizmetleri Azure İşlevleri
Azure Stream Analytics
Azure Machine Learning
Diller C
C#
Java
Node.js
Python
C
C#
Daha fazla bilgi Visual Studio Code için Azure IoT Edge Visual Studio 2019 için Azure IoT Edge Araçları
Visual Studio 2022 için Azure IoT Edge Araçları

Kapsayıcı altyapısını yükleme

IoT Edge modülleri kapsayıcı olarak paketlenir, bu nedenle bunları derlemek ve yönetmek için geliştirme makinenizde Docker uyumlu bir kapsayıcı yönetim sistemine ihtiyacınız vardır. Özellik desteği ve popülerliği nedeniyle Geliştirme için Docker Desktop'ı öneririz. Windows'da Docker Desktop, Farklı IoT Edge cihaz türleri için modüller geliştirebilmeniz için Linux kapsayıcıları ile Windows kapsayıcıları arasında geçiş yapmanıza olanak tanır.

Geliştirme makinenize yüklemek için Docker belgelerini kullanın:

Araçları ayarlama

IoT Edge çözümünüzü oluşturmak için Python tabanlı Azure IoT Edge Geliştirme Aracı'nı yükleyin. İki seçenek vardır:

Önemli

Visual Studio Code uzantısı için Azure IoT Edge araçları bakım modundadır. Tercih edilen geliştirme aracı, komut satırı (CLI) Azure IoT Edge Geliştirme Aracı'dır.

Visual Studio Code için IoT uzantılarını kullanarak IoT Edge modülleri geliştirin. Bu uzantılar proje şablonları sunar, dağıtım bildiriminin oluşturulmasını otomatikleştirir ve IoT Edge cihazlarını izlemenize ve yönetmenize olanak tanır. Bu bölümde Visual Studio Code'u ve IoT uzantısını yükleyecek, ardından Azure hesabınızı Visual Studio Code'un içinden IoT Hub kaynaklarını yönetecek şekilde ayarlamış olacaksınız.

  1. Azure IoT Edge uzantısını yükleyin.

  2. Azure IoT Hub uzantısını yükleyin.

  3. Uzantıları yükledikten sonra Komut Paletini Görüntüle'yi seçerek komut paletini açın.>

  4. Komut paletinde yeniden Azure IoT Hub'ı arayın ve seçin : IoT Hub'ı seçin. Azure aboneliğinizi ve IoT Hub'ınızı seçmek için istemleri izleyin.

  5. Soldaki etkinlik çubuğundaki simgeyi seçerek veya Görünüm>Gezgini'ni seçerek Visual Studio Code'un gezgin bölümünü açın.

  6. Gezgin bölümünün en altında daraltılmış Azure IoT Hub / Cihazlar menüsünü genişletin. Komut paleti aracılığıyla seçtiğiniz IoT Hub ile ilişkili cihazları ve IoT Edge cihazlarını görmeniz gerekir.

Dile özgü araçları yükleme

Geliştirmekte olduğunuz dile özgü araçları yükleyin:

Kapsayıcı kayıt defteri oluşturma

Bu öğreticide Azure IoT Edge ve Azure IoT Hub uzantılarını kullanarak bir modül oluşturacak ve dosyalardan bir kapsayıcı görüntüsü oluşturacaksınız. Ardından bu görüntüyü, görüntülerinizin depolandığı ve yönetildiği kayıt defterine gönderirsiniz. Son olarak, görüntünüzü IoT Edge cihazınızda çalıştırmak üzere kayıt defterinizden dağıtırsınız.

Önemli

Azure IoT Edge Visual Studio Code uzantısı bakım modundadır.

Kapsayıcı görüntülerinizi tutmak için Docker uyumlu herhangi bir kayıt defterini kullanabilirsiniz. İki popüler Docker kayıt defteri hizmeti Azure Container Registry ve Docker Hub'dır. Bu öğreticide Azure Container Registry kullanılır.

Henüz bir kapsayıcı kayıt defteriniz yoksa Azure'da yeni bir kayıt defteri oluşturmak için şu adımları izleyin:

  1. Azure portalında, Kaynak oluştur>Kapsayıcılar>Container Registry'yi seçin.

  2. Kapsayıcı kayıt defterinizi oluşturmak için aşağıdaki gerekli değerleri sağlayın:

    Alan Değer
    Abonelik Açılan listeden bir abonelik seçin.
    Kaynak grubu IoT Edge hızlı başlangıçları ve öğreticileri sırasında oluşturduğunuz tüm test kaynakları için aynı kaynak grubunu kullanın. Örneğin, IoTEdgeResources.
    Kayıt defteri adı Benzersiz bir ad girin.
    Konum Size yakın bir konum seçin.
    SKU Temel'i seçin.
  3. Gözden geçir ve oluştur'u ve ardından Oluştur'u seçin.

  4. Yeni kapsayıcı kayıt defterinizi Azure portalınızın giriş sayfasının Kaynaklar bölümünden seçerek açın.

  5. Kapsayıcı kayıt defterinizin sol bölmesinde, Ayarlar altında bulunan menüden Erişim anahtarları'nı seçin.

    Screenshot of the Access Keys menu location.

  6. İki durumlu düğmeyle Yönetici kullanıcıyı etkinleştirin ve kapsayıcı kayıt defteriniz için Kullanıcı Adı ve Parola'yı görüntüleyin.

  7. Oturum açma sunucusu, Kullanıcı adı ve parola değerlerini kopyalayın ve uygun bir yere kaydedin. Kapsayıcı kayıt defterine erişim sağlamak için bu öğretici boyunca bu değerleri kullanırsınız.

Yeni modül projesi oluşturma

Azure IoT Edge uzantısı, Visual Studio Code'da desteklenen tüm IoT Edge modül dilleri için proje şablonları sunar. Bu şablonlar, IoT Edge'i test etmek için bir çalışma modülü dağıtmanız veya şablonu kendi iş mantığınızla özelleştirmeniz için bir başlangıç noktası sunmanız için ihtiyacınız olan tüm dosyalara ve kodlara sahiptir.

Proje şablonu oluşturma

IoT Edge Geliştirme Aracı, Azure IoT Edge geliştirmesini ortam değişkenleri tarafından yönetilen komutlara göre basitleştirir. IoT Edge Geliştirme Kapsayıcısı ve varsayılan modüle ve gerekli tüm yapılandırma dosyalarına sahip IoT Edge çözüm iskelesi ile IoT Edge geliştirmesine başlamanızı sağlar.

  1. Çözümünüz için seçtiğiniz yolla bir dizin oluşturun. Dizininize iotedgesolution geçin.

    mkdir c:\dev\iotedgesolution
    cd c:\dev\iotedgesolution
    
  2. Bir çözüm oluşturmak ve Azure IoT Hub'ınızı istediğiniz geliştirme dilinde ayarlamak için iotedgedev solution init komutunu kullanın.

    iotedgedev solution init --template csharp
    

iotedgedev çözümü init betiği aşağıdakiler gibi birkaç adımı tamamlamanızı ister:

  • Azure'da kimlik doğrulaması
  • Azure aboneliği seçme
  • Kaynak grubu seçme veya oluşturma
  • Azure IoT Hub'ı seçme veya oluşturma
  • Azure IoT Edge cihazı seçme veya oluşturma

Visual Studio Code ve Azure IoT Edge uzantısını kullanın. Bir çözüm oluşturarak ve ardından bu çözümdeki ilk modülü oluşturarak başlarsınız. Her çözüm birden çok modül içerebilir.

  1. Komut Paleti Görüntüle'yi>seçin.
  2. Komut paletinde Azure IoT Edge: Yeni IoT Edge Çözümü komutunu girin ve çalıştırın.
  3. Yeni çözümü oluşturmak istediğiniz klasöre göz atın ve ardından Klasör seç'i seçin.
  4. Çözümünüz için bir ad girin.
  5. Çözümdeki ilk modül olmak için tercih ettiğiniz geliştirme dili için bir modül şablonu seçin.
  6. Modülünüz için bir ad girin. Kapsayıcı kayıt defterinizde benzersiz bir ad seçin.
  7. Modülün görüntü deposunun adını belirtin. Visual Studio Code, modül adını localhost:5000/<modül adınız> ile otomatik olarak doldurulur. Bunu kendi kayıt defteri bilgilerinizle değiştirin. Test için yerel bir Docker kayıt defteri kullanıyorsanız localhost kullanın. Azure Container Registry kullanıyorsanız kayıt defterinizin ayarlarından Oturum açma sunucusunu kullanın. Oturum açma sunucusu kayıt defteri adı.azurecr.io> gibi <görünür. Dizenin localhost:5000 bölümünü yalnızca değiştirerek son sonucun kayıt defteri adı.azurecr.io/<> modül adınız> gibi <görünmesini sağlayın.

Visual Studio Code sağladığınız bilgileri alır, bir IoT Edge çözümü oluşturur ve ardından yeni bir pencerede yükler.

Çözüm oluşturulduktan sonra bu ana dosyalar çözümde bulunur:

  • .vscode klasörü launch.json yapılandırma dosyası içerir.

  • Her modül için alt klasörleri olan bir modules klasörü. Her modülün alt klasöründe, module.json dosyası modüllerin nasıl derlenip dağıtılıp dağıtılma şeklini denetler.

  • Bir .env dosyası, ortam değişkenlerinizi listeler. Kapsayıcı kayıt defteri için ortam değişkeni varsayılan olarak localhost:5000'dir.

  • deployment.template.json adlı iki modül dağıtım dosyası ve deployment.debug.template.json cihazınıza dağıtılacak modülleri listeler. Varsayılan olarak, liste IoT Edge sistem modüllerini (edgeAgent ve edgeHub) ve aşağıdakiler gibi örnek modülleri içerir:

    Not

    Tam olarak yüklenen modüller seçtiğiniz dile bağlı olabilir.

IoT Edge çalışma zamanı sürümünü ayarlama

En son kararlı IoT Edge sistem modülü sürümü 1.4'dür. Sistem modüllerinizi sürüm 1.4 olarak ayarlayın.

  1. Visual Studio Code'da deployment.template.json dağıtım bildirim dosyasını açın. Dağıtım bildirimi , hedeflenen IoT Edge cihazında yapılandırılacak modülleri açıklayan bir JSON belgesidir.

  2. edgeAgent ve edgeHub sistem çalışma zamanı modülü görüntülerinin çalışma zamanı sürümünü değiştirin. Örneğin, IoT Edge çalışma zamanı 1.4 sürümünü kullanmak istiyorsanız dağıtım bildirim dosyasında aşağıdaki satırları değiştirin:

    "systemModules": {
        "edgeAgent": {
    
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
    
        "edgeHub": {
    
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
    

IoT Edge aracısına kayıt defteri kimlik bilgilerinizi sağlayın

Ortam dosyası, kapsayıcı kayıt defterinizin kimlik bilgilerini depolar ve bu bilgileri IoT Edge çalışma zamanı ile paylaşır. Çalışma zamanı, kapsayıcı 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.

Not

Ortam dosyası yalnızca modül için bir görüntü deposu sağlarsanız oluşturulur. Yerel olarak test etmek ve hatalarını ayıklamak için localhost varsayılanlarını kabul ettiyseniz, ortam değişkenlerini bildirmeniz gerekmez.

Kimlik bilgilerinizin mevcut olup olmadığını denetleyin. Yoksa, şimdi ekleyin:

  1. Kayıt defteriniz Azure Container Registry ise bir Azure Container Registry kullanıcı adı ve parolası ayarlayın. Azure portalında kapsayıcı kayıt defterinizin Ayarlar> Access anahtarları menüsünden bu değerleri alın.

  2. Modül çözümünüzde .env dosyasını açın.

  3. Azure kapsayıcı kayıt defterinizden kopyaladığınız kullanıcı adı ve parola değerlerini ekleyin. Örneğin:

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<registry_password>"
    
  4. Değişikliklerinizi .env dosyasına 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ı veya depo kapsamlı belirteçler 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 mimari

Kapsayıcının oluşturulma ve çalışma şeklini etkilediğinden, her çözümle hedeflediğiniz mimariyi seçmeniz gerekir. Varsayılan değer Linux AMD64'dür. Bu öğreticide IoT Edge cihazı olarak bir Ubuntu sanal makinesi kullanıyoruz ve varsayılan amd64'ü kullanıyoruz.

Çözümünüz için hedef mimariyi değiştirmeniz gerekiyorsa aşağıdaki adımları kullanın.

  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.

Hedef mimari, kapsayıcı görüntüsünü sonraki bir adımda oluşturduğunuzda ayarlanır.

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

Her şablon, SimulatedTemperatureSensor modülünden simülasyon algılayıcı verilerini alan ve IoT hub'ına yönlendiren örnek kod içerir. Örnek modül iletileri alır ve sonra bunları geçirir. İşlem hattı işlevi IoT Edge'de modüllerin birbirleriyle nasıl iletişim kurduğunu gösteren önemli bir kavramı gösterir.

Her modülün kodunda birden çok giriş ve çıkış kuyruğu bildirilebilir. Cihazda çalışan IoT Edge hub'ı, bir modülün çıkışındaki iletileri bir veya daha fazla modülün girişine yönlendirir. Girişleri ve çıkışları bildirmeye yönelik özel kod diller arasında farklılık gösterir, ancak kavram tüm modüllerde aynıdır. Modüller arasında yönlendirme hakkında daha fazla bilgi için bkz . Yolları bildirme.

Proje şablonuyla birlikte gelen örnek C# kodu, .NET için IoT Hub SDK'sından ModuleClient Sınıfını kullanır.

  1. Visual Studio Code gezgininde modülleri>filtermodule>ModuleBackgroundService.cs açın.

  2. Filtermodule ad alanının önüne daha sonra kullanılan türler için using deyimleri ekleyin:

    using System.Collections.Generic;     // For KeyValuePair<>
    using Microsoft.Azure.Devices.Shared; // For TwinCollection
    using Newtonsoft.Json;                // For JsonConvert
    
  3. temperatureThreshold değişkenini ModuleBackgroundService sınıfına ekleyin. Bu değişken, IoT Hub'a verilerin gönderilmesi için ölçülen sıcaklığın aşması gereken değeri ayarlar.

    static int temperatureThreshold { get; set; } = 25;
    
  4. MessageBody, Machine ve Ambient sınıflarını ekleyin. Bu sınıflar gelen iletilerin gövdesi için beklenen şemayı tanımlar.

    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;}
    }
    
  5. ExecuteAsync işlevini bulun. Bu işlev, modülün ileti göndermek ve almak için yerel Azure IoT Edge çalışma zamanına bağlanmasına olanak tanıyan bir ModuleClient nesnesi oluşturur ve yapılandırılır. ModuleClient nesnesi oluşturulduktan sonra, kod modül ikizinin istenen özelliklerinden temperatureThreshold değerini okur. Kod, ioT Edge hub'ından input1 adlı uç nokta aracılığıyla ileti almak için bir geri çağırma kaydeder.

    ProcessMessageAsync yöntemine yapılan çağrıyı, uç noktanın adını ve giriş geldiğinde çağrılan yöntemi güncelleştiren yeni bir yöntemle değiştirin. Ayrıca, istenen özelliklere yönelik güncelleştirmeler için bir SetDesiredPropertyUpdateCallbackAsync yöntemi ekleyin. Bu değişikliği yapmak için ExecuteAsync yönteminin son satırını aşağıdaki kodla değiştirin:

    // Register a callback for messages that are received by the module.
    // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken);
    
    // Read the TemperatureThreshold value from the module twin's desired properties
    var moduleTwin = await _moduleClient.GetTwinAsync();
    await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient);
    
    // Attach a callback for updates to the module twin's desired properties.
    await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null);
    
    // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method.
    await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);
    
  6. onDesiredPropertiesUpdate yöntemini ModuleBackgroundService sınıfına ekleyin. Bu yöntem modül ikizinin istenen özellikleri üzerinde yapılan güncelleştirmeleri alır ve temperatureThreshold değişkenini buna göre güncelleştirir. Tüm modüllerin, doğrudan buluttan bir modülün içinde çalışan kodu yapılandırmanıza izin veren kendi modül ikizi vardır.

    static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext)
    {
        try
        {
            Console.WriteLine("Desired property change:");
            Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    
            if (desiredProperties["TemperatureThreshold"]!=null)
                temperatureThreshold = desiredProperties["TemperatureThreshold"];
    
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error when receiving desired property: {0}", exception);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error when receiving desired property: {0}", ex.Message);
        }
        return Task.CompletedTask;
    }
    
  7. FilterMessages yöntemini ekleyin. Modül IoT Edge hub'ından bir ileti aldığında bu yöntem çağrılır. Modül ikizi aracılığıyla ayarlanan sıcaklık eşiğinin altındaki sıcaklıkları rapor eden iletileri filtreler. Ayrıca iletiye MessageType özelliğini ekleyip değerini Alert olarak ayarlar.

    async Task<MessageResponse> FilterMessages(Message message, object userContext)
    {
        var counterValue = Interlocked.Increment(ref _counter);
        try
        {
            ModuleClient moduleClient = (ModuleClient)userContext;
            var messageBytes = message.GetBytes();
            var messageString = Encoding.UTF8.GetString(messageBytes);
            Console.WriteLine($"Received message {counterValue}: [{messageString}]");
    
            // Get the message body.
            var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
            if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
            {
                Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " +
                    $"exceeds threshold {temperatureThreshold}");
                using (var filteredMessage = new Message(messageBytes))
                {
                    foreach (KeyValuePair<string, string> prop in message.Properties)
                    {
                        filteredMessage.Properties.Add(prop.Key, prop.Value);
                    }
    
                    filteredMessage.Properties.Add("MessageType", "Alert");
                    await moduleClient.SendEventAsync("output1", filteredMessage);
                }
            }
    
            // Indicate that the message treatment is completed.
            return MessageResponse.Completed;
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error in sample: {0}", exception);
            }
            // Indicate that the message treatment is not completed.
            var moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
            // Indicate that the message treatment is not completed.
            ModuleClient moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
    }
    
  8. ModuleBackgroundService.cs dosyasını kaydedin.

  9. Visual Studio Code gezgininde IoT Edge çözüm çalışma alanınızda deployment.template.json dosyasını açın.

  10. Modülün dinlediği uç noktanın adını değiştirdiğimizden, edgeHub'ın yeni uç noktaya ileti göndermesi için dağıtım bildirimindeki yolları da güncelleştirmemiz gerekir.

    $edgeHub modül ikizinde yollar bölümünü bulun. sensorTofiltermodule yolunu ile inputFromSensordeğiştirecek input1 şekilde güncelleştirin:

    "sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"
    
  11. Dağıtım bildirimine filtermodule modül ikizini ekleyin. Aşağıdaki JSON içeriğini modulesContent bölümünün en altına, $edgeHub modül ikizinden sonra ekleyin:

       "filtermodule": {
           "properties.desired":{
               "TemperatureThreshold":25
           }
       }
    
  12. deployment.template.json dosyasını kaydedin.

Çözümünüzü oluşturma ve gönderme

Bazı önemli dağıtım kavramlarını anlamanıza yardımcı olması için modül kodunu ve dağıtım şablonunu güncelleştirmişsiniz. Artık modül kapsayıcı görüntünüzü oluşturmaya ve kapsayıcı kayıt defterinize göndermeye hazırsınız.

Visual Studio Code'da deployment.template.json dağıtım bildirim dosyasını açın. Dağıtım bildirimi , hedeflenen IoT Edge cihazında yapılandırılacak modülleri açıklar. Dağıtımdan önce Azure Container Registry kimlik bilgilerinizi ve modül görüntülerinizi uygun createOptions değerlerle güncelleştirmeniz gerekir. createOption değerleri hakkında daha fazla bilgi için bkz . IoT Edge modülleri için kapsayıcı oluşturma seçeneklerini yapılandırma.

Modül görüntünüzü depolamak için Azure Container Registry kullanıyorsanız kimlik bilgilerinizi deployment.template.json'deki modulesContent>edgeAgent>settings>registryCredentials bölümüne ekleyin. myacr değerini kendi kayıt defteri adınızla değiştirin ve parolanızı ve Oturum açma sunucusu adresinizi belirtin. Örneğin:

"registryCredentials": {
    "myacr": {
        "username": "myacr",
        "password": "<your_acr_password>",
        "address": "myacr.azurecr.io"
    }
}

Listelenen her sistem (edgeHub ve edgeAgent) ve özel modül (filtermodule ve tempSensor) için createOptions değerine aşağıdaki dizeli içeriği ekleyin veya değiştirin. Gerekirse değerleri değiştirin.

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"

Örneğin, filtermodule yapılandırması şuna benzer olmalıdır:

"filtermodule": {
"version": "1.0",
"type": "docker",
"status": "running",
"restartPolicy": "always",
"settings": {
   "image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
   "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
}

Derleme modülü Docker görüntüsü

Terminal>Yeni Terminal'i seçerek Visual Studio Code tümleşik terminalini açın.

dotnet publish Linux ve amd64 mimarisi için kapsayıcı görüntüsünü derlemek için komutunu kullanın. Dizini projenizdeki filtermodule diziniyle değiştirin ve dotnet publish komutunu çalıştırın.

dotnet publish --os linux --arch x64 /t:PublishContainer

Şu anda iotedgedev araç şablonu .NET 7.0'ı hedeflemektedir. Farklı bir .NET sürümünü hedeflemek istiyorsanız filtermodule.csproj dosyasını düzenleyebilir ve TargetFramework ve PackageReference değerlerini değiştirebilirsiniz. Örneğin, .NET 8.0'ı hedeflemek için filtermodule.csproj dosyanız şu şekilde görünmelidir:

<Project Sdk="Microsoft.NET.Sdk.Worker">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    </ItemGroup>
</Project>

Docker görüntüsünü kapsayıcı kayıt defteri bilgileriniz, sürümünüz ve mimarinizle etiketleyin. myacr değerini kendi kayıt defteri adınızla değiştirin.

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64

Gönderme modülü Docker görüntüsü

Kapsayıcı görüntünüzü kayıt defterindeki depolama alanına gönderebilmesi için docker'a kapsayıcı kayıt defteri kimlik bilgilerinizi sağlayın.

  1. Azure Container Registry (ACR) kimlik bilgileriyle Docker'da oturum açın.

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

    kullanılmasını --password-stdinöneren bir güvenlik uyarısı alabilirsiniz. Bu, üretim senaryoları için önerilen en iyi yöntem olsa da, bu öğreticinin kapsamı dışındadır. Daha fazla bilgi için docker oturum açma başvurusuna bakın.

  2. Azure Container Registry'de oturum açın. komutunu kullanmak için Azure CLI'yiaz yüklemeniz gerekir. Bu komut, Ayarlar> Access anahtarlarında kapsayıcı kayıt defterinizde bulunan kullanıcı adınızı ve parolanızı ister.

    az acr login -n <ACR registry name>
    

    İpucu

    Bu öğreticinin herhangi bir noktasında oturumunuz kapatılırsa devam etmek için Docker ve Azure Container Registry oturum açma adımlarını yineleyin.

  3. Modül görüntünüzü yerel kayıt defterine veya kapsayıcı kayıt defterine gönderin .

    docker push <ImageName>
    

    Örneğin:

    # Push the Docker image to the local registry
    
    docker push localhost:5000/filtermodule:0.0.1-amd64
    
    # Or push the Docker image to an Azure Container Registry. Replace myacr with your Azure Container Registry name.
    
    az acr login --name myacr
    docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
    

Dağıtım şablonunu güncelleştirme

Dağıtım şablonu deployment.template.json kapsayıcı kayıt defteri görüntü konumuyla güncelleştirin. Örneğin, Azure Container Registry myacr.azurecr.io kullanıyorsanız ve görüntünüz filtermodule:0.0.1-amd64 ise filtermodule yapılandırmasını şu şekilde güncelleştirin:

"filtermodule": {
    "version": "1.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
}

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ş 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.

İsteğe bağlı: Modülü ve görüntüyü güncelleştirme

Modül kodunuzda değişiklik yaparsanız, modül görüntüsünü yeniden oluşturup kapsayıcı kayıt defterinize göndermeniz gerekir. Derleme ve kapsayıcı görüntüsünü güncelleştirmek için bu bölümdeki adımları kullanın. Modül kodunuzda değişiklik yapmadıysanız bu bölümü atlayabilirsiniz.

yeni oluşturulan yapılandırma klasöründe deployment.amd64.json dosyasını açın. Dosya adı hedef mimariyi yansıtır, bu nedenle farklı bir mimari seçtiyseniz farklı olur.

Yer tutucuları olan iki parametrenin artık uygun değerlerini içerdiğine dikkat edin. registryCredentials bölümünde kayıt defteri kullanıcı adınız ve parolanız .env dosyasından çekilmiştir. Filtermodule, module.json dosyasındaki ad, sürüm ve mimari etiketine sahip tam görüntü deposuna sahiptir.

  1. filtermodule klasöründeki module.json dosyasını açın.

  2. Modül görüntüsünün sürüm numarasını değiştirin. Örneğin, modül kodunda küçük bir düzeltme yapmış gibi düzeltme eki sürüm numarasını "version": "0.0.2" olarak artırabilirsiniz.

    İpucu

    Modül sürümleri sürüm denetimini etkinleştirir ve güncelleştirmeleri üretime dağıtmadan önce küçük bir cihaz kümesinde değişiklikleri test etmenizi sağlar. Derlemeden ve göndermeden önce modül sürümünü artırmazsanız kapsayıcı kayıt defterinizdeki deponun üzerine yazarsınız.

  3. Değişikliklerinizi module.json dosyasına kaydedin.

Güncelleştirilmiş görüntüyü 0.0.2 sürüm etiketiyle derleyin ve gönderebilirsiniz. Örneğin, yerel kayıt defteri veya Azure kapsayıcı kayıt defteri için görüntüyü derlemek ve göndermek için aşağıdaki komutları kullanın:


# Build the container image for Linux and amd64 architecture.

dotnet publish --os linux --arch x64

# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.

docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64

# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64

deployment.template.json dosyasına yeniden sağ tıklayın ve yeniden IoT Edge Çözümü Oluştur ve Gönder'i seçin.

deployment.amd64.json dosyasını yeniden açın. Derleme ve gönderme komutunu yeniden çalıştırdığınızda derleme sisteminin yeni bir dosya oluşturmadığı dikkat edin. Bunun yerine, aynı dosya değişiklikleri yansıtacak şekilde güncelleştirilir. Filtermodule görüntüsü artık kapsayıcının 0.0.2 sürümünü gösterir.

Derleme ve gönderme komutunun ne yaptığını daha fazla doğrulamak için Azure portalına gidin ve kapsayıcı kayıt defterinize gidin.

Kapsayıcı kayıt defterinizde Depolar'ı ve ardından filtermodule öğesini seçin. Görüntünün her iki sürümünün de kayıt defterine gönderildiğini doğrulayın.

Screenshot of where to view both image versions in your container registry.

Sorun giderme

Modül görüntünüzü oluştururken ve gönderdiğinizde hatalarla karşılaşırsanız, bunun genellikle geliştirme makinenizdeki Docker yapılandırmasıyla ilgili olması gerekir. Yapılandırmanızı gözden geçirmek için aşağıdaki denetimleri kullanın:

  • Kapsayıcı kayıt defterinizden kopyaladığınız kimlik bilgilerini kullanarak komutu çalıştırdınız docker login mı? Bu kimlik bilgileri, Azure'da oturum açmak için kullandığınız kimlik bilgilerinden farklıdır.
  • Kapsayıcı deponuz doğru mu? Doğru kapsayıcı kayıt defteri adınız ve doğru modül adınız var mı? Denetlemek için filtermodule klasöründeki module.json dosyasını açın. Depo değeri, kayıt defteri adı.azurecr.io/filtermodule> gibi <görünmelidir.
  • Modülünüz için filtermodule'den farklı bir ad kullandıysanız bu ad çözüm genelinde tutarlı mı?
  • Makineniz, oluşturduğunuz kapsayıcı türüyle aynı türde mi çalışıyor? Bu öğretici Linux IoT Edge cihazlarına yöneliktir, bu nedenle Visual Studio Code yan çubukta amd64 veya arm32v7 demelidir ve Docker Desktop Linux kapsayıcıları çalıştırıyor olmalıdır.

Modüller cihaza dağıtılır

Kapsayıcı kayıt defterinizde depolanan yerleşik kapsayıcı görüntüleri olduğunu doğruladınız, bu nedenle bunları bir cihaza dağıtmanın zamanı geldi. IoT Edge cihazınızın çalışır durumda olduğundan emin olun.

Modülleri Azure IoT Hub'a dağıtmak için IoT Edge Azure CLI set-modules komutunu kullanın. Örneğin, deployment.template.json dosyasında tanımlanan modülleri IoT Edge cihazı my-device için IoT Hub my-iot-hub'a dağıtmak için aşağıdaki komutu kullanın. Hub-name, device-id ve login IoT Hub bağlantı dizesi değerlerini kendi değerlerinizle değiştirin.

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

İpucu

Paylaşılan erişim anahtarı dahil olmak üzere IoT Hub bağlantı dizesi Azure portalında bulabilirsiniz. IoT Hub >Güvenlik ayarları>Paylaşılan erişim ilkeleri>iothubowner'ınıza gidin.

  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ğıtmak istediğiniz IoT Edge cihazına sağ tıklayın ve ardından Tek Cihaz için Dağıtım Oluştur'u seçin.

  3. Dosya gezgininde yapılandırma klasörüne gidin ve deployment.amd64.json dosyasını seçin.

    kapsayıcı kayıt defteri kimlik bilgilerine veya modül görüntüsü değerlerine sahip olmayan deployment.template.json dosyasını kullanmayın. Bir Linux ARM32 cihazını hedeflerseniz dağıtım bildiriminin adı deployment.arm32v7.json.

  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üğmesini seçin. Cihazınızda yeni tempSensor ve filtermodule modüllerinin çalıştığını görmeniz gerekir.

    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.

Cihazdan iletileri görüntüleme

Örnek modül kodu, giriş kuyruğu aracılığıyla iletileri alır ve bunları çıkış kuyruğu boyunca geçirir. Dağıtım bildirimi, tempSensor'dan filtermodule'a iletilen ve ardından filtermodule'denIoT Hub'a iletilen iletilerin yollarını bildirdi. Azure IoT Edge ve Azure IoT Hub uzantıları, tek tek cihazlarınızdan IoT Hub'a ulaşan iletileri görmenizi sağlar.

  1. Visual Studio Code gezgininde, izlemek istediğiniz IoT Edge cihazına sağ tıklayın ve ardından Yerleşik Olay Uç Noktasını İzlemeyi Başlat'ı seçin.

  2. IoT hub'ınıza gelen iletileri görmek için Visual Studio Code'daki çıkış penceresini izleyin.

    Screenshot showing where to view incoming device to cloud messages.

Değişiklikleri cihazda görüntüleme

Cihazınızda neler olduğunu görmek istiyorsanız, ioT Edge çalışma zamanını ve cihazınızda çalışan modülleri incelemek için bu bölümdeki komutları kullanın.

Bu bölümdeki komutlar geliştirme makinenize değil IoT Edge cihazınıza yönelik olarak sağlanır. IoT Edge cihazınız için bir sanal makine kullanıyorsanız şimdi bu makineye bağlanın. Azure'da sanal makinenin genel bakış sayfasına gidin ve güvenli kabuk bağlantısına erişmek için Bağlan seçin.

  • Cihazınıza dağıtılan tüm modülleri görüntüleyin ve durumlarını denetleyin:

    iotedge list
    

    Dört modül görmeniz gerekir: iki IoT Edge çalışma zamanı modülü, tempSensor ve filtermodule. Dördü de çalışıyor olarak listelenmiş olmalıdır.

  • Belirli bir modülün günlüklerini inceleyin:

    iotedge logs <module name>
    

    IoT Edge modülleri büyük/küçük harfe duyarlıdır.

    tempSensor ve filtermodule günlükleri, işledikleri iletileri göstermelidir. EdgeAgent modülü diğer modülleri başlatmakla sorumludur, bu nedenle günlüklerinde dağıtım bildirimini uygulama hakkında bilgi bulunur. Bir modülün listede olmadığını veya çalışmadığını fark ederseniz edgeAgent günlükleri büyük olasılıkla hatalara sahiptir. EdgeHub modülü, modüllerle IoT Hub arasındaki iletişimlerden sorumludur. Modüller çalışır durumdaysa ancak iletiler IoT hub'ınıza ulaşmıyorsa edgeHub günlüklerinde büyük olasılıkla hatalar vardır.

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.

Aksi takdirde, ücretlerden kaçınmak için bu makalede kullandığınız yerel yapılandırmaları ve 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.

Sonraki adımlar

Bu öğreticide, geliştirme makinenizde Visual Studio Code'ı ayarladınız ve IoT Edge cihazınız tarafından oluşturulan ham verileri filtrelemek için kod içeren ilk IoT Edge modülünüzü dağıttınız.

Azure IoT Edge'in uçta verileri işlemek ve analiz etmek için Azure bulut hizmetlerini dağıtmanıza nasıl yardımcı olabileceğini öğrenmek için sonraki öğreticilere devam edebilirsiniz.