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

IoT Hub, cihazların kullanarak IoT Hub cihaz uç noktalarıyla iletişim kurmasını sağlar:

  • 8883 numaralı bağlantı noktasında MQTT v 3.1.1
  • 443 numaralı bağlantı noktasında WebSocket üzerinden MQTT v 3.1.1.

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 IoT Hub ile iletişim kurmak için desteklenen MQTT davranışlarını nasıl kullanabileceği açıklanır.

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.

IoT Hub ile tüm cihaz iletişimi, TLS/SSL kullanılarak güvenli hale getirilmelidir. Bu nedenle IoT Hub, 1883 numaralı bağlantı noktası üzerinden güvenli olmayan bağlantıları desteklemez.

IoT Hub bağlanılıyor

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

  • Azure IoT SDK'larının kitaplıkları.
  • MQTT protokolü doğrudan.

MQTT bağlantı noktası (8883) birçok kurumsal ve eğitim ağı ortamında engellenir. Güvenlik duvarınızdaki 8883 numaralı bağlantı noktasını açamazsınız, Web Yuvaları üzerinden MQTT kullanmanızı öneririz. Web Yuvaları üzerinden MQTT, ağ ortamlarında neredeyse her zaman açık olan 443 numaralı bağlantı noktası üzerinden iletişim kurar. Azure IoT SDK 'larını kullanırken, Web Sockets protokolleri üzerinden MQTT ve MQTT 'yi belirtmeyi öğrenmek için bkz. cihaz SDK 'Larını kullanma.

Cihaz SDK 'larını kullanma

MQTT protokolünü destekleyen cihaz SDK 'ları , Java, Node.js, C, C# ve Python için kullanılabilir. Cihaz SDK 'Ları, IoT Hub ile bağlantı kurmak için standart IoT Hub bağlantı dizesini kullanır. MQTT protokolünü kullanmak için, istemci protokol parametresi MQTT olarak ayarlanmalıdır. İstemci protokol parametresinde, Web Yuvaları üzerinden MQTT ' i de belirtebilirsiniz. Varsayılan olarak, cihaz SDK 'Ları Cleansession bayrağı 0 olarak ayarlanmış bir IoT Hub bağlanır ve IoT Hub Ile ileti alışverişi için QoS 1 kullanır. Daha hızlı ileti alışverişi için QoS 0 ' ı yapılandırmak mümkün olsa da, teslimin garanti veya onaylanmadığını unutmayın. Bu nedenle, QoS 0 genellikle "yangın ve unut" olarak adlandırılır.

Bir cihaz IoT Hub 'ına bağlandığında cihaz SDK 'Ları, cihazın IoT Hub ile ileti alışverişi için izin veren yöntemler sağlar.

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

Dil MQTT protokol parametresi Web Sockets protokol parametresi üzerinden MQTT
Node.js Azure-IoT-Device-MQTT. MQTT Azure-IoT-Device-MQTT. MqttWs
Java IotHubClientProtocol. MQTT IotHubClientProtocol.MQTT_WS
, MQTT_Protocol MQTT_WebSocket_Protocol
C# TransportType. MQTT TransportType. MQTT, MQTT başarısız olursa Web Yuvaları üzerinden MQTT 'e geri döner. Yalnızca Web Yuvaları üzerinden MQTT belirtmek için TransportType.Mqtt_WebSocket_Only kullanın
Python Varsayılan olarak MQTT 'yi destekler websockets=Trueİstemciyi oluşturmak için çağrıya ekleyin

Aşağıdaki parça, Azure IoT Node.js SDK kullanılırken Web soketi üzerinden MQTT 'in nasıl kullanılacağını göstermektedir:

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ça, Azure IoT Python SDK kullanılırken Web soketi üzerinden MQTT 'in nasıl kullanılacağını göstermektedir:

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

Varsayılan etkin tutma zaman aşımı

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

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

MQTT belirtimininardından IoT Hub etkin tut ping aralığı, istemci canlı tutma değerinin 1,5 katına kaydedilir. Ancak, tüm Azure hizmetleri Azure yük dengeleyici TCP boşta kalma zaman aşımı süresi olan 29,45 (1767 saniye) ile birlikte IoT Hub en fazla sunucu tarafı zaman aşımını 29,45 dakikaya (saniye) sınırlar.

Örneğin, Java SDK 'sını kullanan bir cihaz, etkin tut ping komutunu gönderir ve ardından ağ bağlantısını kaybeder. 230 saniye sonra, cihaz çevrimdışı olduğu için etkin tut ping komutunu yok. Ancak IoT Hub bağlantıyı hemen kapatmaz; (230 * 1.5) - 230 = 115 cihazın bağlantısını kesmeden önce, 404104 Deviceconnectioncloseduzaktanhatası ile daha önce bir saniye bekler.

Ayarlayabileceğiniz maksimum istemci etkin tutma değeri 1767 / 1.5 = 1177 saniyedir. Tüm trafik etkin tut ' a sıfırlanır. Örneğin, başarılı bir SAS belirteci yenilemesi canlı tutmayı sıfırlar.

Bir cihaz uygulamasını AMQP 'den MQTT 'ye geçirme

Cihaz SDK'larını kullanıyorsanız AMQP 'den MQTT 'ye geçiş yapmak, daha önce belirtildiği gibi, istemci başlatmasında protokol parametresinin değiştirilmesini gerektirir.

Bunu yaparken, aşağıdaki öğeleri denetlediğinizden emin olun:

  • AMQP, çok sayıda koşul için hatalar döndürüyor, ancak MQTT bağlantıyı sonlandırır. Sonuç olarak, özel durum işleme mantığınızın bazı değişiklikler gerektirebilirler.

  • MQTT, buluttan cihaza iletilerialırken reddetme işlemlerini desteklemez. Arka uç uygulamanızın cihaz uygulamasından bir yanıt alması gerekiyorsa, doğrudan Yöntemlerkullanmayı göz önünde bulundurun.

  • AMQP, Python SDK 'sında desteklenmez.

Azure IoT SDK olmadan MQTT kullanarak C 'de örnek

IOT MQTT örnek deposunda, telemetri iletilerinin nasıl gönderileceğini ve Azure ıOT C SDK 'sını kullanmadan bir IoT Hub ile olay almayı gösteren birkaç C/C++ demo projesi bulacaksınız.

Bu örnekler, IoT Hub 'ında uygulanan MQTT aracısına ileti göndermek için tutulma mosquıto kitaplığını kullanır.

Azure ıot Tak ve kullan kurallarını kullanmak üzere örnekleri nasıl uyarlayacağınızı öğrenmek için bkz. öğretici-MQTT kullanarak IoT Tak ve kullan cihaz istemcisi geliştirme.

Bu depo şunları içerir:

Windows için:

  • TelemetryMQTTWin32: bir Azure ıot hub 'ına bir Windows makinesinde oluşturulup çalıştırılan bir telemetri iletisi göndermek için kod içerir.

  • SubscribeMQTTWin32: Windows bir makinedeki belirli bir ıot hub 'ının olaylarına abone olmak için kod içerir.

  • DeviceTwinMQTTWin32: Windows bir makinedeki Azure ıot hub 'ındaki bir cihazın cihaz ikizi olaylarını sorgulamak ve abone olmak için kod içerir.

  • PnPMQTTWin32: bir Windows makinede oluşturulup çalıştırılan bir Azure ıot hub 'ına ıot Tak ve Kullan cihaz özelliklerine sahip bir telemetri iletisi göndermek için kod içerir. IoT üzerinde daha fazla bilgi edinebilirsiniz Tak ve kullan

Linux için:

  • MQTTLinux: Linux üzerinde çalıştırılacak kod ve derleme betiği içerir (WSL, Ubuntu ve Raspbian şu ana kadar sınanmıştır).

  • LinuxConsoleVS2019: AYNı kodu içerir, ancak WSL'i (Linux alt sisteminde Windows vs2019 projesinde) içerir. Bu proje, Linux'ta çalışan kodun hata ayıklama adım adım hata ayıklaması Visual Studio.

Daha mosquitto_pub:

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

  • Mosquitto_sendmessage: Cihaz olarak hareket eden bir Azure IoT hub'a basit bir kısa mesaj göndermek için.

  • Mosquitto_subscribe: Azure IoT hub'larında oluşan olayları görmek için.

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

Cihaz, cihaz SDK'larını kullanasa da 8883 bağlantı noktası üzerinden MQTT protokolünü kullanarak genel cihaz uç noktalarına bağlanabilirsiniz. CONNECT paketinde cihazın aşağıdaki değerleri kullanması gerekir:

  • ClientId alanı için deviceId kullanın.

  • Kullanıcı adı alanı için {iothubhostname}/{device_id}/?api-version=2018-06-30 kullanın; {iothubhostname} burada, IoT hub'larının tam CName'idir.

    Örneğin, IoT hub'nizin adı contoso.azure-devices.net cihazınızın adı MyDevice01 ise tam Kullanıcı Adı alanı şunları içermeli:

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

    alana api-version'ın dahil kullanılması kesinlikle önerilir. Aksi takdirde beklenmeyen davranışlara neden olabilir.

  • Parola alanı için sas belirteci kullanın. SAS belirtecin biçimi, hem HTTPS hem de AMQP protokolleri ile aynıdır:

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

    Not

    X.509 sertifika kimlik doğrulaması kullanıyorsanız SAS belirteci parolaları gerekli değildir. Daha fazla bilgi için bkz. X.509 güvenliğini Azure IoT Hub TLS/SSLyapılandırma bölümünde kod yönergelerini izleyin.

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

    Test sırasında, Visual Studio Code için platformlar arası Azure IoT Tools veya az iot hub generate-sas-token CLI uzantısı komutunu kullanarak kendi kodunuza kopyalayıp yapıştırabilirsiniz sas belirteci hızlı bir şekilde oluşturabilirsiniz.

Azure IoT Tools

  1. Uygulamanın sol alt köşesindeki AZURE IOT HUB CIHAZLAR sekmesini Visual Studio Code.

  2. Cihazınıza sağ tıklayın ve Cihaz için SAS Belirteci Oluştur'u seçin.

  3. Sona erme süresini ayarlayın ve 'Enter' tuşuna basın.

  4. SAS belirteci oluşturulur ve 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 belirteci MQTT kullanarak bağlanmak için Parola alanı olarak kullanmak üzere bölümü şu şekildedir:

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

MQTT paketleri bağlamak ve paketlerin bağlantısını IoT Hub İşlemler İzleme kanalında bir olay gönderir. Bu olay, bağlantı sorunlarını gidermenize yardımcı olacak ek bilgiler içerir.

Cihaz uygulaması CONNECT paketinde Bir Will iletisi belirtebilirsiniz. Cihaz uygulaması, telemetri devices/{device_id}/messages/events/ iletisi devices/{device_id}/messages/events/{property_bag} olarak iletilecek Will iletilerini tanımlamak için veya konu başlığı adı olarak kullandır. Bu durumda, ağ bağlantısı kapatıldığına ancak cihazdan daha önce bir DISCONNECT paketi alınmamışsa, IoT Hub CONNECT paketinde sağlanan Will iletisi telemetri kanalına gönderir. Telemetri kanalı, varsayılan Olaylar uç noktası veya veri yönlendirmesi tarafından tanımlanan özel bir IoT Hub olabilir. İletiye Will değeri atanmış iothub-MessageType özelliği vardır.

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

Modül IoT Hub MQTT üzerinden bağlantı kurun, cihaza benzer (MQTT protokolünüdoğrudan cihaz olarak kullanma bölümünde açıklanmıştır) ama aşağıdakini kullansanız gerekir:

  • İstemci kimliğini olarak {device_id}/{module_id} ayarlayın.

  • Kullanıcı adı ve parolayla kimlik doğrularsanız, kullanıcı adını olarak ayarlayın ve modül kimliğiyle ilişkili <hubname>.azure-devices.net/{device_id}/{module_id}/?api-version=2018-06-30 SAS belirteci parolanız olarak kullanın.

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

  • devices/{device_id}/modules/{module_id}/messages/events/WILL konusu olarak kullanın.

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

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

TLS/SSL yapılandırması

MQTT protokolünü doğrudan kullanmak için istemcinizin TLS/SSL üzerinden bağlanması gerekir. Bu adımı atlamayı deneme girişimleri bağlantı hatalarına neden olur.

TLS bağlantısı kurmak için DigiCert Baltimore Kök Sertifikasını indirip başvurabilirsiniz. Bu sertifika, Azure'ın bağlantı güvenliğini sağlamak için kullandığı sertifikadır. Bu sertifikayı Azure-iot-sdk-c deposunda bulabilirsiniz. Bu sertifikalar hakkında daha fazla bilgiyi Digicert'in web sitesinde bulabilirsiniz.

Eclipse Foundation tarafından paho MQTT kitaplığının Python sürümü kullanılarak bunun nasıl uygulandığının bir örneği aşağıdaki gibi olabilir.

İlk olarak, komut satırı ortamınıza Paho kitaplığını yükleyin:

pip install paho-mqtt

Ardından, istemciyi bir Python betiğinde gerçekleştirin. Yer tutucuları aşağıdaki gibi değiştirin:

  • <local path to digicert.cer> , DigiCert Baltimore Root sertifikasını içeren yerel bir dosyanın yoludur. C için Azure IoT SDK'sı içinde certs.c dosyasından sertifika bilgilerini kopyalayıp bu dosyayı oluşturabilirsiniz. Satırları ve dahil edin, her satırın başındaki ve sonundaki işaretleri kaldırın ve her satırın sonundaki karakterleri -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- " \r\n kaldırın.

  • <device id from device registry> , IoT hub'ınıza eklenen 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'nizin 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()

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

# 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 iletileri gönderme

Başarılı bir bağlantının ardından cihaz, konu başlığı adı IoT Hub devices/{device_id}/messages/events/ bir devices/{device_id}/messages/events/{property_bag} cihaza ileti gönderebilir. {property_bag}öğesi, cihazın URL ile kodlanmış biçimde ek özelliklere sahip iletiler 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 dizeleri ile aynı kodlamayı kullanır.

Uygulamaya özgü davranışların IoT Hub listesi aşağıda vemektedir:

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

  • IoT Hub, İletileri kalıcı olarak tutmaz. Bir cihaz, RETAIN bayrağı 1 olarak ayarlanmış bir ileti gönderirse, IoT Hub mqtt-retain uygulama özelliğini iletiye ekler. Bu durumda, koruma iletiyi kalıcı IoT Hub arka uç uygulamasına iletir.

  • IoT Hub cihaz başına yalnızca bir etkin MQTT bağlantısını destekler. Aynı cihaz kimliği adına tüm yeni MQTT bağlantıları IoT Hub'nin mevcut bağlantıyı bırakmalarına neden olur ve 400027 ConnectionForcefullyClosedOnNewConnection IoT Hub Günlüklerinde oturum açılır

Daha fazla bilgi için bkz. Mesajlaşma geliştirici kılavuzu.

Buluttan cihaza iletileri alma

Bir cihazdan ileti IoT Hub için, bir cihazın Konu Filtresi olarak devices/{device_id}/messages/devicebound/# kullanarak abone olması gerekir. Konu Başlığı Filtresi'nin çok düzeyli joker karakteri yalnızca cihazın konu adı içinde # ek özellikler almalarına izin vermek için kullanılır. IoT Hub, alt temlik filtreleme için veya joker # ? karakterlerinin kullanımına izin vermez. Bu IoT Hub genel amaçlı bir pub-sub mesajlaşma aracısı değildir, yalnızca belgelenmiş konu adlarını ve konu başlığı filtrelerini destekler.

Cihaz, konu filtresiyle temsil edilen IoT Hub cihaza özgü uç noktasına başarıyla abone olana kadar cihazdan herhangi bir devices/{device_id}/messages/devicebound/# ileti almaz. Bir abonelik kurulduktan sonra, cihaza abonelik zamanından sonra gönderilen buluttan cihaza iletileri alır. Cihaz CleanSession bayrağı 0 olarak ayarlanmış şekilde bağlanırsa abonelik farklı oturumlarda kalıcı olur. Bu durumda, cihaz CleanSession 0'a bir sonraki bağlandığında bağlantısı kesilmiş durumdayken cihaza gönderilen bekleyen iletileri alır. Cihaz 1 olarak ayarlanmış CleanSession bayrağını kullanıyorsa, cihaz uç noktasına abone olana IoT Hub cihazdan ileti almaz.

IoT Hub, İletileri Konu Adı veya devices/{device_id}/messages/devicebound/ ileti özellikleri olduğunda devices/{device_id}/messages/devicebound/{property_bag} iletir. {property_bag} , ileti özelliklerinin URL ile kodlanmış anahtar/değer çiftlerini içerir. Özellik çantasına yalnızca uygulama özellikleri ve kullanıcı tarafından ayarlanamayan sistem özellikleri (messageId veya correlationId gibi) dahil edilir. Sistem özellik adları ön eke $ sahiptir, uygulama özellikleri ön ekleri olan özgün özellik adını kullanır. Özellik çantasının biçimi hakkında ek ayrıntılar için bkz. Cihazdan buluta iletileri gönderme.

Buluttan cihaza iletilerde, özellik çantasında yer alan değerler aşağıdaki tabloda olduğu gibi temsil eder:

Özellik değeri Gösterimi Açıklama
null key Özellik çantasında yalnızca anahtar görünür
boş dize key= Anahtarın ardından değere sahip bir eşittir işareti
null olmayan, boş olmayan değer key=value Anahtarın ardından eşittir işareti ve değer

Aşağıdaki örnek, üç uygulama özelliği içeren bir özellik çantası gösterir: değerine sahip null prop1; prop2, boş dize (""); ve "dize" değerine sahip prop3.

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

Bir cihaz uygulaması QoS 2 ile bir konuya abone olduğunda, IoT Hub SUBACK paketinde en yüksek QoS düzeyi 1'i verir. Bundan sonra IoT Hub QoS 1 kullanarak cihaza ileti teslim edebilirsiniz.

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 İstek 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 bağlantı isteğinde 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 IoT Hub arasında ilişkide olmasına izin vermek için bu istek kimliğinden gelen yanıta da dahil edilir.

Aşağıdaki dizide, bir cihazın cihaz ikizi içinde bildirilen özellikleri nasıl 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 silmek için ayarlanmış bir üye. Ö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 İstek 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 $iothub/twin/res/204/?$rid=1&$version=6 204 gelen istek $rid=1 $version kimliğidir.

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 bildirimler 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ştirmenize olanak 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 IoT Hub için bkz:

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