Il messaggio SUBSCRIBE consente ad un client di specificare al broker un interesse per uno o più nomi argomento. I messaggi pubblicati in questi argomenti sono consegnati dal broker al client come messaggi PUBLISH. Il messaggio SUBSCRIBE specifica anche il livello QoS a cui il sottoscrittore desidera ricevere i messaggi pubblicati.
La seguente tabella mostra il formato dell'intestazione fissa.
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | Tipo messaggio (8) | Indicatore DUP | Livello QoS | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
byte 2 | Lunghezza rimanente |
L'intestazione variabile contiene un ID messaggio perché un messaggio SUBSCRIBE ha un livello QoS pari a 1.
In genere, la libreria del protocollo genera l'ID messaggio e lo ritrasmette all'applicazione di pubblicazione, ad esempio come handle di ritorno. Questo impedisce che più applicazioni, più thread di pubblicazione, in esecuzione su un singolo client generino ID messaggio duplicati.
L'ID messaggio 0 (0x0000) è riservato come ID messaggio non valido e non può essere utilizzato. L'ID messaggio è un numero intero senza segno a 16-bit, che in genere aumenta esattamente di uno da un messaggio all'altro, ma non obbligatoriamente. I due byte dell'ID messaggio sono ordinati come MSB, seguito da LSB (big-endian).
La seguente tabella mostra un esempio di formato per l'intestazione variabile con un ID messaggio pari a 10.
Descrizione | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Identificativo del messaggio | |||||||||
byte 1 | MSB ID messaggio (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | LSB ID messaggio (10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
Il payload di un messaggio SUBSCRIBE contiene un elenco di nomi argomento a cui il client desidera effettuare una sottoscrizione e il livello QoS a cui il client desidera ricevere i messaggi. Le stringhe sono codificate UTF e il livello QoS occupa 2 bit di un singolo byte. Tali coppie argomento/QoS sono compresse in modo contiguo come mostrato nell'esempio di payload nella tabella seguente.
Nome argomento | "a/b" |
QoS richiesto | 1 |
Nome argomento | "c/d" |
QoS richiesto | 2 |
I nomi argomento in un messaggio SUBSCRIBE non sono compressi.
Il formato del payload di esempio è mostrato nella tabella seguente.
Descrizione | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Nome argomento | |||||||||
byte 1 | MSB della lunghezza (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | LSB della lunghezza (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 |
QoS richiesto | |||||||||
byte 6 | QoS richiesto (1) | x | x | x | x | x | x | 0 | 1 |
Nome argomento | |||||||||
byte 7 | MSB della lunghezza (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 8 | LSB della lunghezza (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 |
QoS richiesto | |||||||||
byte 12 | QoS richiesto (2) | x | x | x | x | x | x | 1 | 0 |
Ipotizzando che il livello QoS richiesto sia garantito, il client riceve messaggi PUBLISH ad un livello uguale o inferiore a questo, a seconda del livello QoS del messaggio originale dall'autore (publisher). Ad esempio, se un client ha una sottoscrizione QoS livello 1 ad un particolare argomento, un messaggio PUBLISH QoS livello 0 per tale argomento è consegnato al client ad un livello QoS 0. Un messaggio PUBLISH QoS livello 2 per lo stesso argomento è degradato ad un livello QoS 1 per la consegna al client.
Questo implica come corollario che la sottoscrizione ad un argomento al livello QoS 2 equivale a dire "Vorrei ricevere messaggi su questo argomento nel QoS in cui sono pubblicati".
Il campo QoS richiesto è codificato nel byte successivo ad ogni nome argomento codificato UTF come mostrato nella seguente tabella.
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Riservato | Riservato | Riservato | Riservato | Riservato | Riservato | Livello QoS | ||
x | x | x | x | x | x |
I 6 bit superiori di questo byte non sono utilizzati nella versione corrente del protocollo. Sono riservati ad un utilizzo futuro.