MQTT protokolünü kullanarak IoT hub'ı ile iletişim kurma

IoT Hub, cihazların aşağıdaki kullanarak cihaz uç IoT Hub iletişim kurmasına olanak tanır:

IoT Hub, tam özellikli bir MQTT aracısı değildir ve MQTT v3.1.1 standart sürümünde belirtilen tüm davranışları desteklemez. Bu makalede, cihazların ağ ile iletişim kurmak için desteklenen MQTT davranışlarını nasıl IoT Hub.

Not

Bu makalede bahsedilen, buluttan cihaza mesajlaşma, cihaz iksi ve cihaz yönetimi gibi özelliklerden bazıları yalnızca standart IoT Hub standart katmanında kullanılabilir. Temel ve standart IoT Hub katmanları hakkında daha fazla bilgi için bkz. Doğru IoT Hub katmanını seçme.

Uygulamayla tüm cihaz IoT Hub TLS/SSL kullanılarak güvenli hale getirildi. Bu IoT Hub 1883 bağlantı noktası üzerinden güvenli olmayan bağlantıları desteklemez.

IoT Hub'a bağlanma

Bir cihaz, aşağıdaki seçeneklerden birini kullanarak bir IoT hub'a bağlanmak için MQTT protokolünü kullanabilir.

MQTT bağlantı noktası (8883), birçok kurumsal ve eğitim ağ ortamlarında engellenir. Güvenlik duvarınız içinde 8883 bağlantı noktasını açamadıysanız, Web Yuvaları üzerinden MQTT'nin kullanılması önerilir. Web Yuvaları üzerinden MQTT, ağ ortamlarında neredeyse her zaman açık olan 443 bağlantı noktası üzerinden iletişim kurar. Azure IoT SDK'larını kullanırken Web Yuvaları üzerinden MQTT ve MQTT protokollerini belirtmeyi öğrenmek için bkz. Cihaz SDK'larını kullanma.

Cihaz SDK'larını kullanma

MQTT protokolünü destekleyen cihaz CD'leri Java, Node.js, C, C# ve Python için kullanılabilir. Cihaz SDK'leri, IoT hub'IoT Hub bağlantı kurmak için standart bağlantı dizesini kullanır. MQTT protokolünü kullanmak için istemci protokolü parametresi MQTT olarak ayar olmalıdır. MQTT'i istemci protokolü parametresinde Web Yuvaları üzerinden de belirtsiniz. Varsayılan olarak, cihaz SDK'leri CleanSession bayrağı 0 olarak ayarlanmış bir IoT Hub'a bağlanıyor ve IoT hub'ı ile ileti alışverişi için QoS 1'i kullanıyor. Daha hızlı ileti alışverişi için QoS 0'ın yapılandırılması mümkün ancak teslimin garanti veya kabul edilemez olduğunu unutmayın. Bu nedenle QoS 0 genellikle "yangın ve unut" olarak adlandırılır.

Bir cihaz bir IoT hub'a bağlandığında, cihaz SDK'leri cihazın bir IoT hub'ı ile ileti değişimini sağlayan yöntemler sağlar.

Aşağıdaki tablo, desteklenen her dil için kod örneklerinin bağlantılarını içerir ve MQTT veya Web Yuvaları üzerinden MQTT protokolünü kullanarak IoT Hub bağlantı kurmak için kullanılacak parametreyi belirtir.

Dil MQTT protokol parametresi Web Yuvaları üzerinden MQTT protokol parametresi
Node.js azure-iot-device-mqtt. Mqtt azure-iot-device-mqtt. MqttWs
Java IotHubClientProtocol. MQTT IotHubClientProtocol.MQTT_WS
C MQTT_Protocol MQTT_WebSocket_Protocol
C# TransportType. Mqtt MQTT başarısız olursa TransportType.Mqtt, Web Yuvaları üzerinden MQTT'ye geri döner. MQTT'i yalnızca Web Yuvaları üzerinden belirtmek için TransportType.Mqtt_WebSocket_Only
Python Varsayılan olarak MQTT'i destekler İstemciyi websockets=True oluşturmak için çağrısına ekleme

Aşağıdaki parça, Azure IoT Node.js SDK'sı kullanırken Web Yuvaları protokolü üzerinden MQTT'nin nasıl belirt Node.js gösterir:

var Client = require('azure-iot-device').Client;
var Protocol = require('azure-iot-device-mqtt').MqttWs;
var client = Client.fromConnectionString(deviceConnectionString, Protocol);

Aşağıdaki parçada, Azure IoT Python SDK'sı kullanırken Web Yuvaları protokolü üzerinden MQTT'nin nasıl belirt kurallarından birini belirtebilirsiniz:

from azure.iot.device.aio import IoTHubDeviceClient
device_client = IoTHubDeviceClient.create_from_connection_string(deviceConnectionString, websockets=True)

Varsayılan canlı tutma zaman aşımı

İstemci/ağ bağlantısının IoT Hub sağlamak için, hem hizmet hem de istemci düzenli olarak birbirine bir canlı tutma ping'i gönderir. IoT SDK'sı kullanan istemci, aşağıdaki tabloda tanımlanan aralıkta bir canlı tutma gönderir:

Dil Varsayılan canlı tutma aralığı Yapılandırılabilir
Node.js 180 saniye No
Java 230 saniye No
C 240 saniye Evet
C# 300 saniye Evet
Python 60 saniye No

MQTT özelimininardından, IoT Hub tutma ping aralığı istemcinin canlı tutma değerinin 1,5 katıdır. Ancak IoT Hub azure hizmetleri 29,45 dakika olan Azure yük dengeleyici TCP boşta kalma zaman aşımına bağlı olduğundan sunucu tarafı zaman aşımı üst sınırı 29,45 dakika (1767 saniye) olarak sınırlandı.

Örneğin, Java SDK'sı kullanan bir cihaz canlı tutma ping'ini gönderir ve ağ bağlantısını kaybeder. 230 saniye sonra cihaz çevrimdışı olduğu için canlı tutma ping'ini kaçırır. Ancak IoT Hub hemen kapanmaz; (230 * 1.5) - 230 = 115 DeviceConnectionClosedRemotelyhatasıyla cihazın bağlantısını kesmeden önce 404104 saniye bekler.

Ayarlayabiliyor maksimum istemci keep-alive değeri 1767 / 1.5 = 1177 saniyedir. Tüm trafik canlı tutmayı sıfırlar. Örneğin başarılı bir SAS belirteci yenilemesi, canlı tutmayı sıfırlar.

Cihaz uygulamasını AMQP'den MQTT'ye uygulama

Cihaz SDK'larını kullanıyorsanız,AMQP'den MQTT'ye geçiş yapmak için daha önce belirtildiği gibi istemci başlatmada protokol parametresinin değiştirilmesi gerekir.

Bunu yaparken aşağıdaki öğeleri kontrol edin:

  • MQTT bağlantıyı sonlandırılırken AMQP birçok durumda hata döndürür. Sonuç olarak, özel durum işleme mantığınız bazı değişiklikler gerekli olabilir.

  • MQTT, buluttan cihaza iletileri alırken reddetme işlemlerini desteklemez. Arka uç uygulamanıza cihaz uygulamasından yanıt almak gerekirse doğrudan yöntemlerini kullanmayı göz önünde bulundurabilirsiniz.

  • AMQP, Python SDK'da desteklenmiyor.

Azure IoT SDK'sı olmadan MQTT kullanan C örneği

IoT MQTTÖrnek deposunda, Azure IoT C SDK'sı kullanmadan telemetri iletileri göndermeyi ve IoT hub'ı ile olayları almayı gösteren birkaç C/C++ tanıtım projesi bulabilirsiniz.

Bu örnekler, IoT hub'ına uygulanan MQTT Aracısı'ne ileti göndermek için Eclipse Mosquitto kitaplığını kullanır.

Örnekleri Azure IoT Tak Çalıştır kurallarına göre uyarlama hakkında bilgi edinmek için bkz. Öğretici - MQTT kullanarak IoT Tak Çalıştır istemcisini geliştirme.

Bu depo şunları içerir:

Windows için:

  • TelemetryMQTTWin32: Azure IoT hub'a bir telemetri iletisi göndermek için bir kod içerir ve bu ileti makinede Windows içerir.

  • SubscribeMQTTWin32: Bir sanal makinede verilen IoT hub'larının olaylarını Windows içerir.

  • DeviceTwinMQTTWin32: Bir cihaz makinesi üzerinde Azure IoT hub'larında bir cihazın cihaz ikizi olaylarını sorgulamak ve buna abone olmak için Windows içerir.

  • PnPMQTTWin32: IoT Tak Çalıştır cihaz özelliklerine sahip bir telemetri iletisi göndermek için bir Azure IoT hub'ında yerleşik ve Windows içerir. Daha fazla bilgi için IoT Tak Çalıştır

Linux için:

  • MQTTLinux: Linux üzerinde çalıştıracak kod ve derleme betiği içerir (şimdiye kadar WSL, Ubuntu ve Raspbian test edilmiştir).

  • LinuxConsoleVS2019: aynı kodu, ancak wsl hedefleme (Windows Linux alt sistemi) bir VS2019 projesinde içerir. Bu proje, Linux üzerinde çalışan kodun Visual Studio adım adım hata ayıklamanıza olanak tanır.

Mosquitto_pub için:

Bu klasör, Mosquitto.org tarafından sağlanan mosquitto_pub yardımcı program aracıyla kullanılan iki örnek komut içerir.

  • Mosquitto_sendmessage: bir Azure IoT Hub 'ına cihaz olarak davranan basit bir kısa mesaj göndermek için.

  • Mosquitto_subscribe: bir Azure IoT Hub 'ında gerçekleşen olayları görmek için.

MQTT protokolünü doğrudan kullanma (cihaz olarak)

Bir cihaz, cihaz SDK 'larını kullanalamazsanız, bağlantı noktası 8883 üzerindeki MQTT protokolünü kullanarak ortak cihaz uç noktalarına bağlanabilir. Bağlantı paketinde, cihaz aşağıdaki değerleri kullanmalıdır:

  • ClientID alanı Için, DeviceID'yi kullanın.

  • Kullanıcı adı alanı için, {iothubhostname}/{device_id}/?api-version=2018-06-30 , {iothubhostname} IoT Hub 'ının tam CNAME 'i olan öğesini kullanın.

    Örneğin, IoT Hub 'ınızın adı contoso.Azure-Devices.net ise ve cihazınızın adı MyDevice01 Ise, tam Kullanıcı adı alanı şunları içermelidir:

    contoso.azure-devices.net/MyDevice01/?api-version=2018-06-30

    Alana api-Version eklenmesi önemle önerilir. Aksi takdirde, beklenmeyen davranışlara neden olabilir.

  • Parola alanı IÇIN bir SAS belirteci kullanın. SAS belirtecinin biçimi hem HTTPS hem de AMQP protokolleriyle aynıdır:

    SharedAccessSignature sig={signature-string}&se={expiry}&sr={URL-encoded-resourceURI}

    Not

    X. 509.952 sertifikası kimlik doğrulamasını kullanıyorsanız SAS belirteç parolaları gerekmez. Daha fazla bilgi için bkz. Azure IoT Hub 'Da X. 509.440 güvenliğini ayarlama ve TLS/SSL yapılandırma bölümündekod yönergelerini izleme.

    SAS belirteçleri oluşturma hakkında daha fazla bilgi için IoT Hub güvenlik belirteçlerini kullanmakonusunun cihaz bölümüne bakın.

    test edilirken, kendi kodunuza kopyalayabilir ve yapıştırabileceğiniz bir sas belirtecini hızlıca oluşturmak için az ıot hub generate-sas-token komutunu Visual Studio Code için platformlar arası Azure IoT Tools de kullanabilirsiniz.

Azure IoT Tools için

  1. Visual Studio Code sol alt köşesindeki Azure ıOT hub cihazları sekmesini genişletin.

  2. Cihazınıza sağ tıklayın ve cihaz IÇIN SAS belirteci oluştur' u seçin.

  3. Süre sonu saatini ayarlayın ve ' Enter ' tuşuna basın.

  4. SAS belirteci oluşturulup panoya kopyalanır.

    Oluşturulan SAS belirteci aşağıdaki yapıya sahiptir:

    HostName={your hub name}.azure-devices.net;DeviceId=javadevice;SharedAccessSignature=SharedAccessSignature sr={your hub name}.azure-devices.net%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

    Bu belirtecin MQTT kullanarak bağlanmak için parola alanı olarak kullanılacak bölümü:

    SharedAccessSignature sr={your hub name}.azure-devices.net%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

MQTT paketleri bağlama ve bağlantısını kesme için, IoT Hub Işlemler izleme kanalında bir olay yayınlar. Bu olay, bağlantı sorunlarını gidermenize yardımcı olabilecek ek bilgiler içerir.

Cihaz uygulaması, Connect paketinde bir yapılacak ileti belirtebilir. Cihaz uygulaması, veya ' i kullanarak, devices/{device_id}/messages/events/ devices/{device_id}/messages/events/{property_bag} bir telemetri iletisi olarak Iletilecek iletiler olacak şekilde görüntülenecek konu adı olarak kullanılmalıdır. Bu durumda, ağ bağlantısı kapatılırsa, ancak cihazdan bir bağlantı kesme paketi daha önce alınmıyorsa IoT Hub, Connect paketinde sağlanan yapılacak iletiyi telemetri kanalına gönderir. Telemetri kanalı, varsayılan Olaylar uç noktası ya da IoT Hub yönlendirme tarafından tanımlanan özel bir uç nokta olabilir. İleti, bir değeri olan ıothub-MessageType özelliğine sahip olur .

MQTT protokolünü doğrudan kullanma (modül olarak)

Modül kimliğini kullanarak MQTT üzerinden IoT Hub bağlantı, cihaza benzerdir ( MQTT protokolünü doğrudan bir cihaz olarak kullanma bölümündeaçıklanmıştır), ancak aşağıdakileri kullanmanız gerekir:

  • İstemci KIMLIĞINI olarak ayarlayın {device_id}/{module_id} .

  • Kullanıcı adı ve parolayla kimlik doğrulaması yapıyorsa, Kullanıcı adını olarak ayarlayın <hubname>.azure-devices.net/{device_id}/{module_id}/?api-version=2018-06-30 ve parola olarak modül kimliğiyle ILIŞKILI SAS belirtecini kullanın.

  • devices/{device_id}/modules/{module_id}/messages/events/Telemetri yayımlamak için konu olarak kullanın.

  • devices/{device_id}/modules/{module_id}/messages/events/Bu konu başlığı altında kullanın.

  • İkizi GET ve PATCH konuları modüller ve cihazlar için aynıdır.

  • İkizi durumu konusu modüller ve cihazlar için aynıdır.

TLS/SSL yapılandırması

MQTT protokolünü doğrudan kullanmak için, istemciniz TLS/SSL üzerinden bağlanmalıdır. Bu adımı atlama denemeleri bağlantı hatalarıyla başarısız olur.

Bir TLS bağlantısı kurmak için DigiCert Baltidaha daha fazla kök sertifikasını indirmeniz ve başvurmanız gerekebilir. Bu sertifika, Azure 'un bağlantıyı güvenli hale getirmek için kullandığı bir sertifikadır. Bu sertifikayı Azure-IoT-SDK-c deposunda bulabilirsiniz. Bu sertifikalar hakkında daha fazla bilgi, DigiCert 'ın Web sitesindebulunabilir.

Bunu, tutulma temeli tarafından PAHO MQTT kitaplığı 'nın Python sürümü kullanarak nasıl uygulayacağınızı gösteren bir örnek aşağıdaki gibi görünebilir.

İlk olarak, komut satırı ortamınızdan PAHO kitaplığı 'nı yükleme:

pip install paho-mqtt

Ardından, istemcisini bir Python betiğine uygulayın. Yer tutucuları aşağıdaki gibi değiştirin:

  • <local path to digicert.cer> , DigiCert Baltidaha fazla kök sertifikasını içeren yerel bir dosyanın yoludur. Bu dosyayı, sertifika bilgilerini C için Azure IoT SDK 'sindeki CERT. c ' den kopyalayarak oluşturabilirsiniz. satırları -----BEGIN CERTIFICATE----- ve -----END CERTIFICATE----- " her satırın başındaki ve sonundaki işaretleri kaldırın ve \r\n her satırın sonundaki karakterleri kaldırın.

  • <device id from device registry> , IoT Hub 'ınıza eklediğiniz bir cihazın KIMLIĞIDIR.

  • <generated SAS token> , bu makalede daha önce açıklandığı gibi oluşturulan cihaz için bir SAS belirtecidir.

  • <iot hub name> IoT Hub 'ınızın adı.

from paho.mqtt import client as mqtt
import ssl

path_to_root_cert = "<local path to digicert.cer file>"
device_id = "<device id from device registry>"
sas_token = "<generated SAS token>"
iot_hub_name = "<iot hub name>"


def on_connect(client, userdata, flags, rc):
    print("Device connected with result code: " + str(rc))


def on_disconnect(client, userdata, rc):
    print("Device disconnected with result code: " + str(rc))


def on_publish(client, userdata, mid):
    print("Device sent message")


client = mqtt.Client(client_id=device_id, protocol=mqtt.MQTTv311)

client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish

client.username_pw_set(username=iot_hub_name+".azure-devices.net/" +
                       device_id + "/?api-version=2018-06-30", password=sas_token)

client.tls_set(ca_certs=path_to_root_cert, certfile=None, keyfile=None,
               cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
client.tls_insecure_set(False)

client.connect(iot_hub_name+".azure-devices.net", port=8883)

client.publish("devices/" + device_id + "/messages/events/", '{"id":123}', qos=1)
client.loop_forever()

Bir cihaz sertifikası kullanarak kimlik doğrulaması yapmak için yukarıdaki kod parçacığını aşağıdaki değişikliklerle güncelleştirin (bkz. sertifika tabanlı kimlik doğrulamasına hazırlanma hakkında bir X. 509.952 CA sertifikası alma ):

# Create the client as before
# ...

# Set the username but not the password on your client
client.username_pw_set(username=iot_hub_name+".azure-devices.net/" +
                       device_id + "/?api-version=2018-06-30", password=None)

# Set the certificate and key paths on your client
cert_file = "<local path to your certificate file>"
key_file = "<local path to your device key file>"
client.tls_set(ca_certs=path_to_root_cert, certfile=cert_file, keyfile=key_file,
               cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)

# Connect as before
client.connect(iot_hub_name+".azure-devices.net", port=8883)

Cihazdan buluta iletiler gönderme

Başarılı bir bağlantı yaptıktan sonra, bir cihaz IoT Hub devices/{device_id}/messages/events/ devices/{device_id}/messages/events/{property_bag} bir Konu adı olarak veya kullanarak ileti gönderebilir. {property_bag}Öğesi, cihazın URL kodlamalı bir biçimde ek özelliklerle ileti göndermesini sağlar. Örnek:

RFC 2396-encoded(<PropertyName1>)=RFC 2396-encoded(<PropertyValue1>)&RFC 2396-encoded(<PropertyName2>)=RFC 2396-encoded(<PropertyValue2>)…

Not

Bu {property_bag} öğe, https protokolünde sorgu dizeleriyle aynı kodlamayı kullanır.

IoT Hub uygulamaya özgü davranışların bir listesi aşağıda verilmiştir:

  • IoT Hub, QoS 2 iletilerini desteklemez. Bir cihaz uygulaması QoS 2 ile bir ileti yayımladığında, IoT Hub ağ bağlantısını kapatır.

  • IoT Hub iletileri kalıcı olarak sürdürmez. Bir cihaz, bekletme bayrağı 1 olarak ayarlanmış bir ileti gönderirse IoT Hub MQTT uygulama özelliğini iletiye ekler. Bu durumda, bekletme iletisini kalıcı hale getirmeniz yerine IoT Hub arka uç uygulamasına geçirir.

  • IoT Hub, cihaz başına yalnızca bir etkin MQTT bağlantısını destekler. Aynı cihaz KIMLIĞI adına yapılan tüm yeni MQTT bağlantıları, IoT Hub var olan bağlantıyı başlatmasına neden olur ve 400027 Connectionforcefullyıclosedonnewconnection IoT Hub günlüklerde oturum açar

Daha fazla bilgi için bkz. mesajlaşma Geliştirici Kılavuzu.

Buluttan cihaza iletileri alma

IoT Hub ileti almak için, bir cihazın devices/{device_id}/messages/devicebound/# bir Konu filtresi olarak kullanarak abone olması gerekir. Konu filtresindeki çok düzeyli joker karakter # Yalnızca cihazın konu adında ek özellikler almasına izin vermek için kullanılır. IoT Hub, alt # ? konuların filtrelenmesi için veya joker karakterlerinden kullanılmasına izin vermez. IoT Hub, genel amaçlı bir yayın-Sub mesajlaşma Aracısı olmadığından, yalnızca belgelenen konu adlarını ve konu filtrelerini destekler.

Cihaz, konu filtresiyle temsil edilen cihaza özgü uç noktaya başarıyla abone olana kadar IoT Hub ileti almaz devices/{device_id}/messages/devicebound/# . Abonelik kurulduktan sonra cihaz, abonelik zamanından sonra kendisine gönderilen buluttan cihaza iletiler alır. Cihaz Cleansession bayrağı 0 olarak ayarlandıysa, abonelik farklı oturumlarda kalıcı hale getirilir. Bu durumda, cihazın bir dahaki sefer Cleansession 0 ile bağlanması, bağlantısı kesilirken kendisine gönderilen bekleyen iletileri alır. Cihaz, Cleansession bayrağını 1 olarak ayarlandıysa, cihaz uç noktasına abone olana kadar IoT Hub ileti almaz.

IoT Hub, Konu adı ile devices/{device_id}/messages/devicebound/ veya devices/{device_id}/messages/devicebound/{property_bag} ileti özellikleri olduğunda iletileri teslim eder. {property_bag} ileti özelliklerinin URL kodlamalı anahtar/değer çiftlerini içerir. Özellik paketine yalnızca uygulama özellikleri ve Kullanıcı tarafından ayarlanabilir sistem özellikleri (örneğin, MessageID veya bağıntıkimliği) dahil edilir. Sistem özelliği adlarının öneki vardır $ , uygulama özellikleri ön ek olmadan özgün özellik adını kullanır. Özellik paketi biçimi hakkında daha fazla bilgi için bkz. cihazdan buluta Iletiler gönderme.

Buluttan cihaza iletilerde, özellik çantasındaki değerler aşağıdaki tabloda olarak temsil edilir:

Özellik değeri İmle Description
null key Özellik paketinde yalnızca anahtar görünür
boş dize key= Bu anahtar, değer olmadan eşittir işareti izler
null olmayan, boş olmayan değer key=value Ardından bir eşittir işareti ve değeri

Aşağıdaki örnek, üç uygulama özelliği içeren bir özellik paketini gösterir: Prop1 değeri ile null Prop2, boş bir dize (""); ve "bir String" değeri ile Prop3 .

/?prop1&prop2=&prop3=a%20string

Bir cihaz uygulaması QoS 2 ile bir konuya abone olduğunda IoT Hub, suback paketinde en fazla QoS düzey 1 ' i verir. Bundan sonra, IoT Hub QoS 1 kullanarak cihaza ileti teslim eder.

Cihaz ikizi özelliklerini alma

İlk olarak, bir $iothub/twin/res/# cihaz, işlem yanıtlarını almak için 'ye abone olur. Ardından, konu başlığına istek kimliği için $iothub/twin/GET/?$rid={request id} doldurulmuş bir değerle boş bir ileti gönderir. Ardından hizmet, istekle aynı istek kimliğini kullanarak konu başlığında cihaz $iothub/twin/res/{status}/?$rid={request id} ikizi verilerini içeren bir yanıt iletisi gönderir.

İstek Kimliği, bir ileti özelliği değeri için, IoT Hub geliştirici kılavuzuna göre geçerli bir değer olabilir ve durum bir tamsayı olarak doğrulanır.

Yanıt gövdesi, aşağıdaki yanıt örneğinde gösterildiği gibi cihaz ikizin özellikler bölümünü içerir:

{
    "desired": {
        "telemetrySendFrequency": "5m",
        "$version": 12
    },
    "reported": {
        "telemetrySendFrequency": "5m",
        "batteryLevel": 55,
        "$version": 123
    }
}

Olası durum kodları:

Durum Açıklama
200 Başarılı
429 Veri azaltmaya göre çok fazla istek IoT Hub (kısıtlandı)
5** Sunucu hataları

Daha fazla bilgi için Cihaz ikizleri geliştirici kılavuzuna bakın.

Cihaz ikizlerinin bildirilen özelliklerini güncelleştirme

Bildirilen özellikleri güncelleştirmek için cihaz, belirlenen bir MQTT IoT Hub üzerinden bir yayın aracılığıyla bir istekte bulunuyor. İstek işleme alındıktan sonra IoT Hub, güncelleştirme işleminin başarı veya başarısızlık durumunu başka bir konuya yayın aracılığıyla yanıt verir. Bu konu, ikizi güncelleştirme isteğinin sonucu hakkında bilgi almak için cihaz tarafından abone olabilir. MQTT'de bu tür bir istek/yanıt etkileşimi uygulamak için, güncelleştirme isteğinde cihaz tarafından başlangıçta sağlanan istek kimliği ( $rid ) ifadesini kullanıyoruz. Bu istek kimliği, cihazın yanıtı önceki istekle IoT Hub izin vermek için bu istek kimliğinden gelen yanıta da dahil edilir.

Aşağıdaki dizi, bir cihazın cihaz ikizi içinde bildirilen özellikleri IoT Hub:

  1. Cihazın bir cihazdan işlem $iothub/twin/res/# yanıtlarını almak için önce konuya abone IoT Hub.

  2. Cihaz, konu başlığına cihaz ikizi güncelleştirmesini içeren bir ileti $iothub/twin/PATCH/properties/reported/?$rid={request id} gönderir. Bu ileti bir istek kimliği değeri içerir.

  3. Ardından hizmet, konu başlığında bildirilen özellikler koleksiyonu için yeni ETag değerini içeren bir yanıt iletisi $iothub/twin/res/{status}/?$rid={request id} gönderir. Bu yanıt iletisi istekle aynı istek kimliğini kullanır.

İstek iletisi gövdesi, bildirilen özellikler için yeni değerler içeren bir JSON belgesi içerir. JSON belgesinde yer alan her üye, cihaz ikizin belgesine ekleyebilirsiniz. Üyeyi içeren null nesneden silen bir üye kümesi. Örnek:

{
    "telemetrySendFrequency": "35m",
    "batteryLevel": 60
}

Olası durum kodları:

Durum Açıklama
204 Başarılı (hiçbir içerik döndürüldü)
400 Hatalı İstek. Hatalı Biçimlendirilmiş JSON
429 Veri azaltmaya göre çok fazla istek IoT Hub (kısıtlandı)
5** Sunucu hataları

Aşağıdaki Python kod parçacığı, ikiz tarafından bildirilen özellikleri MQTT üzerinden güncelleştirme işlemini gösterir (Paho MQTT istemcisi kullanılarak):

from paho.mqtt import client as mqtt

# authenticate the client with IoT Hub (not shown here)

client.subscribe("$iothub/twin/res/#")
rid = "1"
twin_reported_property_patch = "{\"firmware_version\": \"v1.1\"}"
client.publish("$iothub/twin/PATCH/properties/reported/?$rid=" +
               rid, twin_reported_property_patch, qos=0)

Yukarıdaki ikiz bildirilen özellikler güncelleştirme işlemi başarılı olduktan sonra, IoT Hub'dan gelen yayın iletisi şu konuya sahip olur: , burada başarıyı gösteren durum kodudur, kodda cihaz tarafından sağlanan istek kimliğine karşılık gelen ve güncelleştirmeden sonra cihaz ikizlerinin bildirilen özellikler bölümünün sürümüne karşılık gelen $iothub/twin/res/204/?$rid=1&$version=6 204 durum $rid=1 $version kodudur.

Daha fazla bilgi için Cihaz ikizleri geliştirici kılavuzuna bakın.

İstenen özellikleri alma güncelleştirme bildirimleri

Cihaz bağlandığında, IoT Hub çözümün arka ucunda gerçekleştirilen güncelleştirmenin $iothub/twin/PATCH/properties/desired/?$version={new version} içeriğini içeren konu başlığına bildirim gönderir. Örnek:

{
    "telemetrySendFrequency": "5m",
    "route": null,
    "$version": 8
}

Özellik güncelleştirmeleri için null değerler, JSON nesne üyesinin siliniyor olduğu anlamına geliyor. Ayrıca ikizin $version istenen özellikler bölümünün yeni sürümünü de gösterir.

Önemli

IoT Hub yalnızca cihazlar bağlandığında değişiklik bildirimleri üretir. cihaz uygulaması ile cihaz uygulaması arasında istenen özellikleri eşitlenmiş durumda tutmak için cihaz yeniden IoT Hub emin olun.

Daha fazla bilgi için Cihaz ikizleri geliştirici kılavuzuna bakın.

Doğrudan yönteme yanıt verme

İlk olarak, bir cihazın hizmetine abone olmaları $iothub/methods/POST/# gerekir. IoT Hub geçerli bir JSON veya boş bir gövde ile konu $iothub/methods/POST/{method name}/?$rid={request id} başlığına yöntem istekleri gönderir.

Yanıt vermek için cihaz, konu başlığına geçerli bir JSON veya boş gövdeye sahip bir ileti $iothub/methods/res/{status}/?$rid={request id} gönderir. Bu iletide, istek kimliği istek iletisinde yer alan kimlikle eşleşmeli ve durum bir tamsayı olmalıdır.

Daha fazla bilgi için Doğrudan yöntem geliştirici kılavuzuna bakın.

Diğer konular

Son olarak, bulut tarafında MQTT protokol davranışını özelleştirmeniz gerekirse, Azure IoTprotokolü ağ geçidini gözden geçirmeniz gerekir. Bu yazılım, doğrudan ağ geçidi ile arabirim sağlayan yüksek performanslı bir özel protokol ağ geçidi IoT Hub. Azure IoT protokolü ağ geçidi, cihaz protokolünü brownfield MQTT dağıtımları veya diğer özel protokollere uyum sağlayacak şekilde özelleştirmenizi sağlar. Ancak bu yaklaşım, özel bir protokol ağ geçidi çalıştırmanızı ve çalıştırmanızı gerektirir.

Sonraki adımlar

MQTT protokolü hakkında daha fazla bilgi edinmek için MQTT belgelerine bakın.

Dağıtım dağıtımınızı planlama hakkında daha fazla IoT Hub için bkz:

Uygulama yönetiminin özelliklerini daha fazla IoT Hub bkz: