Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk azt ismerteti, hogy az eszközök hogyan használhatják az MQTT protokollt a Azure IoT Hub való kommunikációhoz. Az IoT Hub eszközvégpontok a következőkkel támogatják az eszközkapcsolatot:
- MQTT v3.1.1 a 8883-es porton
- MQTT v3.1.1 WebSocketen keresztül 443-as porton
Megjegyzés:
A cikkben említett funkciók némelyike, például a felhőalapú üzenetkezelés, az ikereszközök és az eszközfelügyelet csak a standard szintű IoT Hub érhető el. Az alapszintű és a standard/ingyenes IoT Hub szintekkel kapcsolatos további információkért lásd: A megoldás megfelelő IoT Hub rétegének és méretének meghatározása.
Az IoT Hub-nal folytatott összes eszközkommunikációt TLS használatával kell biztosítani. Ezért IoT Hub nem támogatja a nem biztonságos MQTT-kapcsolatokat az 1883-es porton keresztül.
MQTT-támogatás összehasonlítása a IoT Hub és az Event Gridben
IoT Hub nem teljes körű MQTT-közvetítő, és nem támogatja az MQTT v3.1.1 szabványban megadott összes viselkedést. Ha a megoldáshoz felhőalapú MQTT-közvetítőre van szüksége, használja inkább a Azure Event Grid. Az Event Grid kétirányú kommunikációt tesz lehetővé az MQTT-ügyfelek között rugalmas hierarchikus témakörökben egy közzétételre feliratkozott üzenetkezelési modell használatával. Lehetővé teszi az MQTT-üzenetek átirányítását más Azure szolgáltatásokhoz vagy egyéni végpontokhoz további feldolgozás céljából.
Az alábbi táblázat a két szolgáltatás MQTT-támogatásának aktuális különbségeit foglalja össze:
| IoT Hub | Event Grid |
|---|---|
| Ügyfél-kiszolgáló modell az eszközök és a felhőalkalmazások szoros összekapcsolásával. | Közzétételi-előfizetési modell, amely elválasztja a közzétevőket és az előfizetőket. |
| Korlátozott funkciótámogatás az MQTT 3.1.1-es verzióhoz. | MQTT v3.1.1 és v5 protokoll támogatása. |
| Statikus, előre definiált témakörök. | Egyéni hierarchikus témakörök helyettesítő karakterek támogatásával. |
| Nem támogatottak a felhőből az eszközre irányuló közvetítések vagy az eszközök közötti kommunikáció. | Támogatja az eszköz-felhő, a széles sugárzású felhő-eszköz közötti közvetítéseket és az eszköz-eszköz közötti kommunikációs mintákat. |
| 256 KB maximális üzenetméret. | 512 KB maximális üzenetméret. |
Csatlakozzon az IoT Hubhoz
Az eszközök az MQTT protokoll használatával csatlakozhatnak egy IoT Hubhoz az alábbi lehetőségek egyikével:
- Az Azure IoT eszköz SDK-k.
- Az MQTT protokoll közvetlenül.
Számos vállalati és oktatási tűzfal blokkolja az MQTT-portot (TCP-port: 8883). Ha nem tudja megnyitni a 8883-at a tűzfalon, használja az MQTT-t WebSocketeken keresztül. A WebSocket-en keresztüli MQTT a 443-es porton keresztül kommunikál, ami szinte mindig nyitva van. Ahhoz, hogy megtanulja, hogyan lehet megadni az MQTT-t és az MQTT WebSockets protokollokat az Azure IoT SDK-k használatakor, lásd az Eszköz SDK-k használata részt.
Az eszköz SDK-k használata
Azure IoT eszköz SDK-k amelyek támogatják az MQTT protokollt, Java, Node.js, C, C# és Python érhetőek el. Az eszköz SDK-k a választott hitelesítési mechanizmussal létesítenek kapcsolatot egy IoT Hubhoz. Az MQTT protokoll használatához az ügyfélprotokoll paraméterét MQTT értékre kell állítani. Az ügyfélprotokoll paraméterben websocketeken keresztül is megadhatja az MQTT-t. Az eszköz SDK-k alapértelmezés szerint egy IoT Hubhoz csatlakoznak a CleanSession jelzőt 0 értéken beállítva és QoS 1 használatával az üzenetváltáshoz az IoT Hubbal. Bár a QoS 0 konfigurálható a gyorsabb üzenetcsere érdekében, vegye figyelembe, hogy a kézbesítés nem garantált, és nem nyugtázható. Ezért a QoS 0-t gyakran "tüzelj és felejts"-nek is nevezik.
Amikor egy eszköz IoT Hubhoz csatlakozik, az eszköz SDK-jai olyan módszereket biztosítanak, amelyekkel az eszköz üzeneteket cserélhet egy IoT Hubbal.
Az alábbi táblázat az egyes támogatott nyelvekhez tartozó kódmintákra mutató hivatkozásokat tartalmaz, és megadja azt a paramétert, amely az MQTT vagy az MQTT over WebSockets protokoll használatával IoT Hub kapcsolatot hoz létre.
| Nyelv | MQTT protokollparaméter | MQTT protokollparaméter WebSockets felett |
|---|---|---|
| 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 | A TransportType.Mqtt visszaesik az MQTT-hez WebSocketsen keresztül, ha az MQTT meghiúsul. Ha csak WebSocketeken szeretné megadni az MQTT-t, használja a TransportType.Mqtt_WebSocket_Only |
| Python | Alapértelmezés szerint MQTT-t használ | Az ügyfél létrehozásához adja hozzá websockets=True a híváshoz. |
Az alábbi töredék bemutatja, hogyan adhatja meg az MQTT over WebSockets protokollt a Azure IoT Node.js SDK használatakor:
var Client = require('azure-iot-device').Client;
var Protocol = require('azure-iot-device-mqtt').MqttWs;
var client = Client.fromConnectionString(deviceConnectionString, Protocol);
Az alábbi töredék bemutatja, hogyan adhatja meg az MQTT over WebSockets protokollt a Azure IoT Python SDK használatakor:
from azure.iot.device.aio import IoTHubDeviceClient
device_client = IoTHubDeviceClient.create_from_connection_string(deviceConnectionString, websockets=True)
Fontos
Ez a cikk az eszközök közös hozzáférésű jogosultságkóddal, más néven szimmetrikus kulcshitelesítéssel való csatlakoztatásának lépéseit tartalmazza. Ez a hitelesítési módszer alkalmas tesztelésre és kiértékeléshez, de az eszköz hitelesítése X.509-tanúsítványokkal biztonságosabb módszer. További információkért tekintse meg az IoT-megoldások biztonsági javaslatait és a kapcsolatbiztonságot>.
Alapértelmezett életben tartási időkeret
Annak érdekében, hogy az IoT Hub-kapcsolat ügyfélkapcsolata életben maradjon, a szolgáltatás és az ügyfél is rendszeresen küld egymásnak egy keep-alive pinget. Ha az eszköz egyik SDK-ját használja, az ügyfél a következő táblázatban meghatározott időközönként küld egy életben maradó üzenetet:
| Nyelv | Alapértelmezett életben tartási időköz | Configurable |
|---|---|---|
| Node.js | 180 másodperc | No |
| Java | 230 másodperc | No |
| C | 240 másodperc | Yes |
| C# | 300* másodperc | Igen |
| Python | 60 másodperc | Igen |
*A C# SDK az MQTT KeepAliveInSeconds tulajdonság alapértelmezett értékét 300 másodpercként határozza meg. A valóságban az SDK egy pingelési jelzést négyszer küld az életben tartási időtartam alatt. Más szóval az SDK 75 másodpercenként küld egy élő pinget.
A MQTT 3.1.1-es verziós specifikációját követően IoT Hub életben tartásának pingelési időköze az ügyfél életben tartásának 1,5-szerese, IoT Hub azonban a kiszolgálóoldali időtúllépés maximális időtartamát 29,45 percre (1767 másodpercre) korlátozza.
Egy Java SDK-t használó eszköz például elküldi az életben tartási pinget, majd elveszíti a hálózati kapcsolatot. 230 másodperccel később az eszköz elmulasztja az életben tartási pinget, mert offline állapotban van. Azonban IoT Hub nem zárja be azonnal a kapcsolatot – újabb (230 * 1.5) - 230 = 115 másodpercet vár, mielőtt leválasztaná az eszközt a 404104 DeviceConnectionClosedRemotely hibával.
A kapcsolat maximálisan beállítható életben tartási ideje 1767 / 1.5 = 1177 másodperc. Minden forgalom alaphelyzetbe állítja az életben tartást. Például egy megosztott hozzáférési jogosultságkód (SAS) token sikeres frissítése alaphelyzetbe állítja a kapcsolat fenntartását.
Eszközalkalmazás migrálása AMQP-ről MQTT-be
Ha a device SDK-t használja, az AMQP-ről az MQTT-re való váltáshoz módosítania kell a protokollparamétert az ügyfél inicializálásában.
Amikor AMQP-ről MQTT-ra vált, ellenőrizze a következő elemeket:
Az AMQP számos feltétel hibáit adja vissza, míg az MQTT megszakítja a kapcsolatot. Emiatt előfordulhat, hogy módosítania kell a kivételkezelési logikát.
Az MQTT nem támogatja az elutasítási műveletet, ha felhőből eszközre irányuló üzeneteket fogad. Ha a háttéralkalmazásnak választ kell kapnia az eszközalkalmazástól, fontolja meg a közvetlen módszerek használatát.
Az AMQP nem támogatott a Python SDK-ban.
Az MQTT protokoll használata közvetlenül egy eszközről
Ha egy eszköz nem tudja használni az IoT-eszköz SDK-jait, akkor is csatlakozhat a nyilvános eszközvégpontokhoz a 8883-es port MQTT protokolljával.
Fontos
Ez a cikk az eszközök közös hozzáférésű jogosultságkóddal, más néven szimmetrikus kulcshitelesítéssel való csatlakoztatásának lépéseit tartalmazza. Ez a hitelesítési módszer alkalmas tesztelésre és kiértékeléshez, de az eszköz hitelesítése X.509-tanúsítványokkal biztonságosabb módszer. További információkért tekintse meg az IoT-megoldások biztonsági javaslatait és a kapcsolatbiztonságot>.
A CONNECT-csomagban az eszköznek a következő értékeket kell használnia:
A ClientId mezőhöz használja az eszközazonosítót.
A Felhasználónév mezőben használja a
{iotHub-hostname}/{device-id}/?api-version=2021-04-12, ahol a{iotHub-hostname}az IoT Hub teljesCNameneve.Ha például az IoT Hub neve contoso.azure-devices.net , és ha az eszköz neve MyDevice01, a Felhasználónév mező a következőket tartalmazza:
contoso.azure-devices.net/MyDevice01/?api-version=2021-04-12A váratlan viselkedés elkerülése érdekében adja meg az API-verziót a mezőben.
A Jelszó mezőben használjon SAS-jogkivonatot. Az alábbi kódrészlet az SAS-jogkivonat formátumát mutatja be:
SharedAccessSignature sig={signature-string}&se={expiry}&sr={URL-encoded-resourceURI}Megjegyzés:
Ha X.509-tanúsítványhitelesítést használ, az SAS-jogkivonat jelszavai nem szükségesek. További információ : Oktatóanyag: Tanúsítványok létrehozása és feltöltése teszteléshez , és kövesse a TLS konfigurációs szakaszában található kódutasításokat.
Az SAS-jogkivonatok létrehozásának módjáról további információt a A SAS-jogkivonatok eszközként való használataAz IoT Hub hozzáférésének vezérlése közös hozzáférésű jogosultságkódok használatával.
A Azure IoT Hub bővítményt is használhatja Visual Studio Code vagy a CLI bővítményparancsot az iot Hub generate-sas-token sas-token létrehozásához. Ezután tesztelési célokra másolhatja és beillesztheti az SAS-jogkivonatot a saját kódjába.
A bővítmény létrehoz egy SAS-jogkivonatot a következő struktúrával:
HostName={iotHub-hostname};DeviceId=javadevice;SharedAccessSignature=SharedAccessSignature sr={iotHub-hostname}%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802Ennek a jogkivonatnak a MQTT használatával történő csatlakozáshoz szükséges jelszó mezőként használt része a következő:
SharedAccessSignature sr={iotHub-hostname}%2Fdevices%2FMyDevice01%2Fapi-version%3D2016-11-14&sig=vSgHBMUG.....Ntg%3d&se=1456481802
Az eszközalkalmazás megadhat egy Will-üzenetet a CONNECT-csomagban . Az eszközalkalmazásnak a devices/{device-id}/messages/events/ vagy devices/{device-id}/messages/events/{property-bag} témakörnevet kell használnia mint Will, a telemetriai üzenetként továbbítandó Will-üzenetek meghatározásához. Ebben az esetben ha a hálózati kapcsolat bezárult, de a DISCONNECT csomag korábban nem érkezett meg az eszközről, akkor IoT Hub elküldi a WillCONNECT csomagot a telemetriai csatornára. A telemetriai csatorna lehet az alapértelmezett Events végpont vagy IoT Hub útválasztás által meghatározott egyéni végpont. Az üzenethez hozzá van rendelve az iothub-MessageType tulajdonság, amelynek értéke Will .
Az MQTT protokoll használata közvetlenül egy modulból
MQTT-n keresztül is csatlakozhat az IoT Hubhoz egy modulidentitás használatával. Ez a megközelítés hasonló az eszközként való csatlakozáshoz, de a következő értékeket kell használnia:
Állítsa be az ügyfélazonosítót a következőre
{device-id}/{module-id}: .Ha felhasználónévvel és jelszóval hitelesíti a felhasználónevet, állítsa be a felhasználónevet a következőre
<hubname>.azure-devices.net/{device_id}/{module_id}/?api-version=2021-04-12: . Ha SAS-t használ, használja a modul identitásához társított SAS-jogkivonatot jelszóként.devices/{device-id}/modules/{module-id}/messages/events/használandó a telemetria közzétételének témájaként.devices/{device-id}/modules/{module-id}/messages/events/használja a Will témakörként.Üzenetek fogadására használja a
devices/{device-id}/modules/{module-id}/#témakört.Az iker GET és a PATCH témakörök ugyanazok a modulok és eszközök esetében.
Az ikerállapot-témakör a modulok és az eszközök esetében is ugyanaz.
Az MQTT modulokkal való használatáról további információt a IoT Edge hub MQTT-végpont című témakörben talál.
Azure IoT eszköz SDK nélküli MQTT-t használó minták
A IoT MQTT-mintaadattár C/C++, Python és CLI-mintákat tartalmaz, amelyek bemutatják, hogyan küldhet telemetriai üzeneteket, fogadhat felhőből eszközre irányuló üzeneteket, és hogyan használhat ikereszközöket az Azure eszköz SDK-k használata nélkül.
A C/C++ minták a Eclipse Mosquitto könyvtárat használják, a Python minta Eclipse Paho, a CLI-minták pedig mosquitto_pub.
További információ: Oktatóanyag – Az MQTT használata IoT-eszközügyfél fejlesztésére eszköz SDK használata nélkül.
TLS-konfiguráció
Az MQTT protokoll közvetlen használatához az ügyfélnek TLS 1.2-n keresztül kell csatlakoznia. A lépés kihagyására tett kísérletek csatlakozási hibákkal meghiúsulnak.
TLS-kapcsolat létrehozásához előfordulhat, hogy le kell töltenie és hivatkoznia kell a DigiCert Global Root G2 főtanúsítványára, amelyet Azure használ. A tanúsítványról további információt a Digicert webhelyén talál.
Az alábbi példa bemutatja, hogyan implementálhatja ezt a konfigurációt a Paho MQTT-kódtár Python verziójával.
Először telepítse a Paho-kódtárat a parancssori környezetből:
pip install paho-mqtt
Ezután implementálja az ügyfelet egy Python szkriptben. Cserélje le ezeket a helyőrzőket a következő kódrészletben:
<local path to digicert.cer>A DigiCert főtanúsítványt tartalmazó helyi fájl elérési útja. Ezt a fájlt úgy hozhatja létre, hogy átmásolja a tanúsítványadatokat a C Azure IoT SDK certs.c fájljából. Tartalmazza a-----BEGIN CERTIFICATE-----és-----END CERTIFICATE-----sorokat, távolítsa el a"jeleket minden sor elejéről és végéről, valamint távolítsa el a\r\nkaraktereket minden sor végéről.<device id from device registry>az IoT Hubhoz hozzáadott eszköz azonosítója.A
<generated SAS token>a jelen cikkben korábban ismertetett módon létrehozott eszköz SAS-jogkivonata.<iot hub name>az IoT Hub neve.
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()
Eszköztanúsítvány használatával történő hitelesítéshez frissítse az előző kódrészletet az alábbi kódrészletben megadott módosításokkal. A tanúsítványalapú hitelesítésre való felkészülésről további információt az X.509 CA tanúsítvány beszerzése szakaszban talál az X.509 tanúsítvánnyal történő hitelesítés dokumentumban.
# 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)
Eszközről felhőbe irányuló üzenetek küldése
Miután az eszköz csatlakozott, üzeneteket küldhet IoT Hub devices/{device-id}/messages/events/ vagy devices/{device-id}/messages/events/{property-bag}Topic Name használatával. Az {property-bag} elem lehetővé teszi, hogy az eszköz más tulajdonságokkal rendelkező üzeneteket küldjön URL-kódolású formátumban. Például:
RFC 2396-encoded(<PropertyName1>)=RFC 2396-encoded(<PropertyValue1>)&RFC 2396-encoded(<PropertyName2>)=RFC 2396-encoded(<PropertyValue2>)…
Ez az {property_bag} elem ugyanazt a kódolást használja, mint a HTTPS protokoll lekérdezési sztringjei.
Ha D2C-üzeneteket szeretne átirányítani egy Azure Storage-fiókba, és JSON-kódolást szeretne használni, meg kell adnia a tartalomtípust és a tartalomkódolási adatokat, beleértve a $.ct=application%2Fjson&$.ce=utf-8, az előző megjegyzésben említett {property_bag} részeként.
Megjegyzés:
Ezeknek az attribútumoknak a formátuma protokollspecifikus. IoT Hub lefordítja ezeket az attribútumokat a megfelelő rendszertulajdonságokra. További információért tekintse meg az IoT Hub üzenetirányítási lekérdezési szintaxisrendszer tulajdonságai szakaszát.
Az alábbi lista IoT Hub MQTT-implementációspecifikus viselkedéseket foglalja össze:
IoT Hub nem támogatja a QoS 2-üzeneteket. Ha egy eszközalkalmazás QoS 2 használatával tesz közzé üzenetet, IoT Hub bezárja a hálózati kapcsolatot.
IoT Hub nem őriz meg
Retainüzeneteket. Ha egy eszköz az RETAIN 1 értékre állított jelölővel küld üzenetet, IoT Hub hozzáadja az mqtt-retain alkalmazástulajdonságot az üzenethez. Ebben az esetben a megtartott üzenet megőrzése helyett IoT Hub továbbítja azt a háttéralkalmazásnak.IoT Hub eszközenként csak egy aktív MQTT-kapcsolatot támogat. Minden új MQTT-kapcsolat ugyanazon eszközazonosító nevében azt eredményezi, hogy IoT Hub elveti a meglévő kapcsolatot, és 400027 ConnectionForcefullyClosedOnNewConnection ír a IoT Hub naplókba
Az üzenetek üzenettörzs alapján történő átirányításához először adjon hozzá tulajdonságot
ctaz MQTT-témakör végére, és állítsa az értékétapplication/json;charset=utf-8az alábbi példában látható módon. Az üzenetek üzenettulajdonságok vagy üzenettörzs alapján történő útválasztásáról az IoT Hub üzenet-útválasztási lekérdezés szintaxisának dokumentációjában olvashat.devices/{device-id}/messages/events/$.ct=application%2Fjson%3Bcharset%3Dutf-8
További információ: Az IoT Hub üzenetek küldése és fogadása.
Felhőből eszközre irányuló üzenetek fogadása
Az IoT Hub üzenetek fogadásához az eszköznek devices/{device-id}/messages/devicebound/#Topic Filter használatával kell előfizetnie. A témakörszűrő többszintű helyettesítő karaktere # lehetővé teszi, hogy az eszköz további tulajdonságokat kapjon a témakör nevében. IoT Hub nem engedélyezi a # vagy ? helyettesítő karakterek használatát az altopikák szűréséhez. IoT Hub nem általános célú közzétételi-feliratkozási üzenetközvetítő, csak a dokumentált témakörneveket és témakörszűrőket támogatja. Egy eszköz egyszerre csak öt témakörre tud előfizetni.
Az eszköz nem kap üzeneteket az IoT Hubre, amíg sikeresen fel nem iratkozik az eszközspecifikus végpontjára, amelyet a devices/{device-id}/messages/devicebound/# témakörszűrő jelöl. Az előfizetés létrehozása után az eszköz megkapja a felhőből az eszközre irányuló üzeneteket, amelyeket az előfizetés időpontja után küldtek neki. Ha az eszköz 0-ra beállított CleanSession jelzővel csatlakozik, az előfizetés különböző munkamenetekben megmarad. Ebben az esetben a következő alkalommal, amikor az eszköz CleanSession 0-val csatlakozik, megkap minden függőben lévő üzenetet, amelyeket a leválasztott állapotban küldtek neki. Ha az eszköz CleanSession jelzőt használ 1, azonban nem kap üzeneteket az IoT Hub-tól, amíg fel nem iratkozik az eszközvégpontjára.
IoT Hub üzeneteket küld a Topic Namedevices/{device-id}/messages/devicebound/ vagy devices/{device-id}/messages/devicebound/{property-bag} üzenettulajdonságokkal.
{property-bag} URL-kódolt kulcs-/értékpárokat tartalmaz az üzenettulajdonságokhoz. A tulajdonságcsomagban csak az alkalmazástulajdonságok és a felhasználó által beállított rendszertulajdonságok (például messageId vagy correlationId) szerepelnek. A rendszertulajdonságok nevei előtaggal $rendelkeznek, az alkalmazástulajdonságok az eredeti tulajdonságnevet használják előtag nélkül. A tulajdonságcsomag formátumáról további információt az eszközről a felhőbe irányuló üzenetek küldése című témakörben talál.
A felhőből az eszközre irányuló üzenetekben a tulajdonságcsomag értékei az alábbi táblázatban látható módon jelennek meg:
| Tulajdonságérték | Képviselet | Leírás |
|---|---|---|
null |
key |
Csak a kulcs jelenik meg a tulajdonságcsomagban |
| üres karaktersorozat | key= |
Az egyenlőségjel után következő kulcsnak nincs értéke |
| nem null, nem üres érték | key=value |
A kulcs, majd egy egyenlőségjel és az érték |
Az alábbi példa egy tulajdonság tárolót mutat be, amely három alkalmazástulajdonságot tartalmaz: prop1 értéke null; prop2, egy üres sztring (""); és prop3 értéke "egy sztring".
/?prop1&prop2=&prop3=a%20string
Amikor egy eszközalkalmazás előfizet egy témakörre QoS 2 szinttel, az IoT Hub az SUBACK csomagban a maximális 1. szintű QoS-t biztosítja. Ezt követően IoT Hub az 1. QoS használatával üzeneteket küld az eszköznek.
Ikereszköz tulajdonságainak lekérése
Először egy eszköz feliratkozik a $iothub/twin/res/#művelet válaszainak fogadásához. Ezután egy üres üzenetet küld a $iothub/twin/GET/?$rid={request id} témára, amely egy kitöltött kérésazonosítóval rendelkezik. A szolgáltatás ezután egy válaszüzenetet küld, amely az ikereszköz adatait tartalmazza a témakörben $iothub/twin/res/{status}/?$rid={request-id}, ugyanazzal a kérésazonosítóval , mint a kérés.
A kérésazonosító bármilyen érvényes érték lehet egy üzenettulajdonság értékéhez, és az állapot egész számként van érvényesítve. További információkért lásd: üzenetek küldése és fogadása az IoT Hubbal.
A válasz törzse az ikereszköz tulajdonságok szakaszát tartalmazza, ahogyan az a következő válaszpéldában is látható:
{
"desired": {
"telemetrySendFrequency": "5m",
"$version": 12
},
"reported": {
"telemetrySendFrequency": "5m",
"batteryLevel": 55,
"$version": 123
}
}
A lehetséges állapotkódok a következők:
| Status | Leírás |
|---|---|
| 200 | Success |
| 429 | Túl sok kérés (korlátozva). További információ: IoT Hub kvóták és szabályozás |
| 5** | Kiszolgálóhibák |
További információért lásd: Az eszközkettősök megértése és használata az IoT Hubban.
Az ikereszköz jelentett tulajdonságainak frissítése
A jelentett tulajdonságok frissítéséhez az eszköz kérést küld a IoT Hub egy kijelölt MQTT-témakörbe való közzétételsel. Miután IoT Hub feldolgozta a kérést, a frissítési művelet sikeres vagy sikertelen állapotával válaszol egy másik témakörbe való közzététellel. Az eszköz feliratkozhat erre a témakörre, hogy értesítéseket kapjon az ikerfrissítési kérelem eredményéről. Az ilyen típusú kérés-válasz interakció az MQTT-ben való implementálásához az eszköz a kezdeti frissítési kérelemben egy kérésazonosítót ($rid) biztosít. Ez a kérésazonosító ekkor megjelenik a IoT Hub válaszában, hogy lehetővé tegye az eszköz számára a válasz és a megfelelő kérés közötti korrelációt.
Az alábbi sorozat azt ismerteti, hogyan frissíti az eszköz a jelentett tulajdonságokat az ikereszközben a IoT Hub:
Egy eszköz először feliratkozik a
$iothub/twin/res/#témakörre, hogy válaszokat kapjon az IoT Hub-tól.Az eszköz egy üzenetet küld, amely tartalmazza az ikereszköz frissítését a
$iothub/twin/PATCH/properties/reported/?$rid={request-id}témakörhöz. Ez az üzenet egy kérésazonosító-értéket tartalmaz.A szolgáltatás ezután egy válaszüzenetet küld, amely tartalmazza a témakör
$iothub/twin/res/{status}/?$rid={request-id}jelentett tulajdonsággyűjteményének új ETag-értékét. Ez a válaszüzenet ugyanazt a kérésazonosítót használja, mint a kérés.
A kérelemüzenet törzse egy JSON-dokumentumot tartalmaz, amely új értékeket tartalmaz a jelentett tulajdonságokhoz. A JSON-dokumentum minden tagja frissül, vagy hozzáadja a megfelelő tagot az ikereszköz dokumentumához. Az a tag, amelyet null-ra állítanak, törlődik a tartalmazó objektumból. Például:
{
"telemetrySendFrequency": "35m",
"batteryLevel": 60
}
A lehetséges állapotkódok a következők:
| Status | Leírás |
|---|---|
| 204 | Siker (nem ad vissza tartalmat) |
| 400 | Hibás kérés. Hibásan formázott JSON |
| 429 | Túl sok kérelem (szabályozva) |
| 5** | Kiszolgálóhibák |
Az alábbi Python kódrészlet bemutatja a dupla jelentett tulajdonságok frissítési folyamatát az MQTT protokollon keresztül a Paho MQTT ügyfél használatával.
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)
Ha a készülékkettős által jelentett tulajdonságok frissítési folyamata sikeres, az IoT Hub egy üzenetet tesz közzé a következő témakörben: $iothub/twin/res/204/?$rid=1&$version=6, ahol 204 a sikerességet jelző állapotkód, $rid=1 a készülék által, a kódban megadott kérésazonosító, és $version a készülékkettős jelentett tulajdonságok frissítés utáni verzióját jelzi.
További információ: Eszközikeretek megértése és használata az IoT Hubban.
Kívánt tulajdonságok frissítési értesítésének fogadása
Amikor egy eszköz csatlakozik, IoT Hub értesítéseket küld a $iothub/twin/PATCH/properties/desired/?$version={new-version} témakörnek, amely tartalmazza a megoldás háttérrendszere által végrehajtott frissítés tartalmát. Például:
{
"telemetrySendFrequency": "5m",
"route": null,
"$version": 8
}
A tulajdonságfrissítések esetében az értékek azt jelentik, null hogy a JSON-objektumtag törölve van. Az $version jelzi az új verzióját a digitális ikermodell kívánt tulajdonságok szakaszának.
Fontos
IoT Hub csak akkor hoz létre változásértesítéseket, ha az eszközök csatlakoztatva vannak. Győződjön meg arról, hogy implementálja a device újracsatlakozási folyamatot, hogy a kívánt tulajdonságok szinkronizálva maradjanak a IoT Hub és az eszközalkalmazás között.
További információkért lásd: Az eszközpárok megértése és használata az IoT Hubban.
Válasz közvetlen metódusra
Először egy eszköz előfizet a következőre $iothub/methods/POST/#: . IoT Hub metóduskéréseket küld a témakörnek $iothub/methods/POST/{method-name}/?$rid={request-id}, érvényes JSON vagy üres törzs használatával.
A válaszhoz az eszköz egy érvényes JSON-t vagy üres törzset tartalmazó üzenetet küld a témakörnek $iothub/methods/res/{status}/?$rid={request-id}. Ebben az üzenetben a kérelemazonosítónak meg kell egyeznie a kérelemüzenetben szereplő azonosítóval , az állapotnak pedig egész számnak kell lennie.
További információkért lásd: A közvetlen metódusok megértése és meghívása az IoT Hubból.
Eszköztanúsítvány megújítása (működési tanúsítvány)
Először egy eszköz feliratkozik
$iothub/credential/#, hogy megkapja a művelet válaszát.Ezután közzétesz egy üzenetet a témakörbe
$iothub/credentials/POST/issueCertificate/?$rid={request_id}, ahol az üzenet egy kérésazonosító-értéket tartalmaz. A kérelem törzse tartalmazza a tanúsítványt kérő eszköz eszközazonosítóját és egy tanúsítvány-aláírási kérelmet (CSR).
{
"id": "device1", // Required. The ID for the device requesting the certificate. This may only be the active authenticated device.
"csr": "MIICYTCCAUkCAQAwHDEaMBgGA1wRZGAw...yM1X8USCtPz/1nRYDOtA==", // Required. The base64 encoded PKCS#10 CSR, without PEM header/footers or new lines.
"replace": "*", // Optional. Default null. "*" is accepted to replace any active request.
}
- A szolgáltatás ezután a témakör
$iothub/credential/res/{status}/?$rid={request-id}eszköztanúsítvány-adatait tartalmazó válaszüzenetet küld a kérés azonosítójával megegyező módon.
A kérésazonosító bármilyen érvényes érték lehet egy üzenettulajdonság értékéhez, és az állapot egész számként van érvényesítve. További információért lásd Az IoT Hub üzenet küldése és fogadása.
A válasz törzse tartalmazza a megújított eszköztanúsítvány teljes láncát, ahogyan az a következő válaszpéldában is látható:
{
"certificates": [
"-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", // Device cert
"-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", // Intermediate CA
"-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----" // Root CA
]
}
A lehetséges állapotkódok a következők:
| Status | Leírás |
|---|---|
| 200 | Success |
| 202 | A tanúsítvány-aláírási kérelem (CSR) elfogadva. Várakozás a válaszra. |
| 429 | Túl sok kérés (korlátozva). További információ: IoT Hub kvóták és szabályozás |
| 5** | Kiszolgálóhibák |
**További információ: Device tanúsítványmegújítás Azure IoT Hub tanúsítványkezelésben
Következő lépések
Az MQTT használatáról az alábbiakban olvashat bővebben: