Mit der SUBSCRIBE-Nachricht kann ein Client einen Interessenten für einen oder mehrere Abschnittsnamen beim Broker registrieren. Nachrichten, die zu diesen Themen veröffentlicht wurden, stellt der Broker vom Client als PUBLISH-Nachrichten zu. Die SUBSCRIBE-Nachricht gibt zudem die QoS-Ebene an, in der der Subskribent veröffentlichte Nachrichten empfangen möchte.
Die nachfolgende Tabelle zeigt das Format des festen Headers.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Byte 1 | Nachrichtenart (8) | DUP-Flag | QoS-Ebene | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
Byte 2 | Verbleibende Länge |
Der variable Header enthält eine Nachrichten-ID, da eine SUBSCRIBE-Nachricht die QoS-Ebene 1 hat.
Für gewöhnlich generiert die Protokollbibliothek die Nachrichten-ID und gibt sie an die veröffentlichende Anwendung zurück, beispielsweise als Rückgabekennung. Auf diese Weise wird vermieden, dass mehrere Anwendungen oder Veröffentlichungs-Threads auf einem einzelnen Client ausgeführt werden und doppelte Nachrichten-ID generieren.
Die Nachrichten-ID 0 (0x0000) ist als ungültige Nachrichten-ID reserviert und darf nicht verwendet werden. Die Nachrichten-ID ist eine 16-Bit-Ganzzahl ohne Vorzeichen, die sich üblicherweise mit jeder Nachricht genau um den Wert von 1 erhöht. Dies ist jedoch nicht erforderlich. Die beiden Bytes der Nachrichten-ID werden in der MSB, gefolgt von LSB (Big Endian), sortiert.
Die nachfolgende Tabelle zeigt ein Beispielformat des variablen Headers mit der Nachrichten-ID 10.
Beschreibung | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Nachrichten-ID | |||||||||
Byte 1 | Nachrichten-ID MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 2 | Nachrichten-ID LSB (10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
Die Nutzlast einer SUBSCRIBE-Nachricht enthält eine Liste der vom Client subskribierten Abschnittsnamen und die QoS-Ebene, mit der der Client die Nachrichten empfangen möchte. Die Zeichenfolgen sind UTF-verschlüsselt, und die QoS-Ebene belegt 2 Bit eines Einzel-Bytes. Diese Abschnitt/QoS-Paare werden zusammenhängend gepackt, wie im Nutzlast-Beispiel in der nachfolgenden Tabelle gezeigt.
Abschnittsname | "a/b" |
Angeforderte QoS-Ebene | 1 |
Abschnittsname | "c/d" |
Angeforderte QoS-Ebene | 2 |
Abschnittsnamen in einer SUBSCRIBE-Nachricht werden nicht komprimiert.
Die nachfolgende Tabelle zeigt das Format der Beispiel-Nutzlast.
Beschreibung | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Abschnittsname | |||||||||
Byte 1 | Länge MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 2 | Länge LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Byte 3 | 'a' (0x61) | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
Byte 4 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
Byte 5 | 'b' (0x62) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
Angeforderte QoS-Ebene | |||||||||
Byte 6 | Angeforderte QoS-Ebene (1) | x | x | x | x | x | x | 0 | 1 |
Abschnittsname | |||||||||
Byte 7 | Länge MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Byte 8 | Länge LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Byte 9 | 'c' (0x63) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
Byte 10 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
Byte 11 | 'd' (0x64) | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
Angeforderte QoS-Ebene | |||||||||
Byte 12 | Angeforderte QoS-Ebene (2) | x | x | x | x | x | x | 1 | 0 |
In der Annahme, dass die angeforderte QoS-Ebene erteilt ist, empfängt der Client PUBLISH-Nachrichten auf dieser Ebene oder darunter, je nach QoS-Ebene der ursprünglichen Nachricht des Publishers. Beispiel: Wenn ein Client ein bestimmtes Thema mit der QoS-Ebene 1 subskribiert hat, wird eine PUBLISH-Nachricht mit der QoS-Ebene 0 an den Client auf QoS-Ebene 0 gesendet. Eine PUBLISH-Nachricht mit der QoS-Ebene 2 an dasselbe Thema wird heruntergesetzt auf die QoS-Ebene 1 zur Zustellung an den Client.
Als Folge ist das Subskribieren eines Themas mit QoS-Ebene 2 gleichbedeutend mit der Aussage "Ich möchte Nachrichten zu diesem Thema auf der QoS-Ebene erhalten, auf der sie veröffentlicht sind.".
Das Feld mit der angeforderten QoS-Ebene ist in den Byte verschlüsselt, die auf jeden UTF-verschlüsselten Abschnittsnamen folgen (siehe nachfolgende Tabelle).
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Reserviert | Reserviert | Reserviert | Reserviert | Reserviert | Reserviert | QoS-Ebene | ||
x | x | x | x | x | x |
Die oberen 6 Bit dieses Byte werden in der aktuellen Protokollversion nicht verwendet. Sie sind zur zukünftigen Nutzung reserviert.