Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek popisuje, jak můžou zařízení používat protokol MQTT ke komunikaci se službou Azure IoT Hub. Koncové body zařízení IoT Hub podporují připojení zařízení pomocí:
- MQTT v3.1.1 na portu 8883
- MQTT v3.1.1 přes WebSocket na portu 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 Basic a Standard/Free IoT Hub najdete v tématu Volba správné úrovně a velikosti služby IoT Hub pro vaše řešení.
Veškerá komunikace zařízení se službou IoT Hub musí být zabezpečená pomocí protokolu TLS. IoT Hub proto nepodporuje nezabezpečená připojení MQTT přes port 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 zprostředkovatele MQTT hostovaného v cloudu, použijte místo toho Azure Event Grid . Event Grid umožňuje obousměrnou komunikaci mezi klienty MQTT na flexibilních hierarchických tématech pomocí modelu publikování a odběru. Umožňuje také směrovat zprávy MQTT do jiných služeb Azure nebo vlastních koncových bodů pro další zpracování.
Následující tabulka shrnuje aktuální rozdíly v podpoře MQTT mezi těmito dvěma službami:
Centrum IoT | Event Grid (síť událostí) |
---|---|
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. | Podpora protokolu MQTT v3.1.1 a v5 |
Statická předdefinovaná témata. | Vlastní hierarchická témata s podporou zástupných znaků |
Žádná podpora vysílání z cloudu k zařízení ani komunikace zařízení k zařízení. | Podporuje komunikaci zařízení-do-cloudu, vysílání z cloudu do zařízení s vysokým rozvětvením a vzory komunikace zařízení-do-zařízení. |
Maximální velikost zprávy o velikosti 256 kB | Maximální velikost zprávy o velikosti 512 kB |
Připojení ke službě IoT Hub
Zařízení může použít protokol MQTT pro připojení k centru IoT pomocí jedné z následujících možností:
- Sady SDK pro zařízení Azure IoT
- Přímo protokol MQTT.
Mnoho podnikových a vzdělávacích firewallů blokuje port MQTT (port TCP 8883). Pokud v bráně firewall nemůžete otevřít port 8883, použijte MQTT přes WebSockets. MQTT přes WebSockets komunikuje přes port 443, který je téměř vždy otevřený. 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žijte SDK zařízení
Sady SDK pro zařízení Azure IoT , které podporují protokol MQTT, jsou dostupné pro Javu, Node.js, C, C# a Python. Zařízení SDK 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čené a není potvrzeno. Z tohoto důvodu se QoS 0 často označuje jako „vystřel a zapomeň“.
Když se zařízení připojí 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 | Ve výchozím nastavení používá MQTT. | Pokud chcete vytvořit klienta, přidejte websockets=True ho do hovoru. |
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)
Důležité
Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.
Výchozí časový limit udržení
Aby se zajistilo, že připojení klienta k centru IoT zůstane aktivní, služba i klient pravidelně odesílají udržovací ping jeden druhému. Pokud používáte některou ze sad SDK zařízení, klient odešle udržovací zprávu v intervalu definovaném v následující tabulce.
Jazyk | Výchozí interval pro udržení spojení | Konfigurovatelné |
---|---|---|
Node.js | 180 sekund | Ne |
Java | 230 sekund | Ne |
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. Ve skutečnosti sada SDK posílá čtyřikrát požadavek ping během doby trvání relace keep-alive. Jinými slovy, SDK odešle keep-alive ping jednou za 75 sekund.
V souladu se specifikací MQTT v3.1.1 je interval keep-alive pingu IoT Hubu 1,5násobkem hodnoty keep-alive klienta; nicméně IoT Hub omezuje maximální timeout na straně serveru na 29,45 minut (1 767 sekund).
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í. Po 230 sekundách zařízení nezachytí keep-alive 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 DeviceConnectionClosedRemotely.
Maximální hodnota udržování klienta, kterou můžete nastavit, je 1767 / 1.5 = 1177
sekund. Jakýkoli provoz resetuje udržování spojení. Například úspěšná aktualizace tokenu sdíleného přístupového podpisu (SAS) resetuje udržování aktivního připojení.
Migrace aplikace zařízení z AMQP na MQTT
Pokud používáte sady SDK zařízení, pro přepnutí z použití AMQP na MQTT je potřeba změnit parametr protokolu v inicializaci klienta.
Při změně z AMQP na MQTT zkontrolujte následující položky:
AMQP vrací chyby pro mnoho podmínek, zatímco MQTT ukončí připojení. V důsledku toho možná budete muset změnit logiku zpracování výjimek.
MQTT nepodporuje operaci odmítnutí, když přijímá zprávy z cloudu do 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 ze zařízení
Pokud zařízení nemůže používat sady SDK zařízení IoT, může se stále připojovat ke koncovým bodům veřejného zařízení pomocí protokolu MQTT na portu 8883.
Důležité
Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.
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 hubu.Pokud je například název centra IoT contoso.azure-devices.net a pokud je název vašeho zařízení MyDevice01, pole Uživatelské jméno obsahuje:
contoso.azure-devices.net/MyDevice01/?api-version=2021-04-12
Abyste se vyhnuli neočekávanému chování, zahrňte do pole verzi api.
Pro pole Heslo použijte token SAS. Následující fragment kódu ukazuje formát tokenu SAS:
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.
Další informace o generování tokenů SAS najdete v části Použití tokenů SAS jako zařízení v dokumentu Řízení přístupu ke službě IoT Hub pomocí sdílených přístupových podpisů.
K vygenerování tokenu SAS můžete použít také rozšíření Azure IoT Hub 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í.
Rozšíření vygeneruje token SAS s následující strukturou:
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žívat 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 z modulu
K IoT Hubu se také můžete připojit přes MQTT pomocí identity modulu. Tento postup je podobný připojení jako zařízení, ale musíte použít následující hodnoty:
Nastavte ID klienta na
{device-id}/{module-id}
.Pokud se ověřujete 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
. Pokud používáte SAS, jako heslo použijte token SAS přidružený k identitě modulu.Použijte
devices/{device-id}/modules/{module-id}/messages/events/
jako téma pro publikování telemetrie.Použijte
devices/{device-id}/modules/{module-id}/messages/events/
jako téma Will.Použijte
devices/{device-id}/modules/{module-id}/#
jako téma pro příjem zpráv.Témata dvojic GET a PATCH 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 Koncový bod MQTT centra IoT Edge.
Ukázky využívající MQTT bez sady SDK pro zařízení Azure IoT
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 tématu Kurz – Použití MQTT k vývoji klienta zařízení IoT bez použití sady SDK pro zařízení.
Konfigurace protokolu TLS
Pokud chcete použít protokol MQTT přímo, musí se váš klient připojit přes protokol TLS 1.2. Všechny 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 G2, který používá Azure, a odkazovat na ho. Další informace o tomto certifikátu najdete na webu digicertu.
Následující příklad ukazuje, jak tuto konfiguraci implementovat pomocí pythonové verze knihovny Paho MQTT.
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 v části Ověřování identit pomocí certifikátů 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 s použitím devices/{device-id}/messages/events/
nebo devices/{device-id}/messages/events/{property-bag}
jako názvu 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>)…
Tento {property_bag}
element používá stejné kódování jako řetězce dotazů v protokolu HTTPS.
Pokud směrujete zprávy D2C do účtu Služby Azure Storage a chcete použí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
, jako součást {property_bag}
zmíněných v předchozí poznámce.
Poznámka:
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 shrnuje chování specifické pro implementaci služby IoT Hub MQTT:
IoT Hub nepodporuje zprávy s QoS úrovní 2. Pokud aplikace zařízení publikuje zprávu s QoS 2, IoT Hub připojení k síti zavře.
IoT Hub neuchovává
Retain
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ě služba IoT Hub předá místo zachování zachované zprávy ji 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 zapíše 400027 ConnectionForcefullyClosedOnNewConnection do protokolů IoT Hubu.
Chcete-li směrovat zprávy na základě textu zprávy, nejprve přidejte vlastnost
ct
na konec tématu MQTT a nastavte jeho hodnotu takapplication/json;charset=utf-8
, jak 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í a příjem zpráv pomocí IoT Hubu.
Příjem zpráv z cloudu do 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. Víceúrovňový zástupný znak #
ve filtru tématu umožňuje zařízení přijímat více vlastností v názvu tématu. IoT Hub neumožňuje použití zástupných znaků #
nebo ?
pro filtrování subtémat. IoT Hub není zprostředkovatel zasílání zpráv pro obecné účely pro publikování a odběr zpráv, 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ží ze služby IoT Hub žádné zprávy, 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 z cloudu do zařízení, které jsou do něj odeslané po vytvoření předplatného. Pokud se zařízení připojí s příznakem CleanSession nastaveným na 0, předplatné se zachová napříč různými relacemi. V tomto případě, když se zařízení příště připojí k CleanSession 0, obdrží všechny čekající zprávy, které mu byly odeslány během 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}
pokud existují vlastnosti zprávy.
{property-bag}
obsahuje páry klíč/hodnota zakódované ve formátu 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 tašky vlastností najdete v sekci Odesílání zpráv z zařízení do cloudu.
Ve zprávách z cloudové služby na zařízení jsou hodnoty v sadě vlastností reprezentovány tak, jak je uvedeno 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 |
nenulová, neprázdná hodnota | key=value |
Klíč následovaný rovnítkem 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, Služba 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, aby obdrželo 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 odpověď obsahující data dvojčete zařízení na téma $iothub/twin/res/{status}/?$rid={request-id}
s použitím stejného ID požadavku jako žádost.
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í a příjem zpráv pomocí IoT Hubu.
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:
Stav | Popis |
---|---|
200 | Úspěch |
429 | Příliš mnoho požadavků (omezováno). Další informace najdete v tématu Kvóty a 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á žádost do služby IoT Hub publikováním do určeného tématu MQTT. Jakmile IoT Hub požadavek zpracuje, odpoví stavem úspěšné nebo neúspěšné operace aktualizace publikováním do jiného tématu. Zařízení se může přihlásit k odběru tohoto tématu, aby dostávalo oznámení o výsledku žádosti o aktualizaci dvojčete. K implementaci tohoto typu interakce požadavků a odpovědí v MQTT zařízení v počáteční žádosti o aktualizaci poskytuje ID požadavku ($rid
). Toto ID požadavku se pak zahrne do odpovědi ze služby IoT Hub, aby zařízení bylo možné korelovat odpověď na správný požadavek.
Následující posloupnost popisuje, jak zařízení aktualizuje ohlášené vlastnosti ve dvojčeti zařízení ve službě IoT Hub:
Zařízení se nejprve přihlásí k odběru
$iothub/twin/res/#
tématu, aby mohlo přijímat odpovědi ze služby IoT Hub.Zařízení odešle zprávu, která obsahuje aktualizaci zařízení dvojče, do tématu
$iothub/twin/PATCH/properties/reported/?$rid={request-id}
. Tato zpráva obsahuje hodnotu ID požadavku.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 odpověď 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ý na null
odstraní člena z objektu, ve kterém je obsažen. Příklad:
{
"telemetrySendFrequency": "35m",
"batteryLevel": 60
}
Možné stavové kódy:
Stav | Popis |
---|---|
204 | Úspěšně (není vrácen žádný obsah) |
400 | Chybný požadavek. Poškozený formát JSON |
429 | Příliš mnoho požadavků (omezených) podle kvót a 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)
Když proces aktualizace ohlášených vlastností dvojčete proběhne úspěšně, Služba IoT Hub publikuje zprávu do následujícího tématu: $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 poskytnutému zařízením v kódu a $version
odpovídá verzi části 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
rovněž označuje 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
Nejprve se zařízení přihlásí k $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ě ID požadavku musí odpovídat tomu ve zprávě s žádostí 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: