IoT Hub'da cihaz ikizlerini anlama ve kullanma

Cihaz ikizleri meta veriler, yapılandırmalar ve koşullar dahil olmak üzere cihaz durumu bilgilerini depolayan JSON belgeleridir. Azure IoT Hub, IoT Hub'a bağladığınız her cihaz için bir cihaz çifti tutar.

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:

  • Cihaz ikizinin yapısı: etiketler, istenen özellikler ve bildirilen özellikler.
  • Cihaz ve arka uç uygulamalarının cihaz ikizlerinde gerçekleştirebileceği işlemler.

Cihaz ikizlerini kullanarak:

  • Cihaza özgü meta verileri bulutta depolayın. Örneğin, bir satış makinesinin konumu.

  • Cihaz uygulamanızdan kullanılabilir özellikler ve koşullar gibi geçerli durum bilgilerini bildirin. Örneğin, bir cihazın hücresel veya WiFi üzerinden IoT hub'ınıza bağlı olup olmadığı.

  • Cihaz uygulaması ve arka uç uygulaması arasında uzun süre çalışan iş akışlarının durumunu eşitleyin. Örneğin, çözüm arka ucu yüklenecek yeni üretici yazılımı sürümünü belirttiğinde ve cihaz uygulaması güncelleştirme işleminin çeşitli aşamalarını raporladığında.

  • Cihaz meta verilerinizi, yapılandırmanızı veya durumunuzu sorgular.

Bildirilen özellikleri, cihazdan buluta iletileri veya dosya yüklemeyi kullanma hakkında daha fazla bilgi için bkz . Cihazdan buluta iletişim kılavuzu.

İstenen özellikleri, doğrudan yöntemleri veya buluttan cihaza iletileri kullanma hakkında daha fazla bilgi için bkz . Buluttan cihaza iletişim kılavuzu.

Cihaz ikizlerinin Azure IoT Tak Çalıştır cihazı tarafından kullanılan cihaz modeliyle ilişkisini öğrenmek için bkz. Dijital ikizleri IoT Tak Çalıştır anlama.

Cihaz ikizleri

Cihaz ikizleri, cihazla ilgili şu bilgileri depolar:

  • Cihaz ve arka uçlar, cihaz 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.

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

Cihaz 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 cihaz uygulamaları tarafından görülemez.

  • İstenen özellikler. Cihaz 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 cihaz uygulaması bunları okuyabilir. Cihaz uygulaması, istenen özelliklerdeki değişikliklerin bildirimlerini de alabilir.

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

  • Cihaz kimliği özellikleri. Cihaz ikizi JSON belgesinin kökü, kimlik kayıt defterinde depolanan ilgili cihaz kimliğinden salt okunur özellikleri içerir. generationId özellikleri connectionStateUpdatedTime dahil edilmeyecektir.

Hangi uygulamaların hangi cihaz ikizi özellikleriyle etkileşim kurduğunu gösteren diyagram.

Aşağıdaki örnekte bir cihaz ikizi JSON belgesi gösterilmektedir:

{
    "deviceId": "devA",
    "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 nesne, cihaz kimliği özelliklerini ve ve hem hem de reported desired özellikleri için tags kapsayıcı nesnelerini içerir. Kapsayıcı, properties Cihaz 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 cihaz ikizi, cihaz uygulaması tarafından bildirilen bir batteryLevel özellik içerir. Bu özellik, son bildirilen pil düzeyine göre cihazları sorgulamayı ve cihazlarda çalıştırmayı mümkün kılar. Diğer örnekler arasında cihaz uygulaması raporlama cihazı ö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 cihaz telemetrisini zaman serisi gibi zaman damgalı olayların dizileri biçiminde işlemesi gerekiyorsa cihazdan buluta iletileri kullanın.

İstenen özellik örneği

Önceki örnekte, istenen ve bildirilen cihaz ikizi özellikleri, telemetryConfig çözüm arka ucu ve cihaz uygulaması tarafından bu cihazın telemetri yapılandırmasını eşitlemek için kullanılı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. Cihaz bağlıysa cihaz uygulamasına değişiklik anında bildirilir. Cihaz bağlı değilse, cihaz uygulaması bağlandığında cihaz yeniden bağlanma akışını izler. Ardından cihaz uygulaması güncelleştirilmiş yapılandırmayı (veya özelliğini kullanan 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, cihaz ikizlerini sorgulayarak birçok cihazda yapılandırma işleminin sonuçlarını izler.

Not

Önceki kod parçacıkları, bir cihaz yapılandırmasını ve durumunu kodlamanın bir yolu olan okunabilirlik için iyileştirilmiş örneklerdir. IoT Hub, cihaz ikizlerinde istenen ve bildirilen cihaz ikizi özellikleri 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.

Bellenim güncelleştirmeleri gibi uzun süre çalışan işlemleri eşitlemek için ikizleri kullanabilirsiniz. Uzun süre çalışan bir işlemi cihazlar arasında eşitlemek ve izlemek için özellikleri kullanma hakkında daha fazla bilgi için bkz . Cihazları yapılandırmak için istenen özellikleri kullanma.

Arka uç işlemleri

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

  • Kimlikle cihaz ikizlerini alma. Bu işlem, etiketler ve istenen ve bildirilen sistem özellikleri de dahil olmak üzere cihaz ikizi belgesini döndürür.

  • Cihaz ikizlerini kısmen güncelleştirin. Bu işlem, çözüm arka ucunun cihaz 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 bölümünde tanımlandığı gibi Hizmet Bağlan izni gerektirir.

Bu işlemlere ek olarak, çözüm arka ucu şunları yapabilir:

Cihaz işlemleri

Cihaz uygulaması aşağıdaki atomik işlemleri kullanarak cihaz ikizi üzerinde çalışır:

  • Cihaz ikizlerini alın. Bu işlem, bağlı durumdaki cihaz için cihaz ikizi belgesini (istenen ve bildirilen sistem özellikleri dahil) döndürür. (Etiketler cihaz uygulamalarına görünmez.)

  • Bildirilen özellikleri kısmen güncelleştirin. Bu işlem, o anda bağlı olan cihazın bildirilen özelliklerinin kısmi güncelleştirmesini sağlar. 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 cihaz, gerçekleştiğinde istenen özelliklere yapılan güncelleştirmelerin bildirilmesini seçebilir. Cihaz, çö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 bölümünde 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. İstenen özellikler eşitlemesi için IoT Hub temel öğelerinin ayrıntıları hakkında daha fazla bilgi için bkz . Cihaz yeniden bağlantı akışı.

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.

    Not

    İleti Yönlendirme'de kullanılan IoT Hub sorguları, anahtar adının bir parçası olarak boşluk veya aşağıdaki karakterlerden herhangi birini desteklemez: ()<>@,;:\"/?={}.

  • 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"
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         },
         ...
    }
    

Cihaz 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, , properties/desiredveya properties/reported belgelerinin boyutunu tagssınırın üzerinde artıracak tüm işlemler hatayla reddeder.

Cihaz ikizi meta verileri

IoT Hub, cihaz ikizi istenen ve bildirilen özelliklerdeki her JSON nesnesi için son güncelleştirmenin zaman damgasını korur. 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": {
                        "$lastUpdated": "2016-03-31T16:35:48.789Z"
                    },
                    "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.

Cihaz ikizleri, RFC7232 göre ikizin JSON gösterimini temsil eden bir ETag özelliğine etagsahiptir. Tutarlılığı sağlamak için çözümün arka ucundan koşullu güncelleştirme işlemlerinde özelliğini kullanabilirsiniz etag . Bu özellik, kapsayıcıyı içeren işlemlerde tutarlılık sağlamaya yönelik tek seçenektir tags .

İstenen cihaz ikizi 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 özelliğin cihaz uygulaması veya istenen özellik için çözüm arka ucu.

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

Cihaz yeniden bağlantı akışı

IoT Hub bağlantısı kesilmiş cihazlar için istenen özellikleri güncelleştirme bildirimlerini korumaz. Bağlanan bir cihazı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. Cihaz uygulaması bir IoT hub'ına bağlanır.
  2. Cihaz uygulaması, istenen özellikler güncelleştirme bildirimlerine abonedir.
  3. Cihaz uygulaması istenen özellikler için belgenin tamamını alır.

Cihaz uygulaması, tam olarak alınan belgenin sürümünden küçük 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 makalelerine bakın: