IoT hub'ından buluttan cihaza mesajlaşmayı anlama

Buluttan cihaza iletiler, çözüm arka ucunuzdan bir cihaz uygulamasına tek yönlü bildirimlerdir. Azure IoT Hub tarafından desteklenen diğer buluttan cihaza seçenekleri hakkında daha fazla bilgi için bkz . Buluttan cihaza iletişim kılavuzu.

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.

Hizmete yönelik uç nokta ( /messages/devicebound) aracılığıyla buluttan cihaza iletiler gönderirsiniz. Ardından bir cihaz, cihaza özgü uç nokta olan /devices/{deviceId}/messages/devicebound üzerinden iletileri alır.

Buluttan cihaza her iletiyi tek bir cihazda hedeflemek için IoT hub'ınız özelliğini /devices/{deviceId}/messages/devicebound olarak ayarlar.

Her cihaz kuyruğunda en fazla 50 buluttan cihaza ileti bulunur. Aynı cihaza daha fazla ileti göndermeye çalıştığınızda bir hata oluşur.

Bu makalede, buluttan cihaza iletilerle ilgili kavramlar ve işlemler ele alınmaktadır. Buluttan cihaza iletileri işleyen uygulamalar geliştirme konusunda rehberlik için bkz . Buluttan cihaza iletileri gönderme ve alma.

Buluttan cihaza ileti yaşam döngüsü

En az bir kez ileti teslimini garanti etmek için IoT hub'ınız cihaz başına kuyruklarda buluttan cihaza iletileri kalıcı hale getirir. IoT hub'ı iletiyi kuyruktan kaldırmadan önce cihazların bir iletinin tamamlanmasını açıkça kabul etmesi gerekir. Bu yaklaşım, bağlantı ve cihaz hatalarına karşı dayanıklılığı garanti eder.

Yaşam döngüsü durum grafiği aşağıdaki diyagramda görüntülenir:

Buluttan cihaza iletilerin yaşam döngüsü durumu grafiğini gösteren diyagram.

IoT hub hizmeti bir cihaza ileti gönderdiğinde, hizmet ileti durumunu Enqueued olarak ayarlar. Bir cihaz iş parçacığı ileti almaya hazır olduğunda IoT hub'ı durumu Görünmez olarak ayarlayarak iletiyi kilitler. Bu durum, cihazdaki diğer iş parçacıklarının diğer iletileri almaya başlamasını sağlar. Bir cihaz iş parçacığı iletinin işlenmesini tamamladığında, iletiyi tamamlayarak IoT hub'ına bildirimde bulunur. Ardından IoT hub'ı durumu Tamamlandı olarak ayarlar.

Bir cihaz şunları da yapabilir:

  • IoT hub'ını Teslim edilemeyen harf durumuna ayarlamasına neden olan iletiyi reddedin. Bu iletileri kurtarmak için teslim edilemeyen ileti kuyruğu yok. Message Queuing Telemetri Aktarımı (MQTT) protokolü üzerinden bağlanan cihazlar buluttan cihaza iletileri reddedemez.

  • Durumu Enqueued olarak ayarlanmış şekilde IoT hub'sının iletiyi yeniden kuyruğa koymasına neden olan iletiyi bırakın. MQTT protokolü üzerinden bağlanan cihazlar buluttan cihaza iletileri bırakamaz.

bir iş parçacığı IoT hub'ına bildirmeden bir iletiyi işleyemedi. Bu durumda, görünürlük zaman aşımına uğradıktan (veya zaman aşımını kilitledikten) sonra iletiler otomatik olarak Görünmez durumundan Sıralı duruma geri döner. Bu zaman aşımının uzunluğu bir dakikadır ve değiştirilemez.

IoT hub'ının maksimum teslim sayısı özelliği, bir iletinin Enqueued ve Invisible durumları arasında en fazla kaç kez geçiş yapabileceğinizi belirler. Bu sayıda geçiş sonrasında IoT hub'ı iletinin durumunu Teslim Edilemeyen olarak ayarlar. Benzer şekilde, IoT hub'ı bir iletinin durumunu son kullanma tarihinden sonra Teslim Edilemeyen olarak ayarlar.

İleti kaybı uygulama mantığını etkilemediğinde bir cihaz normalde buluttan cihaza iletisini tamamlar. Bu tamamlama işlemine örnek olarak, cihaz ileti içeriğini yerel olarak kalıcı hale geldi veya bir işlemi başarıyla yürütdü. İleti, kayıpları uygulamanın işlevselliğini etkilemeyen geçici bilgiler de taşıyabilir. Bazen, uzun süre çalışan görevler için şunları yapabilirsiniz:

  • Cihaz görev açıklamasını yerel depolamada kalıcı hale geldikten sonra buluttan cihaza iletisini tamamlayın.

  • Görevin ilerlemesinin çeşitli aşamalarında bir veya daha fazla cihazdan buluta iletiyle çözüm arka ucuna bildirimde bulunun.

İleti süre sonu (yaşam süresi)

Her buluttan cihaza iletinin bir süre sonu vardır. Bu süre aşağıdaki seçeneklerden biri tarafından ayarlanır:

  • Hizmetteki ExpiryTimeUtc özelliği
  • IoT hub'ı, ioT hub özelliği olarak belirtilen varsayılan yaşam süresini kullanarak

İleti süre sonu hakkında daha fazla bilgi için bkz . Buluttan cihaza yapılandırma seçenekleri.

İleti süresinin dolmasından yararlanmanın ve bağlantısı kesilmiş cihazlara ileti gönderilmesini önlemenin yaygın yollarından biri, canlı değerlere kısa süre ayarlamaktır. Bu yaklaşım, cihaz bağlantı durumunu korumakla aynı sonucu elde eder, ancak daha verimlidir. İleti bildirimleri istediğinizde IoT hub'ı size hangi cihazların olduğunu bildirir:

  • İletiler alınabiliyor.
  • Çevrimiçi değil veya başarısız oldu.

İleti geri bildirimi

Buluttan cihaza bir ileti gönderdiğinizde, hizmet bu iletinin son durumuyla ilgili ileti başına geri bildirimin teslimini isteyebilir. Aşağıdaki dört değerden birine gönderilen buluttan cihaza iletide iothub-ack uygulama özelliğini ayarlayarak ileti geri bildirimini yapılandırabilirsiniz:

Ack özellik değeri Davranış
yok Varsayılan. IoT hub'ı geri bildirim iletisi oluşturmaz.
pozitif Buluttan cihaza ileti Tamamlandı durumuna ulaşırsa IoT hub'ı bir geri bildirim iletisi oluşturur.
negatif Buluttan cihaza ileti Ölü harfi durumuna ulaşırsa IoT hub'ı bir geri bildirim iletisi oluşturur.
tam IoT hub'ı her iki durumda da bir geri bildirim iletisi oluşturur.

Ack özellik değeri tam olarak ayarlandıysa ve geri bildirim iletisi almıyorsanız, geri bildirim iletisinin süresi dolmuş demektir. Hizmet, özgün iletiye ne olduğunu bilemez. Uygulamada bir hizmet, süresi dolmadan önce geri bildirimi işleyebilmesini sağlamalıdır. En fazla süre sonu süresi iki gündür ve bu da bir hata oluştuğunda hizmetin yeniden çalıştırılması için zaman bırakır.

Uç Noktalarda açıklandığı gibi IoT hub'ı hizmete yönelik bir uç nokta (/messages/servicebound/feedback) üzerinden ileti olarak geri bildirim sunar. Geri bildirim alma semantiği, buluttan cihaza iletilerle aynıdır. Mümkün olduğunda, ileti geri bildirimi aşağıdaki biçimde tek bir iletide toplu olarak oluşturulur:

Özellik Açıklama
EnqueuedTime Geri bildirim iletisinin hub tarafından ne zaman alındığını gösteren zaman damgası.
Kullanıcı Kimliği {iot hub name}
ContentType application/vnd.microsoft.iothub.feedback.json

Sistem, toplu iş 64 iletiye ulaştığında veya son gönderilen iletiden 15 saniye içinde (hangisi önce gelirse) geri bildirim gönderir.

Gövde, her biri aşağıdaki özelliklere sahip JSON serileştirilmiş bir kayıt dizisidir:

Özellik Açıklama
enqueuedTimeUtc İletinin sonucunun ne zaman gerçekleştiğini gösteren zaman damgası. Örneğin, hub'ın geri bildirim iletisini aldığı veya özgün iletinin süresinin ne zaman dolduğunu gösteren bir zaman damgası.
originalMessageId Bu geri bildirim bilgilerinin ilişkilendirildiği buluttan cihaza iletisinin MessageId değeri.
statusCode IoT hub'ı tarafından oluşturulan geri bildirim iletilerinde kullanılan gerekli bir dize:
Başarı
Süresi Doldu
DeliveryCountExceeded
Reddedildi
Tasfiye
açıklama StatusCode için dize değerleri.
deviceId Bu geri bildirim parçasının ilişkilendirildiği buluttan cihaza iletisinin hedef cihazının DeviceId değeri.
deviceGenerationId Bu geri bildirim parçasının ilişkilendirildiği buluttan cihaza iletisinin hedef cihazının DeviceGenerationId değeri.

Buluttan cihaza iletisinin geri bildirimini özgün iletiyle ilişkilendirebilmesi için hizmetin bir MessageId belirtmesi gerekir.

Geri bildirim iletisinin gövdesi aşağıdaki kod örneğinde gösterilmiştir:

[
  {
    "originalMessageId": "0987654321",
    "enqueuedTimeUtc": "2015-07-28T16:24:48.789Z",
    "statusCode": "Success",
    "description": "Success",
    "deviceId": "123",
    "deviceGenerationId": "abcdefghijklmnopqrstuvwxyz"
  },
  {
    ...
  },
  ...
]

Silinen cihazlar için bekleyen geri bildirim

Bir cihaz silindiğinde, bekleyen geri bildirimler de silinir. Cihaz geri bildirimi toplu olarak gönderilir. Genellikle bir saniyeden kısa olan dar bir pencere, bir cihazın iletinin alınıp alınıp onaylanmadığında ve bir sonraki geri bildirim toplu işleminin hazırlanması arasında gerçekleşebilir. Bu dar pencerede bir cihaz silinirse geri bildirim gerçekleşmez.

Cihazınızı silmeden önce bekleyen geri bildirimlerin gelmesini bir süre bekleyerek bu davranışı giderebilirsiniz. Cihaz silindikten sonra ilgili ileti geri bildiriminin kaybolduğu varsayılmalıdır.

Buluttan cihaza yapılandırma seçenekleri

Her IoT hub'ı, buluttan cihaza mesajlaşma için aşağıdaki yapılandırma seçeneklerini kullanıma sunar:

Özellik Açıklama Aralık ve varsayılan
defaultTtlAsIso8601 Buluttan cihaza iletiler için varsayılan TTL İki güne kadar ISO_8601 aralık (en az bir dakika); varsayılan: bir saat
maxDeliveryCount Cihaz başına buluttan cihaza kuyruklar için en yüksek teslim sayısı 1 ile 100; varsayılan: 10
feedback.ttlAsIso8601 Hizmete bağlı geri bildirim iletileri için bekletme İki güne kadar ISO_8601 aralık (en az bir dakika); varsayılan: bir saat
feedback.maxDeliveryCount Geri bildirim kuyruğu için en yüksek teslim sayısı 1 ile 100; varsayılan: 10
feedback.lockDurationAsIso8601 Geri bildirim kuyruğunun süresini kilitleme 5 ile 300 saniye (en az beş saniye) arasında ISO_8601 aralığı; varsayılan: 60 saniye.

Yapılandırma seçeneklerini Azure portalında veya Azure CLI'da ayarlayabilirsiniz:

  • Azure portalı: IoT hub'ınızdaki Hub ayarları'nın altında Yerleşik uç noktalar'ı seçin ve Buluttan cihaza mesajlaşma'ya gidin. (feedback.maxDeliveryCount ve feedback.lockDurationAsIso8601 özelliklerinin ayarlanması şu anda Azure portalında desteklenmemektedir.)

    Portalda buluttan cihaza mesajlaşma için yapılandırma seçeneklerini ayarlama

  • Azure CLI: az iot hub update komutunu kullanın:

    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.defaultTtlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.ttlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.lockDurationAsIso8601=PT0H1M0S
    

Sonraki adımlar

Buluttan cihaza iletileri işlemek için kullanabileceğiniz SDK'lar hakkında bilgi için bkz . Azure IoT Hub SDK'ları.

Buluttan cihaza iletileri işleyen uygulamalar geliştirme konusunda rehberlik için bkz . Buluttan cihaza iletileri gönderme ve alma.