IoT Hub MQTT 5-Unterstützung (veraltet)
Version: 2.0 API-Version: 2020-10-01-preview
In diesem Dokument wird die API auf IoT Hub-Datenebene über das MQTT-Protokoll Version 5.0 definiert. Ausführliche Definitionen in dieser API finden Sie in der API-Referenz.
Hinweis
MQTT 5-Unterstützung in IoT Hub ist veraltet, und IoT Hub bietet nur eingeschränkte Featureunterstützung für MQTT. Wenn Ihre Lösung MQTT v3.1.1 oder v5 Unterstützung benötigt, empfehlen wir MQTT Unterstützung in Azure Event Grid. Weitere Informationen finden Sie unter Vergleichen der MQTT-Unterstützung in IoT Hub und Event Grid.
Voraussetzungen
- Erstellen Sie einen neuen IoT-Hub mit aktiviertem Vorschaumodus. MQTT 5 ist nur im Vorschaumodus verfügbar, und Sie können einen vorhandenen IoT-Hub nicht in den Vorschaumodus versetzen. Weitere Informationen finden Sie unter Aktivieren von Vorschaufunktionen.
- Vorkenntnisse der MQTT 5-Spezifikation.
Grad der Unterstützung und Einschränkungen
Die Unterstützung für MQTT 5 in IoT Hub befindet sich in der Vorschauphase und ist folgendermaßen eingeschränkt (wird an Clients über die CONNACK
-Eigenschaften übermittelt, sofern nicht anders angegeben):
- Es gibt noch keinen offiziellen Support für Azure IoT-Geräte-SDKs.
- Abonnementbezeichner werden nicht unterstützt.
- Gemeinsame Abonnements werden nicht unterstützt.
RETAIN
wird nicht unterstützt.Maximum QoS
ist1
.Maximum Packet Size
ist256 KiB
(unterliegt pro Vorgang weiteren Einschränkungen).- Zugewiesene Client-IDs werden nicht unterstützt.
Keep Alive
ist auf19 min
beschränkt (maximale Verzögerung bei der Aktivitätsüberprüfung:28.5 min
).Topic Alias Maximum
ist10
.Response Information
wird nicht unterstützt.CONNACK
gibt keineResponse Information
-Eigenschaft zurück, selbst wennCONNECT
eineRequest Response Information
-Eigenschaft enthält.Receive Maximum
(maximale Anzahl zulässiger ausstehender, nicht bestätigterPUBLISH
-Pakete (in Client-Server-Richtung) mitQoS: 1
) ist16
.- Ein einzelner Client darf nicht mehr als
50
Abonnements umfassen. Wenn ein Client das Abonnementlimit erreicht, gibtSUBACK
für Abonnements den Ursachencode „0x97
(Kontingent überschritten)“ zurück.
Lebenszyklus von Verbindungen
Verbindung
Wenn Sie mithilfe dieser API eine Verbindung mit IoT Hub herstellen möchten, richten Sie diese gemäß der MQTT 5-Spezifikation ein.
Der Client muss innerhalb von 30 Sekunden nach dem erfolgreichen TLS-Handshake ein CONNECT
-Paket senden, andernfalls trennt der Server die Verbindung.
Hier ist ein Beispiel für ein CONNECT
-Paket:
-> CONNECT
Protocol_Version: 5
Clean_Start: 0
Client_Id: D1
Authentication_Method: SAS
Authentication_Data: {SAS bytes}
api-version: 2020-10-10
host: abc.azure-devices.net
sas-at: 1600987795320
sas-expiry: 1600987195320
client-agent: artisan;Linux
- Die
Authentication Method
-Eigenschaft ist erforderlich. Sie gibt an, welche Authentifizierungsmethode verwendet wird. Weitere Informationen zu Authentifizierungsmethoden finden Sie unter Authentifizierung. - Die Verarbeitung der
Authentication Data
-Eigenschaft hängt von derAuthentication Method
ab. WennAuthentication Method
aufSAS
festgelegt wurde, istAuthentication Data
erforderlich und muss eine gültige Signatur enthalten. Weitere Informationen zu Authentifizierungsdaten finden Sie unter Authentifizierung. - Die
api-version
-Eigenschaft ist erforderlich und muss auf die im Header dieser Spezifikation angegebene API-Version festgelegt werden, damit diese Spezifikation angewandt wird. - Die
host
-Eigenschaft definiert den Hostnamen des Mandanten. Dies ist nicht erforderlich, wenn die SNI-Erweiterung beim TLS-Handshake im Hello-Eintrag vom Client enthalten war. sas-at
definiert den Zeitpunkt der Verbindung.sas-expiry
definiert die Ablaufzeit für die bereitgestellte SAS.client-agent
gibt optional Informationen zum Client an, der die Verbindung herstellt.
Hinweis
Authentication Method
und andere Eigenschaften in der Spezifikation mit Namen in Großbuchstaben sind erstrangige Eigenschaften in MQTT 5. Sie werden in der MQTT 5-Spezifikation ausführlich beschrieben. api-version
und andere Eigenschaften mit Bindestrichen sind Benutzereigenschaften, die für die IoT Hub-API spezifisch sind.
IoT Hub antwortet nach Abschluss der Authentifizierung und dem Sammeln von Daten für die Verbindung mit einem CONNACK
-Paket. Wenn die Verbindung erfolgreich hergestellt wurde, sieht CONNACK
wie folgt aus:
<- CONNACK
Session_Present: 1
Reason_Code: 0x00
Session_Expiry_Interval: 0xFFFFFFFF # included only if CONNECT specified value less than 0xFFFFFFFF and more than 0x00
Receive_Maximum: 16
Maximum_QoS: 1
Retain_Available: 0
Maximum_Packet_Size: 262144
Topic_Alias_Maximum: 10
Subscription_Identifiers_Available: 0
Shared_Subscriptions_Available: 0
Server_Keep_Alive: 1140 # included only if client did not specify Keep Alive or if it specified a bigger value
Diese Eigenschaften des CONNACK
-Pakets entsprechen der MQTT 5-Spezifikation. Sie spiegeln die IoT Hub-Funktionen wider.
Authentifizierung
Die Authentication Method
-Eigenschaft auf dem CONNECT
-Client definiert, welche Art von Authentifizierung für diese Verbindung verwendet wird:
SAS
: Die SAS (Shared Access Signature) wird in derAuthentication Data
-Eigenschaft vonCONNECT
bereitgestellt.X509
: Der Client nutzt die Clientzertifikatauthentifizierung.
Die Authentifizierung führt zu einem Fehler, wenn die Authentifizierungsmethode nicht mit der Methode übereinstimmt, die für den Client in IoT Hub konfiguriert wurde.
Hinweis
Für diese API muss die Authentication Method
-Eigenschaft im CONNECT
-Paket festgelegt werden. Wenn die Authentication Method
-Eigenschaft nicht angegeben wird, führt die Verbindungsherstellung zum Fehler Bad Request
.
Die in früheren API-Versionen verwendete Authentifizierung mit Benutzername und Kennwort wird nicht unterstützt.
SAS
Bei der SAS-basierten Authentifizierung muss ein Client die Signatur für den Verbindungskontext bereitstellen. Diese Signatur belegt die Authentizität der MQTT-Verbindung. Die Signatur muss auf einem von zwei Authentifizierungsschlüsseln in der Konfiguration des Clients in IoT Hub basieren. Oder sie muss auf einem von zwei gemeinsam genutzten Zugriffsschlüsseln einer gemeinsamen Zugriffsrichtlinie basieren.
Die Zeichenfolge für das Signieren muss wie folgt gebildet werden:
{host name}\n
{Client Id}\n
{sas-policy}\n
{sas-at}\n
{sas-expiry}\n
host name
wird entweder von der SNI-Erweiterung (die vom Client während des TLS-Handshakes im Hello-Eintrag übergeben wird) oder derhost
-Benutzereigenschaft imCONNECT
-Paket abgeleitet.Client Id
ist der Clientbezeichner imCONNECT
-Paket.sas-policy
(falls vorhanden) definiert die IoT Hub-Zugriffsrichtlinie für die Authentifizierung. Sie wird als Benutzereigenschaft imCONNECT
-Paket codiert. Optional: Wenn keine Angabe erfolgt, werden stattdessen die Authentifizierungseinstellungen in der Geräteregistrierung verwendet.sas-at
(falls vorhanden) gibt den Zeitpunkt der Verbindung an (aktuelle Zeit). Dies wird als Benutzereigenschaft vom Typtime
imCONNECT
-Paket codiert.sas-expiry
definiert die Ablaufzeit für die Authentifizierung. Es handelt sich um eine Benutzereigenschaft vom Typtime
imCONNECT
-Paket. Diese Eigenschaft ist erforderlich.
Wenn dies bei optionalen Parametern ausgelassen wird, MUSS stattdessen eine leere Zeichenfolge in der Signaturzeichenfolge verwendet werden.
Für das Konvertieren der Zeichenfolge in einen Hash wird HMAC-SHA256 basierend auf einem der symmetrischen Schlüssel des Geräts verwendet. Der Hashwert wird dann als Wert der Authentication Data
-Eigenschaft festgelegt.
X509
Wenn die Authentication Method
-Eigenschaft auf X509
festgelegt ist, authentifiziert IoT Hub die Verbindung basierend auf dem bereitgestellten Clientzertifikat.
Erneute Authentifizierung
Bei Verwendung der SAS-basierten Authentifizierung empfiehlt es sich, Authentifizierungstoken mit kurzer Lebensdauer zu verwenden. Um die Authentifizierung der Verbindung aufrecht zu erhalten und die Trennung aufgrund des Ablaufs zu verhindern, muss sich der Client erneut authentifizieren, indem er ein AUTH
-Paket mit Reason Code: 0x19
(erneute Authentifizierung) sendet:
-> AUTH
Reason_Code: 0x19
Authentication_Method: SAS
Authentication_Data: {SAS bytes}
sas-at: {current time}
sas-expiry: {SAS expiry time}
Regeln:
- Die
Authentication Method
muss mit der identisch sein, die für die anfängliche Authentifizierung verwendet wurde. - Wenn die Verbindung ursprünglich mithilfe einer SAS basierend auf der SAS-Richtlinie authentifiziert wurde, muss die bei der erneuten Authentifizierung verwendete Signatur auf derselben Richtlinie basieren.
Wenn die erneute Authentifizierung erfolgreich ist, sendet IoT Hub ein AUTH
-Paket mit Reason Code: 0x00
(Erfolg). Andernfalls sendet IoT Hub ein DISCONNECT
-Paket mit Reason Code: 0x87
(nicht autorisiert) und trennt die Verbindung.
Verbindungstrennung
Der Server kann die Verbindung mit dem Client aus verschiedenen Gründen trennen, darunter:
- Der Client verhält sich auf eine Weise falsch, die es unmöglich macht, direkt mit einer negativen Bestätigung (oder Antwort) zu antworten.
- Der Server kann den Status der Verbindung nicht auf dem neuesten Stand halten.
- Ein anderer Client stellt eine Verbindung mit derselben Identität dar.
Der Server kann die Verbindung mit jedem Ursachencode trennen, der in der Spezifikation zu MQTT 5.0 definiert ist. Wichtige Hinweise:
135
(nicht autorisiert): Wenn die erneute Authentifizierung zu einem Fehler führt, das aktuelle SAS-Token abläuft oder die Anmeldeinformationen des Geräts geändert werden.142
(Sitzung übernommen): wenn eine neue Verbindung mit derselben Clientidentität hergestellt wurde159
(Verbindungsrate überschritten): Wenn die Verbindungsrate für den IoT-Hub überschritten wurde.131
(implementierungsspezifischer Fehler): für benutzerdefinierte Fehler, die in dieser API definiert sind. Mithilfe der Eigenschaftenstatus
undreason
werden weitere Details zur Ursache der Verbindungstrennung übermittelt. (Weitere Informationen finden Sie unter Antwort.)
Operations
Sämtliche Funktionen in dieser API werden als Vorgänge ausgedrückt. Hier ist ein Beispiel für den Vorgang zum Senden von Telemetriedaten:
-> PUBLISH
QoS: 1
Packet_Id: 3
Topic: $iothub/telemetry
Payload: Hello
<- PUBACK
Packet_Id: 3
Reason_Code: 0
Eine umfassende Spezifikation der Vorgänge in dieser API finden Sie in der MQTT 5-API-Referenz auf IoT Hub-Datenebene.
Hinweis
Alle Beispiele in dieser Spezifikation werden aus der Perspektive des Clients beschrieben. Das Zeichen ->
bedeutet, dass der Client das Paket sendet, und <-
, dass er es empfängt.
Nachrichtenthemen und -abonnements
Die in den Nachrichten zu Vorgängen in dieser API verwendeten Themen beginnen mit $iothub/
.
Die Semantik für MQTT-Broker gilt für diese Vorgänge nicht. (Weitere Informationen finden Sie unter Themen, die mit $ beginnen.)
Themen, die mit $iothub/
beginnen und nicht in dieser API definiert sind, werden nicht unterstützt:
- Das Senden von Nachrichten an ein nicht definiertes Thema führt zur Antwort
Not Found
. (Weitere Details finden Sie unter Antwort.) - Das Abonnieren eines nicht definierten Themas führt zu
SUBACK
mitReason Code: 0x8F
(Themenfilter ungültig).
Bei Themen- und Eigenschaftennamen muss die Groß-/Kleinschreibung beachtet werden. $iothub/telemetry/
wird beispielsweise nicht unterstützt, $iothub/telemetry
hingegen schon.
Hinweis
Platzhalter in Abonnements unter $iothub/..
werden nicht unterstützt. Ein Client kann also nicht $iothub/+
oder $iothub/#
abonnieren. Entsprechende Versuche führen zu SUBACK
mit Reason Code: 0xA2
(Platzhalterabonnements nicht unterstützt). Anstelle von Pfadparametern im Themennamen werden nur Platzhalter für Einzelsegmente (+
) bei Vorgängen mit diesen unterstützt.
Interaktionstypen
Alle Vorgänge in dieser API basieren auf einem von zwei Interaktionstypen:
- Nachricht mit optionaler Bestätigung (MessageAck)
- Anforderung/Antwort (ReqRep)
Vorgänge unterscheiden sich auch nach der Richtung (Richtung der ersten Nachricht in der Kommunikation):
- Client-zu-Server (C2S)
- Server-zu-Client (S2C)
Das Senden von Telemetriedaten ist z. B. ein Client-zu-Server-Vorgang des Typs „Nachricht mit Bestätigung“, während die Verarbeitung direkter Methoden ein Server-zu-Client-Vorgang des Typs „Anforderung/Antwort“ ist.
Interaktionen bei der Nachrichtenbestätigung
Die Interaktion bei einer Nachricht mit optionaler Bestätigung (MessageAck) wird in MQTT als Austausch von PUBLISH
- und PUBACK
-Paketen ausgedrückt. Die Bestätigung ist optional, und der Absender kann sie auch nicht anfordern, indem er ein PUBLISH
-Paket mit QoS: 0
sendet.
Hinweis
Wenn Eigenschaften im PUBACK
-Paket abgeschnitten werden, da der Client Maximum Packet Size
deklariert hat, behält IoT Hub so viele Benutzereigenschaften bei, wie mit dem angegebenen Grenzwert möglich sind. Die zuerst aufgeführten Benutzereigenschaften haben eine höhere Wahrscheinlichkeit, gesendet zu werden, als die später aufgeführten. Die Reason String
-Eigenschaft hat die niedrigste Priorität.
Beispiel einer einfachen MessageAck-Interaktion
Meldung:
PUBLISH
QoS: 1
Packet_Id: 34
Topic: $iothub/{request.path}
Payload: <any>
Bestätigung (Erfolg):
PUBACK
Packet_Id: 34
Reason_Code: 0
Interaktionen mit Anforderung/Antwort
Bei Interaktionen vom Typ „Anforderung/Antwort“ (ReqRep) werden sowohl die Anforderung als auch die Antwort in PUBLISH
-Pakete mit QoS: 0
übersetzt.
Die Correlation Data
-Eigenschaft muss in beiden festgelegt werden. Sie dient dazu, das Antwortpaket mit dem Anforderungspaket abzugleichen.
Diese API verwendet das Antwortthema $iothub/responses
für alle ReqRep-Vorgänge. Das Abonnieren (und Aufheben des Abonnements) dieses Themas für Client-zu-Server-Vorgängen ist nicht erforderlich. Der Server sieht alle Clients als abonniert an.
Beispiel einer einfachen ReqRep-Interaktion
Anforderung:
PUBLISH
QoS: 0
Topic: $iothub/{request.path}
Correlation_Data: 0x01 0xFA
Payload: ...
Antwort (Erfolg):
PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x01 0xFA
Payload: ...
ReqRep-Interaktionen unterstützen keine PUBLISH
-Pakete mit QoS: 1
als Anforderungs- oder Antwortnachrichten. Das Senden der Anforderung PUBLISH
führt zur Antwort Bad Request
.
Die Correlation Data
-Eigenschaft unterstützt eine maximale Länge von 16 Byte. Wenn die Correlation Data
-Eigenschaft im PUBLISH
-Paket auf einen Wert von mehr als 16 Byte festgelegt ist, sendet IoT Hub DISCONNECT
mit dem Ergebnis Bad Request
und trennt die Verbindung. Dieses Verhalten gilt nur für Pakete, die innerhalb dieser API ausgetauscht werden.
Hinweis
Korrelationsdaten sind eine beliebige Bytesequenz, sodass z. B. nicht garantiert ist, dass es eine UTF-8-Zeichenfolge ist.
ReqRep verwendet für die Antwort vordefinierte Themen. Die Eigenschaft für das Antwortthema im PUBLISH
-Paket der Anforderung (sofern vom Absender festgelegt) wird ignoriert.
IoT Hub abonniert automatisch die Clients für Antwortthemen für sämtliche Client-zu-Server-ReqRep-Vorgänge. Selbst wenn der Client das Abonnement für das Antwortthema explizit kündigt, richtet IoT Hub das Abonnement automatisch wieder ein. Bei Server-zu-Client-ReqRep-Interaktionen muss das Gerät trotzdem ein Abonnement einrichten.
Nachrichteneigenschaften
Vorgangseigenschaften werden unabhängig davon, ob sie vom System oder vom Benutzer definiert wurden, in MQTT 5 als Paketeigenschaften ausgedrückt.
Bei Namen von Benutzereigenschaften wird die Groß-/Kleinschreibung beachtet, und die Schreibung muss genau der Definition entsprechen. Trace-ID
wird beispielsweise nicht unterstützt, trace-id
hingegen schon.
Anforderungen mit Benutzereigenschaften, die nicht der Spezifikation entsprechen und nicht das Präfix @
aufweisen, führen zu einem Fehler.
Systemeigenschaften werden entweder als erstrangige Eigenschaften (z. B. Content Type
) oder als Benutzereigenschaften codiert. Die Spezifikation enthält eine vollständige Liste der unterstützten Systemeigenschaften.
Es werden alle erstrangigen Eigenschaften ignoriert, für die in der Spezifikation nicht explizit die Unterstützung angegeben ist.
Wenn benutzerdefinierte Eigenschaften zulässig sind, müssen ihre Namen das Format @{property name}
aufweisen. Benutzerdefinierte Eigenschaften unterstützen nur gültige UTF-8-Zeichenfolgenwerte. So muss beispielsweise die MyProperty1
-Eigenschaft mit dem Wert 15
als Benutzereigenschaft mit dem Namen @MyProperty
und dem Wert 15
codiert werden.
Wenn IoT Hub eine Benutzereigenschaft nicht erkennt, wird sie als Fehler betrachtet, und IoT Hub antwortet mit PUBACK
mit Reason Code: 0x83
(implementierungsspezifischer Fehler) und status: 0100
(ungültige Anforderung). Wenn die Bestätigung nicht angefordert wurde (QoS: 0), wird das DISCONNECT
-Paket mit demselben Fehler zurückgesendet und die Verbindung wird beendet.
Diese API definiert neben string
die folgenden Datentypen:
time
: Anzahl der Millisekunden seit1970-01-01T00:00:00.000Z
, z. B.1600987195320
für2020-09-24T22:39:55.320Z
.u32
: ganze Zahl ohne Vorzeichen (32 Bit)u64
: ganze Zahl ohne Vorzeichen (64 Bit)i32
: ganze Zahl mit Vorzeichen (32 Bit)
Antwort
Interaktionen können zu unterschiedlichen Ergebnissen führen: Success
, Bad Request
, Not Found
und andere.
Die Ergebnisse werden mithilfe der status
-Benutzereigenschaft voneinander unterschieden. Reason Code
in PUBACK
-Paketen (für MessageAck-Interaktionen) entspricht soweit möglich dem status
.
Hinweis
Wenn der Client Request Problem Information: 0
im CONNECT-Paket angibt, werden in PUBACK
-Paketen keine Benutzereigenschaften gesendet, um die MQTT 5-Spezifikation einzuhalten. Dies schließt auch die status
-Eigenschaft ein. In diesem Fall kann der Client trotzdem mit Reason Code
ermitteln, ob die Bestätigung positiv oder negativ ist.
Jede Interaktion hat einen Standardwert (oder Erfolg). Dies ist ein Reason Code
von 0
und die status
-Eigenschaft mit dem Wert „not set“ (nicht festgelegt). Andernfalls:
- Bei MessageAck-Interaktionen hat
PUBACK
einen anderenReason Code
als „0x0“ (Erfolg). Diestatus
-Eigenschaft kann angegeben werden, um das Ergebnis zu verdeutlichen. - Bei ReqRep-Interaktionen wird bei der Antwort
PUBLISH
diestatus
-Eigenschaft festgelegt. - Da es keine Möglichkeit gibt, auf MessageAck-Interaktionen direkt mit
QoS: 0
zu antworten, wird dasDISCONNECT
-Paket stattdessen mit Antwortinformationen gefolgt von einer Trennungsanforderung gesendet.
Beispiele:
Ungültige Anforderung (MessageAck):
PUBACK
Reason_Code: 131
status: 0100
reason: Unknown property `test`
Nicht autorisiert (MessageAck):
PUBACK
Reason_Code: 135
status: 0101
Nicht autorisiert (ReqRep):
PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: ...
status: 0101
Bei Bedarf legt IoT Hub die folgenden Benutzereigenschaften fest:
status
: der erweiterte Code von IoT Hub für den Vorgangsstatus. Mithilfe dieses Codes können die Ergebnisse unterschieden werden.trace-id
: die Ablaufverfolgungs-ID für den Vorgang. IoT Hub kann weitere Diagnoseinformationen zu dem Vorgang speichern, die für interne Untersuchungen verwendet werden können.reason
: für Personen lesbare Nachricht mit zusätzlichen Informationen dazu, warum der Vorgang mit dem von derstatus
-Eigenschaft angegebenen Zustand beendet wurde.
Hinweis
Wenn der Client die Maximum Packet Size
-Eigenschaft im CONNECT-Paket auf einen sehr kleinen Wert festlegt, können möglicherweise nicht alle Benutzereigenschaften erfasst und im Paket angezeigt werden.
reason
ist nur für Personen gedacht und sollte nicht in der Clientlogik verwendet werden. In dieser API können Nachrichten jederzeit ohne eine Warnung oder Versionsänderung geändert werden.
Wenn der Client RequestProblemInformation: 0
im CONNECT-Paket sendet, werden gemäß der MQTT 5-Spezifikation keine Benutzereigenschaften in Bestätigungen eingeschlossen.
Statuscode
Die status
-Eigenschaft enthält den Statuscode für den Vorgang. Sie wurde für das effiziente maschinelle Lesen optimiert
und besteht aus einer ganzen Zahl ohne Vorzeichen mit zwei Byte, die als Hexadezimalwert in einer Zeichenfolge wie 0501
codiert wurde.
Codestruktur (Bitmap):
7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0
0 0 0 0 0 R T T | C C C C C C C C
Das erste Byte wird für Flags verwendet:
- Die Bits 0 und 1 geben den Ergebnistyp an:
00
: Erfolg01
: Clientfehler10
: Serverfehler
- Im zweiten Bit gibt
1
einen Fehlertyp an, der eine Wiederholung zulässt. - Die Bits 3 bis 7 sind reserviert und müssen auf
0
festgelegt werden.
Das zweite Byte enthält den eigentlichen eindeutigen Antwortcode. Fehlercodes mit unterschiedlichen Flags können im zweiten Byte denselben Wert aufweisen. Beispielsweise können die Fehlercodes 0001
, 0101
, 0201
und 0301
unterschiedliche Bedeutungen haben.
Too Many Requests
ist z. B. ein wiederholbarer Fehler mit dem eigenen Code 1
. Sein Wert lautet 0000 0101 0000 0001
oder 0x0501
.
Clients können Typbits verwenden, um zu ermitteln, ob der Vorgang erfolgreich abgeschlossen wurde. Außerdem können Clients anhand des Bits zur Wiederholbarkeit entscheiden, ob es sinnvoll ist, den Vorgang zu wiederholen.
Empfehlungen
Sitzungsverwaltung
Das CONNACK
-Paket enthält die Session Present
-Eigenschaft, die angibt, ob der Server eine zuvor erstellte Sitzung wiederhergestellt hat. Mithilfe dieser Eigenschaft können Sie herausfinden, ob Sie bestimmte Themen abonnieren müssen oder ob das Abonnement bereits zuvor abgeschlossen wurde.
Damit sich Clients auf Session Present
verlassen können, müssen sie die abgeschlossenen Abonnements nachverfolgen (also die gesendeten SUBSCRIBE
-Pakete und die SUBACK
-Pakete mit einem Erfolgs-Ursachencode) oder sicherstellen, dass alle Themen in einem SUBSCRIBE
/SUBACK
-Austausch abonniert wurden. Sendet der Client andernfalls zwei SUBSCRIBE
-Pakete, und der Server verarbeitet nur eines erfolgreich, übergibt der Server Session Present: 1
in CONNACK
, obwohl er nur einen Teil der Clientabonnements akzeptiert hat.
Um den Fall zu vermeiden, in dem eine ältere Version des Clients nicht alle Themen abonniert hat, sollten Sie bedingungslos alles abonnieren, wenn sich das Clientverhalten ändert (z. B. im Rahmen eines Firmwareupdates). Außerdem sollten Sie sicherstellen, dass Abonnements, die nicht mehr verwendet werden, explizit aus den Abonnements entfernt (und von der maximal zulässigen Anzahl von Abonnements abgezogen) werden, indem Sie nicht mehr verwendete Abonnements explizit aufheben.
Batchverarbeitung
Es gibt kein spezielles Format, um einen Batch von Nachrichten zu senden. Um den Aufwand bei ressourcenintensiven Vorgängen in TLS und im Netzwerk zu reduzieren, erstellen Sie Pakete (PUBLISH
, PUBACK
, SUBSCRIBE
usw.), bevor Sie sie an den zugrunde liegenden TLS/TCP-Stapel übergeben. Außerdem kann der Client einfacher einen Themenalias innerhalb des „Batches“ festlegen:
- Fügen Sie den vollständigen Themennamen in das erste
PUBLISH
-Paket für die Verbindung ein, und ordnen Sie ihm den Themenalias zu. - Fügen Sie nachfolgende Pakete für dasselbe Thema mit einem leeren Themennamen und leerer Themenaliaseigenschaft ein.
Migration
In diesem Abschnitt werden die Änderungen in der-API im Vergleich zur früheren MQTT-Unterstützung aufgelistet.
- Das Transportprotokoll ist MQTT 5. Bisher war dies MQTT 3.1.1.
- Kontextinformationen für die SAS-Authentifizierung sind direkt im
CONNECT
-Paket enthalten und werden nicht zusammen mit der Signatur codiert. - Die verwendete Authentifizierungsmethode wird mithilfe der Authentifizierungsmethode angegeben.
- Die SAS (Shared Access Signature) wird in die Eigenschaft mit den Authentifizierungsdaten eingefügt. Bisher wurde dafür das Feld für das Kennwort verwendet.
- Die Themen für Vorgänge haben sich geändert:
- Telemetrie:
$iothub/telemetry
stattdevices/{Client Id}/messages/events
- Befehle:
$iothub/commands
stattdevices/{Client Id}/messages/devicebound
- Gemeldete Patchzwillinge:
$iothub/twin/patch/reported
statt$iothub/twin/PATCH/properties/reported
- Benachrichtigen des Zwillings bei Änderung des gewünschten Zustands:
$iothub/twin/patch/desired
statt$iothub/twin/PATCH/properties/desired
- Telemetrie:
- Für das Antwortthema für Client-zu-Server-Vorgänge vom Typ „Anforderung/Antwort“ ist kein Abonnement erforderlich.
- Im Segment für den Themennamen werden anstelle von codierten Eigenschaften Benutzereigenschaften verwendet.
- Bei Eigenschaftennamen wird eine Schreibung mit Bindestrichen anstelle von Abkürzungen mit einem speziellen Präfix verwendet. Jetzt erfordern stattdessen benutzerdefinierte Eigenschaften ein Präfix. Beispielsweise ist
$.mid
jetztmessage-id
, währendmyProperty1
zu@myProperty1
wird. - Anforderungs- und Antwortnachrichten für Vorgänge vom Typ „Anforderung/Antwort“ werden nicht mehr mit der im Thema codierten
$rid
-Eigenschaft, sondern mithilfe der Eigenschaften mit Korrelationsdaten korreliert. - Die
iothub-connection-auth-method
-Eigenschaft wird nicht mehr als Stempel für Telemetrieereignisse verwendet. - C2D-Befehle werden nicht gelöscht, wenn das Abonnement vom Gerät fehlt. Sie bleiben so lange in der Warteschlange, bis das Gerät ein Abonnement einrichtet oder bis sie ablaufen.
Beispiele
Senden von Telemetriedaten
Meldung:
-> PUBLISH
QoS: 1
Packet_Id: 31
Topic: $iothub/telemetry
@myProperty1: My String Value # optional
creation-time: 1600987195320 # optional
@ No_Rules-ForUser-PROPERTIES: Any UTF-8 string value # optional
Payload: <data>
Bestätigung:
<- PUBACK
Packet_Id: 31
Reason_Code: 0
Alternative Bestätigung (gedrosselt):
<- PUBACK
Packet_Id: 31
Reason_Code: 151
status: 0501
Senden einer Anforderung zum Abrufen des Zwillingsstatus
Anforderung:
-> PUBLISH
QoS: 0
Topic: $iothub/twin/get
Correlation_Data: 0x01 0xFA
Payload: <empty>
Antwort (Erfolg):
<- PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x01 0xFA
Payload: <twin/desired state>
Antwort (nicht zulässig):
<- PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x01 0xFA
status: 0102
reason: Operation not allowed for `B2` SKU
Payload: <empty>
Verarbeiten von Aufrufen direkter Methoden
Anforderung:
<- PUBLISH
QoS: 0
Topic: $iothub/methods/abc
Correlation_Data: 0x0A 0x10
Payload: <data>
Antwort (Erfolg):
-> PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x0A 0x10
response-code: 200 # user defined response code
Payload: <data>
Hinweis
status
wurde nicht festgelegt, sondern es ist eine Antwort für einen Erfolg.
Antwort bei einem nicht verfügbaren Gerät:
-> PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x0A 0x10
status: 0603
Fehler bei der Verwendung von QoS 0, Teil 1
Anforderung:
-> PUBLISH
QoS: 0
Topic: $iothub/twin/gett # misspelled topic name - server won't recognize it as Request-Response interaction
Correlation_Data: 0x0A 0x10
Payload: <data>
Antwort:
<- DISCONNECT
Reason_Code: 144
reason: "Unsupported topic: `$iothub/twin/gett`"
Fehler bei der Verwendung von QoS 0, Teil 2
Anforderung:
-> PUBLISH # missing Correlation Data
QoS: 0
Topic: $iothub/twin/get
Payload: <data>
Antwort:
<- DISCONNECT
Reason_Code: 131
status: 0100
reason: "`Correlation Data` property is missing"
Nächste Schritte
- Die API-Referenz für die Vorschauversion von MQTT 5 finden Sie in der MQTT 5-API-Referenz zur IoT Hub-Datenebene (Vorschau).
- Ein C#-Beispiel finden Sie im GitHub-Beispielrepository.