A mensagem SUBSCRIBE permite que um cliente registre um interesse em um ou mais nomes de tópicos com o intermediário. As mensagens publicadas nesses tópicos são entregues do intermediário para o cliente como mensagens PUBLISH. A mensagem SUBSCRIBE também especifica o nível de QoS no qual o assinante deseja receber mensagens publicadas.
A tabela abaixo mostra o formato do cabeçalho fixo.
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | Tipo de Mensagem (8) | Sinalizador DUP | Nível de QoS | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
byte 2 | Comprimento Restante |
O cabeçalho variável contém um ID da Mensagem porque uma mensagem SUBSCRIBE possui um nível de QoS 1.
Geralmente, a biblioteca de protocolos gera o ID da Mensagem e o transmite de volta ao aplicativo de publicação, por exemplo, como uma identificador de retorno. Isso impede vários aplicativos ou vários encadeamentos de publicação, em execução em um único cliente de gerarem IDs de Mensagem duplicados.
O ID da Mensagem 0 (0x0000) está reservado como um ID da Mensagem inválido, e não deve ser utilizado. O ID de Mensagem é um inteiro não sinalizado de 16 bits, que geralmente aumenta exatamente uma vez, de uma mensagem para a próxima, mas não é necessário fazer isso. Os dois bytes do ID da Mensagem são ordenados como MSB, seguidos por LSB (big-endian).
A tabela abaixo mostra um formato de exemplo para o cabeçalho variável com um ID de Mensagem de 10.
Descrição | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Identificador de Mensagens | |||||||||
byte 1 | ID da Mensagem MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | ID da Mensagem LSB (10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
A carga útil de uma mensagem SUBSCRIBE contém uma lista de nomes de tópicos para os quais o cliente deseja fazer assinatura e o nível de QoS no qual o cliente deseja receber mensagens. As cadeias são codificadas por UTF e o nível de QoS ocupa 2 bits de um único byte. Estes pares de tópico/QoS são compactados de forma contígua, conforme mostrado na carga útil de exemplo na tabela abaixo.
Nome do Tópico | "a/b" |
QoS Solicitado | 1 |
Nome do Tópico | "c/d" |
QoS Solicitado | 2 |
Os nomes de tópicos em uma mensagem SUBSCRIBE não são compactados.
O formato da carga útil de exemplo é mostrado na tabela abaixo.
Descrição | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
Nome do Tópico | |||||||||
byte 1 | Comprimento MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | Comprimento 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 |
QoS Solicitado | |||||||||
byte 6 | QoS Solicitado (1) | x | x | x | x | x | x | 0 | 1 |
Nome do Tópico | |||||||||
byte 7 | Comprimento MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 8 | Comprimento 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 |
QoS Solicitado | |||||||||
byte 12 | QoS Solicitado (2) | x | x | x | x | x | x | 1 | 0 |
Assumindo que o nível de QoS solicitado seja concedido, o cliente recebe mensagens PUBLISH em nível menor ou igual a esse, dependendo do nível de QoS da mensagem original do editor. Por exemplo, se um cliente tiver uma assinatura de nível de QoS 1 para um determinado tópico, uma mensagem PUBLISH de nível de QoS 0 será entregue para o cliente no nível de QoS 0. Uma mensagem PUBLISH de nível de QoS 2 para o mesmo tópico é rebaixada para o nível de QoS 1 para entrega para o cliente.
O resultado disso é que a assinatura para um tópico no nível de QoS 2 é equivalente a informar "Desejo receber mensagens sobre este tópico no QoS no qual elas são publicadas".
O campo QoS Solicitado é codificado no byte após cada nome de tópico codificado por UTF conforme mostrado na tabela abaixo.
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Reservado | Reservado | Reservado | Reservado | Reservado | Reservado | Nível de QoS | ||
x | x | x | x | x | x |
Os 6 bits superiores deste byte não são utilizados na versão atual do protocolo. Eles estão reservados para utilização futura.