IoT Edge'de modülleri dağıtmayı ve yolları oluşturmayı öğrenin

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

Her IoT Edge cihazı en az iki modül çalıştırır: ioT Edge çalışma zamanının parçası olan $edgeAgent ve $edgeHub. IoT Edge cihazı, herhangi bir sayıda işlem için birden çok modül çalıştırabilir. Cihazınıza hangi modüllerin yükleneceğini ve birlikte çalışacak şekilde nasıl yapılandıracaklarını bildirmek için bir dağıtım bildirimi kullanın.

Dağıtım bildirimi , aşağıdakileri açıklayan bir JSON belgesidir:

  • Üç bileşen içeren IoT Edge aracı modülü ikizi:
    • Cihazda çalışan her modülün kapsayıcı görüntüsü.
    • Modül görüntüleri içeren özel kapsayıcı kayıt defterlerine erişmek için kimlik bilgileri.
    • Her modülün nasıl oluşturulup yönetileceğine ilişkin yönergeler.
  • İletilerin modüller arasında ve sonunda IoT Hub'a nasıl aktığını içeren IoT Edge hub modül ikizi.
  • Ek modül ikizlerinin istenen özellikleri (isteğe bağlı).

Tüm IoT Edge cihazları bir dağıtım bildirimiyle yapılandırılmalıdır. Yeni yüklenen bir IoT Edge çalışma zamanı, geçerli bir bildirimle yapılandırılana kadar bir hata kodu bildirir.

Azure IoT Edge öğreticilerinde, Azure IoT Edge portalında bir sihirbazdan geçerek bir dağıtım bildirimi oluşturursunuz. Rest veya IoT Hub Hizmet SDK'sını kullanarak program aracılığıyla bir dağıtım bildirimi de uygulayabilirsiniz. Daha fazla bilgi için bkz . IoT Edge dağıtımlarını anlama.

Dağıtım bildirimi oluşturma

Yüksek düzeyde dağıtım bildirimi, istenen özellikleriyle yapılandırılan modül ikizlerinin listesidir. Dağıtım bildirimi, IoT Edge cihazına (veya bir cihaz grubuna) hangi modüllerin yükleneceğini ve bunların nasıl yapılandırleneceğini bildirir. Dağıtım bildirimleri her modül ikizi için istenen özellikleri içerir. IoT Edge cihazları, her modül için bildirilen özellikleri geri bildirir.

Her dağıtım bildiriminde iki modül gereklidir: $edgeAgent, ve $edgeHub. Bu modüller, IoT Edge cihazını ve üzerinde çalışan modülleri yöneten IoT Edge çalışma zamanının bir parçasıdır. Bu modüller hakkında daha fazla bilgi için bkz . IoT Edge çalışma zamanını ve mimarisini anlama.

İki çalışma zamanı modülüne ek olarak, ioT Edge cihazında çalıştırmak için 50'ye kadar modül ekleyebilirsiniz.

Yalnızca IoT Edge çalışma zamanını (edgeAgent ve edgeHub) içeren bir dağıtım bildirimi geçerlidir.

Dağıtım bildirimleri şu yapıyı izler:

{
  "modulesContent": {
    "$edgeAgent": { // required
      "properties.desired": {
        // desired properties of the IoT Edge agent
        // includes the image URIs of all deployed modules
        // includes container registry credentials
      }
    },
    "$edgeHub": { //required
      "properties.desired": {
        // desired properties of the IoT Edge hub
        // includes the routing information between modules, and to IoT Hub
      }
    },
    "module1": {  // optional
      "properties.desired": {
        // desired properties of module1
      }
    },
    "module2": {  // optional
      "properties.desired": {
        // desired properties of module2
      }
    }
  }
}

Modülleri konfigüre et

IoT Edge çalışma zamanının modülleri dağıtımınıza nasıl yükleneceğini tanımlayın. IoT Edge aracısı, bir IoT Edge cihazı için yükleme, güncelleştirme ve durum raporlamayı yöneten çalışma zamanı bileşenidir. Bu nedenle, $edgeAgent modül ikizi tüm modüllerin yapılandırma ve yönetim bilgilerini içerir. Bu bilgiler IoT Edge aracısının yapılandırma parametrelerini içerir.

$edgeAgent özellikleri şu yapıyı izler:

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "settings":{
            "registryCredentials":{
              // give the IoT Edge agent access to container images that aren't public
            }
          }
        },
        "systemModules": {
          "edgeAgent": {
            // configuration and management details
          },
          "edgeHub": {
            // configuration and management details
          }
        },
        "modules": {
          "module1": {
            // configuration and management details
          },
          "module2": {
            // configuration and management details
          }
        }
      }
    },
    "$edgeHub": { ... },
    "module1": { ... },
    "module2": { ... }
  }
}

IoT Edge aracı şeması sürüm 1.1, IoT Edge sürüm 1.0.10 ile birlikte yayımlandı ve modül başlatma sırasını etkinleştirir. 1.0.10 veya sonraki bir sürümü çalıştıran tüm IoT Edge dağıtımları için şema sürümü 1.1 önerilir.

Modül yapılandırması ve yönetimi

IoT Edge aracısı istenen özellikler listesi, ioT Edge cihazına dağıtılacak modülleri ve bunların nasıl yapılandırılıp yönetilmeleri gerektiğini tanımladığınız yerdir.

Dahil edilebilecek veya eklenmesi gereken istenen özelliklerin tam listesi için bkz . IoT Edge aracısının ve IoT Edge hub'ının özellikleri.

Örnek:

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": { ... },
        "systemModules": {
          "edgeAgent": { ... },
          "edgeHub": { ... }
        },
        "modules": {
          "module1": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "startupOrder": 2,
            "settings": {
              "image": "myacr.azurecr.io/module1:latest",
              "createOptions": "{}"
            }
          },
          "module2": { ... }
        }
      }
    },
    "$edgeHub": { ... },
    "module1": { ... },
    "module2": { ... }
  }
}

Her modülün modül görüntüsünü, kapsayıcı kayıt defterindeki kapsayıcı görüntüsünün adresini ve başlangıçta görüntüyü yapılandırmak için createOptions'ıiçeren bir settings özelliği vardır. Daha fazla bilgi için bkz . IoT Edge modülleri için kapsayıcı oluşturma seçeneklerini yapılandırma.

EdgeHub modülü ve özel modülleri, IoT Edge aracısına bunları nasıl yöneteceklerini belirten üç özelliğe de sahiptir:

  • Durum: Modülün ilk dağıtıldığında çalıştırılması mı yoksa durdurulması mı gerektiği. Gerekli.

  • RestartPolicy: IoT Edge aracısı durursa modülü ne zaman ve ne zaman yeniden başlatmalıdır. Modül hatasız durdurulursa otomatik olarak başlatılmaz. Daha fazla bilgi için bkz . Docker Docs - Kapsayıcıları otomatik olarak başlatma. Gerekli.

  • StartupOrder: IoT Edge sürüm 1.0.10 ile kullanıma sunulmuştur. IoT Edge aracısının ilk dağıtıldığında modülleri başlatması gereken sipariş. Sıra, başlangıç değeri 0 olan bir modülün ilk olarak başlatıldığı ve ardından daha yüksek sayıların izlendiği tamsayılarla bildirilir. edgeAgent modülünün başlangıç değeri yoktur çünkü her zaman ilk başlar. isteğe bağlı.

    IoT Edge aracısı başlangıç değeri sırasına göre modülleri başlatır, ancak bir sonrakine geçmeden önce her modülün başlatılmasını beklemez.

    Bazı modüller diğerlerine bağlıysa başlangıç sırası yararlı olur. Örneğin, diğer modüller başlatıldığında iletileri yönlendirmeye hazır olması için edgeHub modülünün ilk olarak başlatılmasını isteyebilirsiniz. Alternatif olarak, veri gönderen modülleri başlatmadan önce bir depolama modülü başlatmak da isteyebilirsiniz. Ancak, modüllerinizi her zaman diğer modüllerin hatalarını işleyecek şekilde tasarlamanız gerekir. Kapsayıcıların doğası gereği herhangi bir anda ve birkaç kez durdurulup yeniden başlatılabilir.

    Dekont

    Modülün özelliklerinde yapılan değişiklikler bu modülün yeniden başlatılmasına neden olur. Örneğin, şunun özelliklerini değiştirirseniz yeniden başlatma gerçekleşir:

    • modül görüntüsü
    • Docker oluşturma seçenekleri
    • ortam değişkenleri
    • yeniden başlatma ilkesi
    • görüntü çekme ilkesi
    • sürüm
    • başlangıç sırası

    Modül özelliği değiştirilmezse modül yeniden başlatılmaz.

Yolları bildirme

IoT Edge hub'ı modüller, IoT Hub ve tüm aşağı akış cihazları arasındaki iletişimi yönetir. Bu nedenle, $edgeHub modül ikizi, iletilerin bir dağıtım içinde nasıl geçirildiğini bildiren routes adlı istenen bir özellik içerir. Aynı dağıtımda birden çok yolunuz olabilir.

Yollar, istenen $edgeHub özelliklerde aşağıdaki söz dizimiyle bildirilir:

{
  "modulesContent": {
    "$edgeAgent": { ... },
    "$edgeHub": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "routes": {
          "route1": "FROM <source> WHERE <condition> INTO <sink>",
          "route2": {
            "route": "FROM <source> WHERE <condition> INTO <sink>",
            "priority": 0,
            "timeToLiveSecs": 86400
          }
        },
        "storeAndForwardConfiguration": {
          "timeToLiveSecs": 10
        }
      }
    },
    "module1": { ... },
    "module2": { ... }
  }
}

IoT Edge hub şema sürümü 1, IoT Edge sürüm 1.0.10 ile birlikte yayımlandı ve yol önceliklendirme ve yaşam süresi sağlar. 1.0.10 veya sonraki bir sürümü çalıştıran tüm IoT Edge dağıtımları için şema sürümü 1.1 önerilir.

Her yol, iletilerin geldiği bir kaynağa ve iletilerin gittiği bir havuza ihtiyaç duyar. Koşul, iletileri filtrelemek için kullanabileceğiniz isteğe bağlı bir parçadır.

Önce iletilerini işlemesini sağlamak istediğiniz yollara öncelik atayabilirsiniz. Bu özellik, yukarı akış bağlantısının zayıf veya sınırlı olduğu ve standart telemetri iletilerine göre önceliklendirilmesi gereken kritik verileriniz olduğu senaryolarda yararlıdır.

Source

Kaynak, iletilerin nereden geldiğini belirtir. IoT Edge, modüllerden veya aşağı akış cihazlarından iletileri yönlendirebilir.

IoT SDK'ları ile modüller ModuleClient sınıfını kullanarak iletileri için belirli çıkış kuyruklarını bildirebilir. Çıkış kuyrukları gerekli değildir, ancak birden çok yolu yönetmek için yararlıdır. Aşağı akış cihazları, IoT Sdk'larının DeviceClient sınıfını kullanarak IoT Edge ağ geçidi cihazlarına, IoT Hub'a ileti gönderecekleri şekilde ileti gönderebilir. Daha fazla bilgi için bkz . Azure IoT Hub SDK'larını anlama ve kullanma.

Kaynak özellik aşağıdaki değerlerden herhangi biri olabilir:

Source Tanım
/* Herhangi bir modülden veya aşağı akış cihazından tüm cihazdan buluta iletiler veya ikizler değişiklik bildirimleri
/twinChangeNotifications Herhangi bir modülden veya aşağı akış cihazından gelen tüm ikiz değişiklikleri (bildirilen özellikler)
/messages/* Bir modül tarafından çıkışın bir bölümü veya hiç üzerinden ya da aşağı akış cihazı tarafından gönderilen cihazdan buluta ileti
/messages/modules/* Bir modül tarafından çıkışın bir bölümü veya hiç üzerinden gönderilen cihazdan buluta ileti
/messages/modules/<moduleId>/* Belirli bir modül tarafından çıkışın bir kısmı veya hiçi aracılığıyla gönderilen cihazdan buluta ileti
/messages/modules/<moduleId>/outputs/* Belirli bir modül tarafından bazı çıkışlar aracılığıyla gönderilen cihazdan buluta ileti
/messages/modules/<moduleId>/outputs/<output> Belirli bir modül tarafından belirli bir çıkış üzerinden gönderilen cihazdan buluta ileti

Koşul

Koşul, yol bildiriminde isteğe bağlıdır. Kaynaktan havuza tüm iletileri geçirmek istiyorsanız WHERE yan tümcesini tamamen dışarıda bırakın. Veya koşulu karşılayan belirli iletileri veya ileti türlerini filtrelemek için IoT Hub sorgu dilini kullanabilirsiniz. IoT Edge yolları, ikiz etiketlerine veya özelliklerine göre iletileri filtrelemeyi desteklemez.

IoT Edge'deki modüller arasında geçen iletiler, cihazlarınız ile Azure IoT Hub arasında geçen iletilerle aynı şekilde biçimlendirilir. Tüm iletiler JSON olarak biçimlendirilir ve systemProperties, appProperties ve gövde parametrelerine sahiptir.

Aşağıdaki söz dizimiyle üç parametrenin herhangi birinin etrafında sorgular oluşturabilirsiniz:

  • Sistem özellikleri: $<propertyName> veya {$<propertyName>}
  • Uygulama özellikleri: <propertyName>
  • Gövde özellikleri: $body.<propertyName>

İleti özellikleri için sorgu oluşturma hakkında örnekler için bkz . Cihazdan buluta ileti yönlendirmeleri sorgu ifadeleri.

IoT Edge'e özgü bir örnek, aşağı akış cihazından bir ağ geçidi cihazına gelen iletileri filtrelemek istemenizdir. Modüllerden gönderilen iletiler connectionModuleId adlı bir sistem özelliği içerir. Bu nedenle, aşağı akış cihazlarından gelen iletileri doğrudan IoT Hub'a yönlendirmek istiyorsanız modül iletilerini dışlamak için aşağıdaki yolu kullanın:

FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO $upstream

Havuz

Havuz, iletilerin nereye gönderileceğini tanımlar. Yalnızca modüller ve IoT Hub iletileri alabilir. İletiler diğer cihazlara yönlendirilemiyor. Havuz özelliğinde joker karakter seçeneği yoktur.

sink özelliği aşağıdaki değerlerden herhangi biri olabilir:

Havuz Tanım
$upstream İletiyi IoT Hub'a gönderme
BrokeredEndpoint("/modules/<moduleId>/inputs/<input>") İletiyi belirli bir modülün belirli bir girişine gönderme

IoT Edge en az bir kez garanti sağlar. IoT Edge hub'ı, bir yolun iletiyi havuzuna teslim etme olasılığına karşı iletileri yerel olarak depolar. Örneğin, IoT Edge hub'ı IoT Hub'a bağlanamıyorsa veya hedef modül bağlı değilse.

IoT Edge hub'ı, IoT Edge hub'ının storeAndForwardConfiguration.timeToLiveSecs istenen özelliklerinde belirtilen süreye kadar iletileri depolar.

Öncelik ve yaşam süresi

Yollar yalnızca yolu tanımlayan bir dizeyle veya yol dizesi, öncelik tamsayısı ve yaşam süresi tamsayısı alan bir nesne olarak bildirilebilir.

Seçenek 1:

"route1": "FROM <source> WHERE <condition> INTO <sink>",

IoT Edge hub şema sürümü 1.1 ile IoT Edge sürüm 1.0.10 ile sunulan 2. Seçenek:

"route2": {
  "route": "FROM <source> WHERE <condition> INTO <sink>",
  "priority": 0,
  "timeToLiveSecs": 86400
}

Öncelik değerleri 0-9 (dahil) olabilir; burada 0 en yüksek önceliktir. İletiler uç noktalarına göre kuyruğa alınır. Belirli bir uç noktayı hedefleyen tüm öncelikli 0 iletileri, aynı uç noktayı hedefleyen tüm öncelik 1 iletileri işlenmeden önce işlenir ve satır aşağı doğru işlenir. Aynı uç nokta için birden çok yol aynı önceliğe sahipse, iletileri ilk gelen ilk hizmet temelinde işlenir. Öncelik belirtilmezse, yol en düşük önceliğe atanır.

timeToLiveSecs özelliği, açıkça ayarlanmadığı sürece değerini IoT Edge hub'ının storeAndForwardConfiguration öğesinden devralır. Değer herhangi bir pozitif tamsayı olabilir.

Öncelik kuyruklarının nasıl yönetildiğini gösteren ayrıntılı bilgi için Rota önceliği ve yaşam süresi başvuru sayfasına bakın.

İstenen özellikleri tanımlama veya güncelleştirme

Dağıtım bildirimi, IoT Edge cihazına dağıtılan her modül için istenen özellikleri belirtir. Dağıtım bildirimindeki istenen özellikler, şu anda modül ikizinde bulunan istenen özelliklerin üzerine yazar.

Dağıtım bildiriminde modül ikizinin istenen özelliklerini belirtmezseniz IoT Hub modül ikizini hiçbir şekilde değiştirmez. Bunun yerine, istediğiniz özellikleri program aracılığıyla ayarlayabilirsiniz.

Modül ikizlerini değiştirmek için cihaz ikizlerini değiştirmenize olanak sağlayan mekanizmalar kullanılır. Daha fazla bilgi için modül ikizi geliştirici kılavuzuna bakın.

Dağıtım bildirimi örneği

Aşağıdaki örnekte geçerli bir dağıtım bildirimi belgesinin nasıl görünebileceği gösterilmektedir.

{
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "ContosoRegistry": {
                "username": "myacr",
                "password": "<password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
        "systemModules": {
          "edgeAgent": {
            "type": "docker",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
              "createOptions": "{}"
            }
          },
          "edgeHub": {
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "startupOrder": 0,
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
            }
          }
        },
        "modules": {
          "SimulatedTemperatureSensor": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "startupOrder": 2,
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0",
              "createOptions": "{}"
            }
          },
          "filtermodule": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "startupOrder": 1,
            "env": {
              "tempLimit": {"value": "100"}
            },
            "settings": {
              "image": "myacr.azurecr.io/filtermodule:latest",
              "createOptions": "{}"
            }
          }
        }
      }
    },
    "$edgeHub": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "routes": {
          "sensorToFilter": {
            "route": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/input1\")",
            "priority": 0,
            "timeToLiveSecs": 1800
          },
          "filterToIoTHub": {
            "route": "FROM /messages/modules/filtermodule/outputs/output1 INTO $upstream",
            "priority": 1,
            "timeToLiveSecs": 1800
          }
        },
        "storeAndForwardConfiguration": {
          "timeToLiveSecs": 100
        }
      }
    }
  }
}

Sonraki adımlar