IoT Hub'da modül ikizlerini anlama ve kullanma

Bu makalede, önce IoT Hub'da cihaz ikizlerini anlama ve kullanma makalelerini okuduğunuz varsayılır. IoT Hub'da, her cihaz kimliğinin altında en fazla 50 modül kimliği oluşturabilirsiniz. Her modül kimliği örtük olarak bir modül ikizi oluşturur. Cihaz ikizlerine benzer şekilde, modül ikizleri de meta veriler, yapılandırmalar ve koşullar gibi modül durumu bilgilerini depolayan JSON belgeleridir. Azure IoT Hub, IoT Hub'a bağladığınız her modül için bir modül ikizi tutar.

Cihaz tarafında IoT Hub cihaz SDK'ları, her birinin IoT Hub'a bağımsız bir bağlantı açtığı modüller oluşturmanıza olanak tanır. Bu işlevsellik, cihazınızdaki farklı bileşenler için ayrı ad alanları kullanmanıza olanak tanır. Örneğin, üç farklı algılayıcısı olan bir otomat var. Her sensör şirketinizdeki farklı departmanlar tarafından kontrol edilir. Her sensör için bir modül oluşturabilirsiniz. Bu şekilde, her departman yalnızca denetledikleri algılayıcıya iş veya doğrudan yöntemler gönderebilir ve çakışmaları ve kullanıcı hatalarını önler.

Modül kimliği ve modül ikizi, cihaz kimliği ve cihaz ikizi ile aynı özellikleri sağlar ancak daha ayrıntılıdır. Bu daha ayrıntılı ayrıntı düzeyi, işletim sistemi tabanlı cihazlar veya birden çok bileşeni yöneten üretici yazılımı cihazları gibi yetenekli cihazların bu bileşenlerin her biri için yapılandırmayı ve koşulları yalıtmalarını sağlar. Modül kimliği ve modül ikizleri, modüler yazılım bileşenlerine sahip IoT cihazlarıyla çalışırken karşılaşılan endişelerin yönetim ayrımını sağlar. Modül ikizi genel kullanılabilirliği ile modül ikizi düzeyinde tüm cihaz ikizi işlevselliğini desteklemeyi hedefliyoruz.

Not

Bu makalede açıklanan özellikler yalnızca IoT Hub'ın standart katmanında kullanılabilir. Temel ve standart/ücretsiz IoT Hub katmanları hakkında daha fazla bilgi için bkz. Çözümünüz için doğru IoT Hub katmanını seçme.

Bu makalede şunlar açıklanmaktadır:

  • Modül ikizinin yapısı: etiketler, istenen ve bildirilen özellikler.
  • Modüllerin ve arka uçların modül ikizlerinde gerçekleştirebileceği işlemler.

Bildirilen özellikleri, cihazdan buluta iletileri veya dosya yüklemeyi kullanma yönergeleri için Cihazdan buluta iletişim kılavuzuna bakın.

İstenen özellikleri, doğrudan yöntemleri veya buluttan cihaza iletileri kullanma yönergeleri için Buluttan cihaza iletişim kılavuzuna bakın.

Modül ikizleri

Modül ikizleri, aşağıdaki modülle ilgili bilgileri depolar:

  • Cihazdaki ve IoT Hub'lardaki modüller, modül koşullarını ve yapılandırmasını eşitlemek için kullanabilir.

  • Çözüm arka ucu, uzun süre çalışan işlemleri sorgulamak ve hedeflemek için kullanabilir.

Modül ikizinin yaşam döngüsü ilgili modül kimliğine bağlıdır. IoT Hub'da modül kimliği oluşturulduğunda veya silindiğinde modül ikizleri örtük olarak oluşturulur ve silinir.

Modül ikizi, şunları içeren bir JSON belgesidir:

  • Etiketler' e tıklayın. JSON belgesinin çözüm arka ucunun okuyabileceği ve yazabileceği bir bölüm. Etiketler cihazdaki modüllere görünmez. Etiketler sorgulama amacıyla ayarlanır.

  • İstenen özellikler. Modül yapılandırmasını veya koşullarını eşitlemek için bildirilen özelliklerle birlikte kullanılır. Çözüm arka ucu istenen özellikleri ayarlayabilir ve modül uygulaması bunları okuyabilir. Modül uygulaması, istenen özelliklerdeki değişikliklerin bildirimlerini de alabilir.

  • Bildirilen özellikler. Modül yapılandırmasını veya koşullarını eşitlemek için istenen özelliklerle birlikte kullanılır. Modül uygulaması bildirilen özellikleri ayarlayabilir ve çözüm arka ucu bunları okuyabilir ve sorgulayabilir.

  • Modül kimliği özellikleri. Modül ikizi JSON belgesinin kökü, kimlik kayıt defterinde depolanan ilgili modül kimliğinden salt okunur özellikleri içerir.

Architectural representation of device twin

Aşağıdaki örnekte bir modül ikizi JSON belgesi gösterilmektedir:

{
    "deviceId": "devA",
    "moduleId": "moduleA",
    "etag": "AAAAAAAAAAc=", 
    "status": "enabled",
    "statusReason": "provisioned",
    "statusUpdateTime": "0001-01-01T00:00:00",
    "connectionState": "connected",
    "lastActivityTime": "2015-02-30T16:24:48.789Z",
    "cloudToDeviceMessageCount": 0, 
    "authenticationType": "sas",
    "x509Thumbprint": {     
        "primaryThumbprint": null, 
        "secondaryThumbprint": null 
    }, 
    "version": 2, 
    "tags": {
        "deploymentLocation": {
            "building": "43",
            "floor": "1"
        }
    },
    "properties": {
        "desired": {
            "telemetryConfig": {
                "sendFrequency": "5m"
            },
            "$metadata" : {...},
            "$version": 1
        },
        "reported": {
            "telemetryConfig": {
                "sendFrequency": "5m",
                "status": "success"
            },
            "batteryLevel": 55,
            "$metadata" : {...},
            "$version": 4
        }
    }
}

Kök nesnede modül kimliği özellikleri ve ile hem hem de reporteddesired özellikleri için tags kapsayıcı nesneleri bulunur. Kapsayıcı, properties Modül ikizi meta verileri ve $versionİyimser eşzamanlılık bölümlerinde açıklanan bazı salt okunur öğeleri ($metadata ve ) içerir.

Bildirilen özellik örneği

Önceki örnekte modül ikizi, modül uygulaması tarafından bildirilen bir batteryLevel özellik içerir. Bu özellik, bildirilen son pil düzeyine göre modülleri sorgulamayı ve çalıştırmayı mümkün kılar. Diğer örnekler arasında modül uygulaması raporlama modülü özellikleri veya bağlantı seçenekleri yer alır.

Not

Bildirilen özellikler, çözüm arka ucunun bir özelliğin bilinen son değeriyle ilgilendiği senaryoları basitleştirir. Çözüm arka ucunun modül telemetrisini zaman serisi gibi zaman damgalı olaylar dizisi biçiminde işlemesi gerekiyorsa cihazdan buluta iletileri kullanın.

İstenen özellik örneği

Önceki örnekte, telemetryConfig bu modül için telemetri yapılandırmasını eşitlemek için çözüm arka ucu ve modül uygulaması tarafından istenen ve bildirilen modül ikizi özellikleri kullanılmıştır. Örneğin:

  1. Çözüm arka ucu istenen özelliği istenen yapılandırma değeriyle ayarlar. Belgenin istenen özellik kümesine sahip bölümü aşağıdadır:

    ...
    "desired": {
        "telemetryConfig": {
            "sendFrequency": "5m"
        },
        ...
    },
    ...
    
  2. Modül bağlıysa modül uygulamasına değişiklik anında bildirilir. Bağlı değilse modül uygulaması bağlandığında modül yeniden bağlantı akışını izler. Modül uygulaması daha sonra güncelleştirilmiş yapılandırmayı (veya özelliğini kullanarak bir hata koşulu) status bildirir. Bildirilen özelliklerin bölümü aşağıdadır:

    "reported": {
        "telemetryConfig": {
            "sendFrequency": "5m",
            "status": "success"
        }
        ...
    }
    
  3. Çözüm arka ucu, modül ikizlerini sorgulayarak yapılandırma işleminin sonuçlarını birçok modülde izleyebilir.

Not

Yukarıdaki kod parçacıkları, bir modül yapılandırmasını ve durumunu kodlamanın bir yolu olan okunabilirlik için iyileştirilmiş örneklerdir. IoT Hub, modül ikizlerinde istenen ve bildirilen modül ikizleri için belirli bir şema uygulamaz.

Önemli

IoT Tak Çalıştır, değişiklikleri istenen ve bildirilen özelliklerle eşitlemek için birkaç ek özellik kullanan bir şema tanımlar. Çözümünüz IoT Tak Çalıştır kullanıyorsa, ikiz özelliklerini güncelleştirirken Tak ve Kullan kurallarını izlemeniz gerekir. Daha fazla bilgi ve örnek için bkz. IoT Tak Çalıştır yazılabilir özellikler.

Arka uç işlemleri

Çözüm arka ucu, HTTPS aracılığıyla kullanıma sunulan aşağıdaki atomik işlemleri kullanarak modül ikizinde çalışır:

  • Modül ikizlerini kimlikle alın. Bu işlem, etiketler ve istenen ve bildirilen sistem özellikleri de dahil olmak üzere modül ikizi belgesini döndürür.

  • Modül ikizi kısmen güncelleştirildi. Bu işlem, çözüm arka ucunun bir modül ikizindeki etiketleri veya istenen özellikleri kısmen güncelleştirmesini sağlar. Kısmi güncelleştirme, herhangi bir özelliği ekleyen veya güncelleştiren bir JSON belgesi olarak ifade edilir. olarak ayarlanan null özellikler kaldırılır. Aşağıdaki örnek, değeri {"newProperty": "newValue"}ile yeni bir istenen özellik oluşturur, ile "otherNewValue"mevcut değerinin existingProperty üzerine yazar ve öğesini kaldırırotherOldProperty. Mevcut istenen özelliklerde veya etiketlerde başka değişiklik yapılmaz:

    {
        "properties": {
            "desired": {
                "newProperty": {
                    "nestedProperty": "newValue"
                },
                "existingProperty": "otherNewValue",
                "otherOldProperty": null
            }
        }
    }
    
  • İstenen özellikleri değiştirin. Bu işlem, çözüm arka ucunun mevcut tüm istenen özelliklerin üzerine tamamen yazılmasını ve için properties/desiredyeni bir JSON belgesiyle değiştirmesini sağlar.

  • Etiketleri değiştirin. Bu işlem, çözüm arka ucunun tüm mevcut etiketlerin üzerine tamamen yazılmasını ve için tagsyeni bir JSON belgesiyle değiştirmesini sağlar.

  • İkiz bildirimleri alın. Bu işlem, ikiz değiştirildiğinde çözüm arka ucunun bildirilmesini sağlar. Bunu yapmak için IoT çözümünüzün bir yol oluşturması ve Veri Kaynağını twinChangeEvents'e eşit olarak ayarlaması gerekir. Varsayılan olarak, böyle bir yol yoktur, bu nedenle ikiz bildirimleri gönderilmez. Değişiklik oranı çok yüksekse veya iç hatalar gibi diğer nedenlerle IoT Hub tüm değişiklikleri içeren tek bir bildirim gönderebilir. Bu nedenle, uygulamanızın tüm ara durumların güvenilir bir şekilde denetlenmesi ve günlüğe kaydedilmesi gerekiyorsa cihazdan buluta iletileri kullanmanız gerekir. İkiz bildirim iletisinde döndürülen özellikler ve gövde hakkında daha fazla bilgi edinmek için bkz . Telemetri dışı olay şemaları.

Yukarıdaki tüm işlemler İyimser eşzamanlılığı destekler ve IoT Hub'a Erişimi Denetleme makalesinde açıklandığı gibi Hizmet Bağlan izni gerektirir.

Bu işlemlere ek olarak, çözüm arka ucu SQL benzeri IoT Hub sorgu dilini kullanarak modül ikizlerini sorgulayabilir.

Modül işlemleri

Modül uygulaması aşağıdaki atomik işlemleri kullanarak modül ikizi üzerinde çalışır:

  • Modül ikizlerini alın. Bu işlem, bağlı olan modülün modül ikizi belgesini (istenen ve bildirilen sistem özellikleri dahil) döndürür.

  • Bildirilen özellikleri kısmen güncelleştirin. Bu işlem, o anda bağlı olan modülün bildirilen özelliklerinin kısmi güncelleştirmesini etkinleştirir. Bu işlem, çözüm arka ucunun istenen özelliklerin kısmi güncelleştirmesi için kullandığı JSON güncelleştirme biçimini kullanır.

  • İstenen özellikleri gözlemleyin. Şu anda bağlı olan modül, gerçekleştiğinde istenen özelliklere yapılan güncelleştirmelerin bildirilmesini seçebilir. Modül, çözüm arka ucu tarafından yürütülen aynı güncelleştirme biçimini (kısmi veya tam değiştirme) alır.

Yukarıdaki tüm işlemler, IoT Hub'a Erişimi Denetleme makalesinde tanımlandığı gibi Cihaz Bağlan izni gerektirir.

Azure IoT cihaz SDK'ları, birçok dil ve platformdan önceki işlemlerin kullanımını kolaylaştırır.

Etiketler ve özellikler biçimi

Etiketler, istenen özellikler ve bildirilen özellikler aşağıdaki kısıtlamalara sahip JSON nesneleridir:

  • Anahtarlar: JSON nesnelerindeki tüm anahtarlar UTF-8 kodlanmış, büyük/küçük harfe duyarlı ve en fazla 1 KB uzunluğundadır. İzin verilen karakterler UNICODE denetim karakterlerini (C0 ve C1 kesimleri) ve ., $ve SP'yi dışlar.

  • Değerler: JSON nesnelerindeki tüm değerler şu JSON türlerinde olabilir: boole, sayı, dize, nesne. Diziler de desteklenir.

    • Tamsayılar en düşük -4503599627370496 ve en yüksek 4503599627370495 değerine sahip olabilir.

    • Dize değerleri UTF-8 ile kodlanmıştır ve uzunluk üst sınırı 4 KB olabilir.

  • Derinlik: Etiketlerde, istenen özelliklerde ve bildirilen özelliklerde en fazla JSON nesnesi derinliği 10'dur. Örneğin, aşağıdaki nesne geçerlidir:

    {
         ...
         "tags": {
             "one": {
                 "two": {
                     "three": {
                         "four": {
                             "five": {
                                 "six": {
                                     "seven": {
                                         "eight": {
                                             "nine": {
                                                 "ten": {
                                                     "property": "value"
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         },
         ...
    }
    

Modül ikizi boyutu

IoT Hub değeri için 8 KB boyut sınırı, ve properties/reporteddeğerinde tagsher properties/desired biri için 32 KB boyut sınırı uygular. Bu toplamlar ve $metadata/$lastUpdatedgibi $version salt okunur öğelere özeldir.

İkiz boyutu aşağıdaki gibi hesaplanır:

  • JSON belgesindeki her özellik için IoT Hub toplu olarak hesaplar ve özelliğin anahtarının ve değerinin uzunluğunu ekler.

  • Özellik anahtarları UTF8 ile kodlanmış dizeler olarak kabul edilir.

  • Basit özellik değerleri UTF8 kodlu dizeler, sayısal değerler (8 Bayt) veya Boole değerleri (4 Bayt) olarak kabul edilir.

  • UTF8 ile kodlanmış dizelerin boyutu, UNICODE denetim karakterleri (C0 ve C1 kesimleri) hariç tüm karakterler sayılarak hesaplanır.

  • Karmaşık özellik değerleri (iç içe nesneler), özellik anahtarlarının ve içerdikleri özellik değerlerinin toplam boyutuna göre hesaplanır.

IoT Hub, bu belgelerin boyutunu sınırın üzerine çıkarabilecek tüm işlemler hatayla reddeder.

Modül ikizi meta verileri

IoT Hub, istenen ve bildirilen özelliklerdeki her JSON nesnesi için son güncelleştirmenin zaman damgasını tutar. Zaman damgaları UTC biçimindedir ve ISO8601 biçiminde YYYY-MM-DDTHH:MM:SS.mmmZkodlanmıştır. Örneğin:

{
    ...
    "properties": {
        "desired": {
            "telemetryConfig": {
                "sendFrequency": "5m"
            },
            "$metadata": {
                "telemetryConfig": {
                    "sendFrequency": {
                        "$lastUpdated": "2016-03-30T16:24:48.789Z"
                    },
                    "$lastUpdated": "2016-03-30T16:24:48.789Z"
                },
                "$lastUpdated": "2016-03-30T16:24:48.789Z"
            },
            "$version": 23
        },
        "reported": {
            "telemetryConfig": {
                "sendFrequency": "5m",
                "status": "success"
            },
            "batteryLevel": "55%",
            "$metadata": {
                "telemetryConfig": {
                    "sendFrequency": "5m",
                    "status": {
                        "$lastUpdated": "2016-03-31T16:35:48.789Z"
                    },
                    "$lastUpdated": "2016-03-31T16:35:48.789Z"
                },
                "batteryLevel": {
                    "$lastUpdated": "2016-04-01T16:35:48.789Z"
                },
                "$lastUpdated": "2016-04-01T16:24:48.789Z"
            },
            "$version": 123
        }
    }
    ...
}

Nesne anahtarlarını kaldıran güncelleştirmeleri korumak için bu bilgiler her düzeyde tutulur (yalnızca JSON yapısının yaprakları değil).

İyimser eşzamanlılık

Etiketler, istenen özellikler ve bildirilen özelliklerin tümü iyimser eşzamanlılığı destekler. İkiz özellik güncelleştirmelerinin sırasını garanti etmeniz gerekiyorsa, bir sonraki güncelleştirmeyi göndermeden önce bildirilen özellikleri geri çağırmayı bekleyerek uygulama düzeyinde eşitleme uygulamayı göz önünde bulundurun.

Modül ikizlerinin RFC7232 göre ikizin JSON gösterimini temsil eden bir ETag (etagözelliği) vardır. Tutarlılığı sağlamak için çözümün arka ucundan koşullu güncelleştirme işlemlerinde özelliğini kullanabilirsiniz etag . Kapsayıcıyı içeren tags işlemlerde tutarlılık sağlamak için tek seçenek budur.

Modül ikizi istenen ve bildirilen özellikler de artımlı olması garanti edilen bir $version değere sahiptir. ETag'e benzer şekilde, sürüm güncelleştirmelerin tutarlılığını zorlamak için güncelleştirme tarafı tarafından kullanılabilir. Örneğin, bildirilen bir özellik için modül uygulaması veya istenen özellik için çözüm arka ucu.

Bir gözlem aracısının (istenen özellikleri gözlemleyen modül uygulaması gibi) alma işleminin sonucu ile güncelleştirme bildirimi arasındaki yarışları uzlaştırması gerektiğinde de sürümler yararlıdır. Modül yeniden bağlantı akışı bölümü daha fazla bilgi sağlar.

Modül yeniden bağlantı akışı

IoT Hub, bağlantısı kesilmiş modüller için istenen özellikleri güncelleştirme bildirimlerini korumaz. Bağlanan bir modülün, güncelleştirme bildirimlerine abone olmak için ek olarak istenen özellikler belgesinin tamamını alması gerekir. Güncelleştirme bildirimleri ile tam alma arasında yarış olasılığı göz önünde bulundurulduğunda aşağıdaki akışın sağlanması gerekir:

  1. Modül uygulaması bir IoT hub'ına bağlanır.
  2. Modül uygulaması istenen özellikler güncelleştirme bildirimlerine abonedir.
  3. Modül uygulaması istenen özellikler için belgenin tamamını alır.

Modül uygulaması, tam alınan belgenin sürümünden daha az veya eşit olan tüm bildirimleri $version yoksayabilir. IoT Hub sürümlerin her zaman arttığını garanti ettiğinden bu yaklaşım mümkündür.

Sonraki adımlar

Bu makalede açıklanan kavramlardan bazılarını denemek için aşağıdaki IoT Hub öğreticilerine bakın: