El mensaje SUBSCRIBE permite a un cliente registrar un interés por uno o más nombres de temas con el intermediario. Los mensajes publicados para esos temas se entregan desde el intermediario al cliente como mensajes PUBLISH. El mensaje SUBSCRIBE también especifica el nivel de QoS con el cual el suscriptor desea recibir mensajes publicados.
La tabla de abajo describe el formato de la cabecera fija:
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | Tipo de mensaje (8) | Indicador DUP | Nivel de QoS | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
byte 2 | Longitud restante |
La cabecera variable contiene un ID de mensaje debido a que un mensaje SUBSCRIBE tiene un nivel de QoS 1.
Normalmente, la biblioteca de protocolos genera el ID de mensaje (Message ID) y lo devuelve a la aplicación de publicación como, por ejemplo, un manejador de devolución. Esto evita que varias aplicaciones o hebras de publicación se ejecuten en un solo cliente, generen ID de mensajes duplicados.
El ID de mensaje 0 (0x0000) está reservado como ID de mensaje no válido y no debe usarse. El ID de mensaje es un entero sin signo, de 16 bits, que normalmente aumenta exactamente en 1 de un mensaje a otro, pero que no está obligado a hacerlo. Los dos bytes del ID de mensaje están ordenados como MSB seguido de LSB (big-endian).
La tabla que sigue muestra un formato de ejemplo para la cabecera variable con un ID de mensaje 10.
Descripción | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Identificador de mensaje | |||||||||
byte 1 | MSB de ID de mensaje | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | LSB de ID de mensaje (10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
La carga útil de un mensaje SUBSCRIBE contiene una lista de nombres de temas a los que el cliente desea suscribirse y el nivel de QoS con el que el cliente desea recibir los mensajes. Las series de caracteres están codificadas en UTF y el nivel de QoS ocupa 2 bits de un solo byte. Estos pares de tema/QoS se empaquetan de forma contigua como puede verse en el ejemplo de carga útil de la tabla que sigue.
Nombre de tema | "a/b" |
QoS solicitado | 1 |
Nombre de tema | "c/d" |
QoS solicitado | 2 |
Los nombres de temas de un mensaje SUBSCRIBE no se comprimen.
El formato del ejemplo de carga útil puede verse en la tabla que sigue.
Descripción | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Nombre de tema | |||||||||
byte 1 | MSB de longitud (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | LSB de longitud (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 solicitado | |||||||||
byte 6 | QoS solicitado (1) | x | x | x | x | x | x | 0 | 1 |
Nombre de tema | |||||||||
byte 7 | MSB de longitud (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 8 | LSB de longitud (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 solicitado | |||||||||
byte 12 | QoS solicitado (2) | x | x | x | x | x | x | 1 | 0 |
Suponiendo que se haya otorgado el nivel de QoS solicitado, el cliente recibe los mensajes PUBLISH a un nivel inferior o igual a dicho nivel, dependiendo del nivel de QoS del mensaje original procedente del publicador. Por ejemplo, si un cliente tiene una suscripción a un tema determinado con un nivel de QoS 1, un mensaje PUBLISH con un nivel de QoS 0 se entregará al cliente al nivel de QoS 0. Un mensaje PUBLISH con un nivel de QoS 2 para el mismo tema bajará su nivel al nivel de QoS 1 para entregarlo al cliente.
Una consecuencia de lo anterior es que realizar una suscripción a un tema con el nivel de QoS 2 es igual que decir "Quisiera recibir mensajes sobre este tema con el nivel de QoS al que se publiquen".
El campo QoS solicitado se codifica en el byte que sigue a cada nombre de tema codificado en UTF, como se indica en la tabla que sigue.
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Reservado | Reservado | Reservado | Reservado | Reservado | Reservado | Nivel de QoS | ||
x | x | x | x | x | x |
Los 6 bits superiores de este byte no se utilizan en la versión actual del protocolo. Se han reservado para un uso posterior.