Komunikace s centrem IoT pomocí protokolu MQTT

Tento článek popisuje, jak můžou zařízení používat podporované chování MQTT ke komunikaci se službou Azure IoT Hub. IoT Hub umožňuje zařízením komunikovat s koncovými body zařízení IoT Hubu pomocí:

  • MQTT v3.1.1 na portu TCP 8883
  • MQTT v3.1.1 přes WebSocket na portu TCP 443.

Poznámka:

Některé funkce uvedené v tomto článku, jako je zasílání zpráv z cloudu do zařízení, dvojčata zařízení a správa zařízení, jsou k dispozici ve službě IoT Hub pouze na úrovni Standard. Další informace o úrovních Služby IoT Hub úrovně Basic a Standard/Free najdete v tématu Volba správné úrovně IoT Hubu pro vaše řešení.

Veškerá komunikace zařízení se službou IoT Hub musí být zabezpečená pomocí protokolu TLS/SSL. IoT Hub proto nepodporuje nezabezpečená připojení přes port TCP 1883.

Porovnání podpory MQTT ve službě IoT Hub a Event Gridu

IoT Hub není plnohodnotný zprostředkovatel MQTT a nepodporuje všechna chování zadaná ve standardu MQTT v3.1.1. Pokud vaše řešení potřebuje MQTT, doporučujeme podporu MQTT ve službě Azure Event Grid. Event Grid umožňuje obousměrnou komunikaci mezi klienty MQTT na flexibilních hierarchických tématech pomocí modelu zasílání zpráv pub-sub. Umožňuje také směrovat zprávy MQTT do služeb Azure nebo vlastních koncových bodů pro další zpracování.

Následující tabulka vysvětluje rozdíly v podpoře MQTT mezi těmito dvěma službami:

IoT Hub Event Grid
Model klientského serveru s úzkou vazbou mezi zařízeními a cloudovými aplikacemi Model publikování a odběru, který odděluje vydavatele a předplatitele.
Omezená podpora funkcí pro MQTT v3.1.1 a omezená podpora funkcí pro MQTT v5 ve verzi Preview. Další podpora funkcí se neplánuje. Podpora protokolů MQTT v3.1.1 a v5 s další podporou funkcí a plánovaným dodržováním předpisů v odvětví.
Statická předdefinovaná témata. Vlastní hierarchická témata s podporou zástupných znaků
Žádná podpora všesměrového vysílání typu cloud-zařízení a komunikace mezi zařízeními Podporuje všesměrové vysílání typu zařízení-cloud-cloud s vysokým ventilátorem a vzory komunikace mezi zařízeními.
Maximální velikost zprávy 256 kB. Maximální velikost zprávy: 512 kB

Připojení do IoT Hubu

Zařízení může použít protokol MQTT pro připojení k centru IoT pomocí jedné z následujících možností:

Port MQTT (port TCP 8883) je blokovaný v mnoha podnikových a vzdělávacích síťových prostředích. Pokud v bráně firewall nemůžete otevřít port 8883, doporučujeme použít MQTT přes WebSockets. MQTT přes WebSockets komunikuje přes port 443, který je téměř vždy otevřený v síťových prostředích. Informace o tom, jak určit protokoly MQTT a MQTT přes protokoly WebSockets při použití sad SDK Azure IoT, najdete v tématu Použití sad SDK zařízení.

Použití sad SDK zařízení

Sady SDK zařízení, které podporují protokol MQTT, jsou dostupné pro Javu, Node.js, C, C# a Python. Sady SDK zařízení používají zvolený mechanismus ověřování k navázání připojení k centru IoT. Pokud chcete použít protokol MQTT, musí být parametr klientského protokolu nastavený na MQTT. V parametru protokolu klienta můžete také zadat MQTT přes WebSockets. Ve výchozím nastavení se sady SDK zařízení připojují ke službě IoT Hub s příznakem CleanSession nastaveným na 0 a používají QoS 1 pro výměnu zpráv se službou IoT Hub. I když je možné nakonfigurovat QoS 0 pro rychlejší výměnu zpráv, měli byste si uvědomit, že doručení není zaručeno ani potvrzeno. Z tohoto důvodu se QoS 0 často označuje jako "oheň a zapomenutí".

Když je zařízení připojené k centru IoT, sady SDK zařízení poskytují metody, které zařízení umožňují výměnu zpráv s centrem IoT.

Následující tabulka obsahuje odkazy na ukázky kódu pro každý podporovaný jazyk a určuje parametr, který se má použít k navázání připojení ke službě IoT Hub pomocí MQTT nebo MQTT přes protokol WebSockets.

Jazyk Parametr protokolu MQTT Parametr protokolu MQTT přes WebSockets
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 TransportType.Mqtt se vrátí do MQTT přes WebSockets, pokud MQTT selže. Pokud chcete zadat MQTT jenom přes WebSockets, použijte TransportType.Mqtt_WebSocket_Only
Python Podporuje MQTT ve výchozím nastavení. Přidání websockets=True volání pro vytvoření klienta

Následující fragment ukazuje, jak zadat protokol MQTT přes Protokol WebSockets při použití sady Azure IoT Node.js SDK:

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

Následující fragment ukazuje, jak zadat protokol MQTT přes Protokol WebSockets při použití sady Azure IoT Python SDK:

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

Výchozí časový limit pro udržování připojení

Aby se zajistilo, že připojení ke službě nebo službě IoT Hub zůstane naživu, služba i klient pravidelně odesílají příkaz ping naživo. Klient, který používá sadu IoT SDK, odešle udržování v intervalu definovaném v následující tabulce:

Jazyk Výchozí interval uchování Konfigurovatelné
Node.js 180 sekund No
Java 230 sekund Ano
C 240 sekund Ano
C# 300 sekund* Ano
Python 60 sekund Ano

*Sada SDK jazyka C# definuje výchozí hodnotu vlastnosti MQTT KeepAliveInSeconds na 300 sekund. Sada SDK ve skutečnosti odešle požadavek ping čtyřikrát za dobu trvání uchování. Jinými slovy, sada SDK odešle příkaz ping na udržování naživu jednou za 75 sekund.

Po specifikaci MQTT v3.1.1 je interval příkazu ping služby IoT Hub o zachování naživu 1,5krát, ale IoT Hub omezuje maximální časový limit na straně serveru na 29,45 minut (1767 sekund). Tento limit existuje, protože všechny služby Azure jsou vázané na časový limit nečinnosti TCP nástroje pro vyrovnávání zatížení Azure, což je 29,45 minut.

Například zařízení, které používá sadu Java SDK, odešle příkaz ping na udržování naživu a pak ztratí síťové připojení. O 230 sekund později zařízení nezmešká příkaz ping, protože je offline. IoT Hub ale připojení okamžitě nezavře – před odpojením zařízení počká další (230 * 1.5) - 230 = 115 sekundu s chybou 404104 Device Připojení ionClosedRemotely.

Maximální hodnota udržování klienta, kterou můžete nastavit, je 1767 / 1.5 = 1177 několik sekund. Veškerý provoz resetuje udržování. Například úspěšná aktualizace tokenu sdíleného přístupového podpisu (SAS) resetuje udržování naživu.

Migrace aplikace zařízení z AMQP na MQTT

Pokud používáte sady SDK zařízení, přepnutí z použití AMQP na MQTT vyžaduje změnu parametru protokolu v inicializaci klienta, jak je uvedeno výše.

Při tom nezapomeňte zkontrolovat následující položky:

  • AMQP vrací chyby pro mnoho podmínek, zatímco MQTT ukončí připojení. V důsledku toho může logika zpracování výjimek vyžadovat určité změny.

  • MQTT nepodporuje operace odmítnutí při příjmu zpráv typu cloud-zařízení. Pokud vaše back-endová aplikace potřebuje obdržet odpověď z aplikace zařízení, zvažte použití přímých metod.

  • Sada Python SDK nepodporuje AMQP.

Použití protokolu MQTT přímo (jako zařízení)

Pokud zařízení nemůže používat sady SDK zařízení, může se stále připojovat ke koncovým bodům veřejného zařízení pomocí protokolu MQTT na portu 8883.

V paketu CONNECT by zařízení mělo používat následující hodnoty:

  • Pro pole ClientId použijte ID zařízení.

  • Pro pole Uživatelské jméno použijte {iotHub-hostname}/{device-id}/?api-version=2021-04-12, kde {iotHub-hostname} je plný CName IoT Hub.

    Pokud je například název centra IoT contoso.azure-devices.net a pokud je název vašeho zařízení MyDevice01, mělo by úplné pole Uživatelské jméno obsahovat:

    contoso.azure-devices.net/MyDevice01/?api-version=2021-04-12

    Do pole se doporučuje zahrnout verzi api-version. Jinak by mohlo dojít k neočekávanému chování.

  • Pro pole Heslo použijte token SAS. Formát tokenu SAS je stejný jako pro protokoly HTTPS i AMQP:

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

    Poznámka:

    Pokud používáte ověřování certifikátu X.509, hesla tokenů SAS se nevyžadují. Další informace najdete v tématu Kurz: Vytvoření a nahrání certifikátů pro testování a použití pokynů ke kódu v části Konfigurace PROTOKOLU TLS/SSL.

    Další informace o generování tokenů SAS najdete v části Použití tokenů SAS jako části Řízení přístupu ke službě IoT Hub pomocí sdílených přístupových podpisů.

    K rychlému vygenerování tokenu SAS můžete použít také rozšíření Azure IoT Hub pro různé platformy pro Visual Studio Code nebo příkaz rozšíření rozhraní příkazového řádku az iot hub generate-sas-token . Token SAS pak můžete zkopírovat a vložit do vlastního kódu pro účely testování.

Kurz použití MQTT přímo najdete v tématu Použití MQTT k vývoji klienta zařízení IoT bez použití sady SDK pro zařízení.

Použití rozšíření Azure IoT Hub pro Visual Studio Code

  1. Na bočním panelu rozbalte uzel Zařízení v části Azure IoT Hub .

  2. Klikněte pravým tlačítkem na zařízení IoT a v místní nabídce vyberte Vygenerovat token SAS pro zařízení .

  3. Do vstupního pole zadejte dobu vypršení platnosti tokenu SAS v hodinách a pak vyberte klávesu Enter.

  4. Token SAS se vytvoří a zkopíruje do schránky.

    Vygenerovaný token SAS má následující strukturu:

    HostName={iotHub-hostname};DeviceId=javadevice;SharedAccessSignature=SharedAccessSignature sr={iotHub-hostname}%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

    Část tohoto tokenu , která se má použít jako pole Heslo pro připojení pomocí MQTT, je:

    SharedAccessSignature sr={iotHub-hostname}%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802

Aplikace zařízení může v paketu CONNECT zadat zprávu Will. Aplikace zařízení by měla použít devices/{device-id}/messages/events/ nebo devices/{device-id}/messages/events/{property-bag} jako název tématu Will definovat zprávy Will, které se mají předávat jako telemetrická zpráva. V takovém případě, pokud je síťové připojení uzavřeno, ale paket DISCONNECT nebyl dříve přijat ze zařízení, IoT Hub odešle zprávu Will do paketu CONNECT do kanálu telemetrie. Kanál telemetrie může být buď výchozím koncovým bodem událostí , nebo vlastním koncovým bodem definovaným směrováním ioT Hubu. Zpráva má iothub-MessageType vlastnost s hodnotou Will přiřazena.

Použití protokolu MQTT přímo (jako modulu)

K IoT Hubu se můžete připojit přes MQTT pomocí identity modulu, podobně jako při připojování ke službě IoT Hub jako zařízení. Další informace o připojení ke službě IoT Hub přes MQTT jako zařízení najdete v tématu Použití protokolu MQTT přímo (jako zařízení). Musíte ale použít následující hodnoty:

  • Nastavte ID klienta na {device-id}/{module-id}hodnotu .

  • Pokud se ověřuje pomocí uživatelského jména a hesla, nastavte uživatelské jméno na <hubname>.azure-devices.net/{device_id}/{module_id}/?api-version=2021-04-12 token SAS přidružený k identitě modulu jako heslo a použijte ho.

  • Slouží devices/{device-id}/modules/{module-id}/messages/events/ jako téma pro publikování telemetrie.

  • Použije se devices/{device-id}/modules/{module-id}/messages/events/ jako téma WILL.

  • Slouží devices/{device-id}/modules/{module-id}/# jako téma pro příjem zpráv.

  • Témata GET a PATCH dvojčete jsou stejná pro moduly a zařízení.

  • Téma stavu dvojčete je stejné pro moduly a zařízení.

Další informace o používání MQTT s moduly najdete v tématu Publikování a přihlášení k odběru pomocí IoT Edge a další informace o koncovém bodu MQTT centra IoT Edge.

Ukázky využívající MQTT bez sady Azure IoT SDK

Ukázkové úložiště IoT MQTT obsahuje ukázky C/C++, Pythonu a rozhraní příkazového řádku, které ukazují, jak odesílat telemetrické zprávy, přijímat zprávy typu cloud-zařízení a používat dvojčata zařízení bez použití sad SDK zařízení Azure.

Ukázky C/C++ používají knihovnu Eclipse Mosquitto , ukázku Pythonu používá Eclipse Paho a ukázky rozhraní příkazového řádku používají mosquitto_pub.

Další informace najdete v kurzu – Použití MQTT k vývoji klienta zařízení IoT.

Konfigurace PROTOKOLU TLS/SSL

Pokud chcete použít protokol MQTT přímo, musí se váš klient připojit přes protokol TLS/SSL. Pokusy o přeskočení tohoto kroku selžou s chybami připojení.

Abyste mohli vytvořit připojení TLS, možná budete muset stáhnout kořenový certifikát DigiCert, který Azure používá, a odkazovat na ho. Od 15. února 2023 do 15. října 2023 azure IoT Hub migruje kořenový certifikát TLS z kořenového certifikátu DigiCert Baltimore do globálního kořenového certifikátu DigiCert G2. Během období migrace byste měli mít na svých zařízeních oba certifikáty, abyste zajistili připojení. Další informace o migraci najdete v tématu Migrace prostředků IoT do nového kořenového certifikátu TLS. Další informace o těchto certifikátech najdete na webu digicertu.

Následující příklad ukazuje, jak tuto konfiguraci implementovat pomocí pythonové verze knihovny Paho MQTT foundation Eclipse.

Nejprve nainstalujte knihovnu Paho z prostředí příkazového řádku:

pip install paho-mqtt

Pak implementujte klienta ve skriptu Pythonu. Nahraďte tyto zástupné symboly v následujícím fragmentu kódu:

  • <local path to digicert.cer> je cesta k místnímu souboru, který obsahuje kořenový certifikát DigiCert. Tento soubor můžete vytvořit zkopírováním informací o certifikátu z certs.c v sadě Azure IoT SDK pro C. Zahrňte řádky -----BEGIN CERTIFICATE----- a -----END CERTIFICATE-----odeberte " značky na začátku a na konci každého řádku a odeberte \r\n znaky na konci každého řádku.

  • <device id from device registry> je ID zařízení, které jste přidali do centra IoT.

  • <generated SAS token> je token SAS pro zařízení vytvořený, jak je popsáno výše v tomto článku.

  • <iot hub name> název centra IoT.

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=2021-04-12", 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()

Pokud se chcete ověřit pomocí certifikátu zařízení, aktualizujte předchozí fragment kódu změnami zadanými v následujícím fragmentu kódu. Další informace o tom, jak se připravit na ověřování pomocí certifikátů, najdete v části Získání certifikátu certifikační autority X.509 pro ověření zařízení pomocí certifikátů certifikační autority X.509.

# 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=2021-04-12", 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)

Odesílání zpráv ze zařízení do cloudu

Jakmile se zařízení připojí, může posílat zprávy do IoT Hubu pomocí devices/{device-id}/messages/events/ názvu tématu nebo devices/{device-id}/messages/events/{property-bag} jako název tématu. Tento {property-bag} element umožňuje zařízení odesílat zprávy s jinými vlastnostmi ve formátu zakódovaném v adrese URL. Příklad:

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

Poznámka:

Tento {property_bag} element používá stejné kódování jako řetězce dotazů v protokolu HTTPS.

Poznámka:

Pokud směrujete zprávy D2C do účtu služby Azure Storage a chcete využít kódování JSON, musíte zadat informace o typu obsahu a kódování obsahu, včetně $.ct=application%2Fjson&$.ce=utf-8{property_bag} informací uvedených v předchozí poznámce.

Formát těchto atributů je specifický pro protokol. IoT Hub tyto atributy překládá do odpovídajících systémových vlastností. Další informace najdete v části Systémové vlastnosti syntaxe dotazů směrování zpráv ioT Hubu.

Následující seznam popisuje chování specifické pro implementaci služby IoT Hub:

  • IoT Hub nepodporuje zprávy QoS 2. Pokud aplikace zařízení publikuje zprávu s QoS 2, IoT Hub připojení k síti zavře.

  • IoT Hub neuchovává zprávy. Pokud zařízení odešle zprávu s příznakem RETAIN nastaveným na hodnotu 1, IoT Hub přidá do zprávy vlastnost aplikace mqtt-retain . V takovém případě ioT Hub místo zachování zprávy předá back-endové aplikaci.

  • IoT Hub podporuje pouze jedno aktivní připojení MQTT na zařízení. Jakékoli nové připojení MQTT jménem stejného ID zařízení způsobí, že IoT Hub zahodí stávající připojení a 400027 Připojení ionForcefullyClosedOnNew Připojení ion se přihlásí k protokolům ioT Hubu.

  • Chcete-li směrovat zprávy na základě textu zprávy, musíte nejprve přidat vlastnost contentType (ct) na konec tématu MQTT a nastavit její hodnotu tak, jak application/json;charset=utf-8 je znázorněno v následujícím příkladu. Další informace o směrování zpráv na základě vlastností zprávy nebo textu zprávy najdete v dokumentaci k syntaxi dotazů směrování zpráv služby IoT Hub.

    devices/{device-id}/messages/events/$.ct=application%2Fjson%3Bcharset%3Dutf-8

Další informace najdete v tématu Odesílání zpráv typu zařízení-cloud a cloud-zařízení ve službě IoT Hub.

Příjem zpráv z cloudu na zařízení

Pokud chcete přijímat zprávy ze služby IoT Hub, musí se zařízení přihlásit k odběru pomocí devices/{device-id}/messages/devicebound/# filtru témat. Zástupný znak # s více úrovněmi ve filtru tématu slouží pouze k tomu, aby zařízení mohlo přijímat více vlastností v názvu tématu. IoT Hub neumožňuje použití zástupných #? znaků pro filtrování dílčích témat. Vzhledem k tomu, že IoT Hub není zprostředkovatelem zasílání zpráv pro obecné účely, podporuje pouze názvy zdokumentovaných témat a filtry témat. Zařízení se může přihlásit k odběru pouze pěti témat najednou.

Zařízení neobdrží žádné zprávy ze služby IoT Hub, dokud se úspěšně nepřihlásí ke svému koncovému bodu specifickému pro zařízení, který představuje devices/{device-id}/messages/devicebound/# filtr tématu. Po vytvoření předplatného obdrží zařízení zprávy typu cloud-zařízení, které se do něj odeslaly po uplynutí doby odběru. Pokud se zařízení připojí s příznakem CleanSession nastaveným na hodnotu 0, předplatné se zachová napříč různými relacemi. V tomto případě se při příštím připojení zařízení k nástroji CleanSession 0 obdrží všechny nevyrovnané zprávy odeslané do zařízení při odpojení. Pokud zařízení používá příznak CleanSession nastavený na hodnotu 1 , neobdrží z IoT Hubu žádné zprávy, dokud se nepřihlásí ke svému koncovému bodu zařízení.

IoT Hub doručuje zprávy s názvemdevices/{device-id}/messages/devicebound/ tématu nebo devices/{device-id}/messages/devicebound/{property-bag} když existují vlastnosti zprávy. {property-bag} obsahuje páry klíč/hodnota zakódovaná adresou URL vlastností zprávy. Do tašky vlastností jsou zahrnuty pouze vlastnosti aplikace a vlastnosti systému nastavené uživatelem (například messageId nebo correlationId). Názvy systémových vlastností mají předponu $, vlastnosti aplikace používají původní název vlastnosti bez předpony. Další informace o formátu kontejneru vlastností naleznete v tématu Odesílání zpráv typu zařízení-cloud.

Ve zprávách cloud-zařízení jsou hodnoty v kontejneru vlastností reprezentovány jako v následující tabulce:

Hodnota vlastnosti Reprezentace Popis
null key V kontejneru vlastností se zobrazí pouze klíč.
prázdný řetězec key= Klíč následovaný symbolem rovná se bez hodnoty
non-null, nonempty hodnota key=value Klíč následovaný symbolem rovná se a hodnotou

Následující příklad ukazuje tašku vlastností, která obsahuje tři vlastnosti aplikace: prop1 s hodnotou null; prop2, prázdný řetězec (");"); a prop3 s hodnotou "řetězec".

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

Když se aplikace zařízení přihlásí k odběru tématu pomocí QoS 2, IoT Hub udělí v paketu SUBACK maximální úroveň QoS 1. Potom IoT Hub do zařízení doručí zprávy pomocí QoS 1.

Načtení vlastností dvojčete zařízení

Nejprve se zařízení přihlásí k $iothub/twin/res/#odběru a obdrží odpovědi operace. Pak odešle prázdnou zprávu do tématu $iothub/twin/GET/?$rid={request id}s vyplněnou hodnotou pro ID požadavku. Služba pak odešle zprávu s odpovědí obsahující data dvojčete zařízení v tématu $iothub/twin/res/{status}/?$rid={request-id}s použitím stejného ID požadavku jako požadavek.

ID požadavku může být libovolná platná hodnota pro hodnotu vlastnosti zprávy a stav se ověří jako celé číslo. Další informace najdete v tématu Odesílání zpráv typu zařízení-cloud a cloud-zařízení ve službě IoT Hub.

Tělo odpovědi obsahuje část vlastností dvojčete zařízení, jak je znázorněno v následujícím příkladu odpovědi:

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

Možné stavové kódy:

Status Popis
200 Akce proběhla úspěšně
429 Příliš mnoho požadavků (omezené). Další informace najdete v tématu Omezování služby IoT Hub.
5** Chyby serveru

Další informace najdete v tématu Principy a použití dvojčat zařízení ve službě IoT Hub.

Aktualizace ohlášených vlastností dvojčete zařízení

Pokud chcete aktualizovat ohlášené vlastnosti, zařízení vydá požadavek na IoT Hub prostřednictvím publikace nad určeným tématem MQTT. Jakmile IoT Hub požadavek zpracuje, odpoví na stav úspěšné nebo neúspěšné operace aktualizace prostřednictvím publikace do jiného tématu. Zařízení se může přihlásit k odběru tohoto tématu, aby ho informovalo o výsledku žádosti o aktualizaci dvojčete. K implementaci tohoto typu interakce požadavků a odpovědí v MQTT používáme pojem ID požadavku ($rid), které zařízení původně poskytlo v žádosti o aktualizaci. Toto ID požadavku je také součástí odpovědi ze služby IoT Hub, aby zařízení mohlo korelovat odpověď na konkrétní předchozí požadavek.

Následující posloupnost popisuje, jak zařízení aktualizuje ohlášené vlastnosti ve dvojčeti zařízení ve službě IoT Hub:

  1. Zařízení se musí nejprve přihlásit k odběru $iothub/twin/res/# tématu, aby přijímalo odpovědi operace ze služby IoT Hub.

  2. Zařízení odešle zprávu obsahující aktualizaci dvojčete zařízení do $iothub/twin/PATCH/properties/reported/?$rid={request-id} tématu. Tato zpráva obsahuje hodnotu ID požadavku.

  3. Služba pak odešle zprávu odpovědi, která obsahuje novou hodnotu značky ETag pro kolekci ohlášených vlastností v tématu $iothub/twin/res/{status}/?$rid={request-id}. Tato zpráva odpovědi používá stejné ID požadavku jako požadavek.

Text zprávy požadavku obsahuje dokument JSON, který obsahuje nové hodnoty pro ohlášené vlastnosti. Každý člen v dokumentu JSON aktualizuje nebo přidá odpovídajícího člena do dokumentu dvojčete zařízení. Člen nastavený tak, aby null odstranil člen z objektu obsahujícího objekt. Příklad:

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

Možné stavové kódy:

Status Popis
204 Úspěch (nevrácený obsah)
400 Chybný požadavek. Poškozený formát JSON
429 Příliš mnoho požadavků (omezených) podle omezování služby IoT Hub
5** Chyby serveru

Následující fragment kódu Pythonu ukazuje proces aktualizace ohlášených vlastností dvojčete přes MQTT pomocí klienta Paho MQTT:

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)

Po úspěšném procesu aktualizace vlastností hlášených dvojčetem v předchozím fragmentu kódu má zpráva publikace ze služby IoT Hub následující téma: $iothub/twin/res/204/?$rid=1&$version=6, kde 204 je stavový kód označující úspěch, $rid=1 odpovídá ID požadavku poskytované zařízením v kódu a $version odpovídá verzi oddílu ohlášených vlastností dvojčat zařízení po aktualizaci.

Další informace najdete v tématu Principy a použití dvojčat zařízení ve službě IoT Hub.

Příjem oznámení o aktualizaci požadovaných vlastností

Když je zařízení připojené, IoT Hub odesílá oznámení do tématu $iothub/twin/PATCH/properties/desired/?$version={new-version}, které obsahuje obsah aktualizace provedené back-endem řešení. Příklad:

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

Pokud jde o aktualizace vlastností, null hodnoty znamenají, že se člen objektu JSON odstraňuje. $version Označuje také novou verzi oddílu požadovaných vlastností dvojčete.

Důležité

IoT Hub generuje oznámení o změnách jenom v případech, kdy jsou zařízení připojená. Ujistěte se, že implementujete tok opětovného připojení zařízení, aby se požadované vlastnosti synchronizovaly mezi IoT Hubem a aplikací zařízení.

Další informace najdete v tématu Principy a použití dvojčat zařízení ve službě IoT Hub.

Reakce na přímou metodu

Za prvé, zařízení se musí přihlásit k odběru $iothub/methods/POST/#. IoT Hub odesílá žádosti o metody do tématu $iothub/methods/POST/{method-name}/?$rid={request-id}s platným kódem JSON nebo prázdným textem.

Zařízení odešle zprávu s platným kódem JSON nebo prázdným textem do tématu $iothub/methods/res/{status}/?$rid={request-id}. V této zprávě musí ID požadavku odpovídat id požadavku ve zprávě žádosti a stav musí být celé číslo.

Další informace najdete v tématu Vysvětlení a vyvolání přímých metod ze služby IoT Hub.

Další kroky

Další informace o používání MQTT najdete tady:

Další informace o používání sad SDK pro zařízení IoT najdete tady:

Další informace o plánování nasazení služby IoT Hub najdete tady: