O material a seguir é uma continuação do artigo sobre a funcionalidade incluída na nova versão do MQTTv5.0. Se você já o estudou, não será difícil perceber que a maioria das novas funções se baseia no conceito de propriedades que podem ser adicionadas ao pacote. Neste artigo, iremos analisá-los em detalhes.
Aproximadamente. - O artigo é direcionado àqueles que têm interesse ou precisam mergulhar profundamente nas complexidades do MQTT. Não haverá fotos e digressões líricas aqui, apenas hardcore !!!
Abaixo está uma tabela de todas as propriedades ( consulte a seção 2.2.2.2 na especificação ).
| EU IRIA | Nome | Tipo de dados | Propriedades do pacote / vontade |
| 1 | Indicador de formato de carga útil | Byte | PUBLICAR, Propriedades de Will |
| 2 | Intervalo de expiração da mensagem | Quatro Byte Inteiro | PUBLICAR, Propriedades de Will |
| 3 | Tipo de conteúdo | String codificada em UTF-8 | PUBLICAR, Propriedades de Will |
| 8 | Tópico de resposta | String codificada em UTF-8 | PUBLICAR, Propriedades de Will |
| nove | Dados de Correlação | Dados binários | PUBLICAR, Propriedades de Will |
| onze | Identificador de assinatura | Variável Byte Inteiro | PUBLICAR, ASSINAR |
| 17 | Intervalo de expiração da sessão | Quatro Byte Inteiro | CONNECT, CONNACK, DISCONNECT |
| dezoito | Identificador de cliente atribuído | String codificada em UTF-8 | CONNACK |
| 19 | Servidor Keep Alive | Inteiro de dois bytes | CONNACK |
| 21 | Método de autenticação | String codificada em UTF-8 | CONNECT, CONNACK, AUTH |
| 22 | Dados de autenticação | Dados binários | CONNECT, CONNACK, AUTH |
| 23 | Solicitar informações do problema | Byte | CONECTAR |
| 24 | Vai atrasar o intervalo | Quatro Byte Inteiro | Propriedades de vontade |
| 25 | Solicitar informações de resposta | Byte | CONECTAR |
| 26 | Informação de Resposta | String codificada em UTF-8 | CONNACK |
| 28 | Referência do servidor | String codificada em UTF-8 | CONECTAR, DESCONECTAR |
| 31 | Reason String | String codificada em UTF-8 | CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK, DISCONNECT, AUTH |
| 33 | Receber Máximo | Inteiro de dois bytes | CONNECT, CONNACK |
| 34 | Máximo de alias de tópico | Inteiro de dois bytes | CONNECT, CONNACK |
| 35 | Alias de tópico | Inteiro de dois bytes | PUBLICAR |
| 36 | QoS máximo | Byte | CONNACK |
| 37 | Reter Disponível | Byte | CONNACK |
| 38 | Propriedade do usuário | Par de cordas UTF-8 | CONNECT, CONNACK, PUBLISH, Will Properties, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, DISCONNECT, AUTH |
| 39 | Tamanho máximo do pacote | Quatro Byte Inteiro | CONNECT, CONNACK |
| 40 | Assinatura curinga disponível | Byte | CONNACK |
| 41 | Identificador de assinatura disponível | Byte | CONNACK |
| 42 | Assinatura compartilhada disponível | Byte | CONNACK |
Agora, vamos examiná-los mais de perto.
Indicador de formato de carga útil - indicador de formato de carga útil
- 0 - dados são um conjunto de bytes indefinidos, o que equivale a não enviar um indicador de formato de carga útil,
- 1 - os dados são dados de caracteres codificados em UTF-8.
Intervalo de expiração da mensagem - intervalo de expiração da mensagem
Um número que representa o intervalo de expiração da mensagem (em segundos).
Se o intervalo de expiração da mensagem tiver passado e o servidor não puder entregar a mensagem ao assinante correto, ele deve excluir a mensagem para esse assinante.
Tipo de conteúdo - tipo de conteúdo
O significado do tipo de conteúdo é determinado pelo cliente de envio e recebimento.
Tópico de resposta - um tópico para uma resposta
Uma sequência UTF-8 que é usada como o tópico para a mensagem de resposta.
O destinatário da mensagem com o tópico especificado para a resposta envia sua resposta, usando este tópico como o tópico de sua publicação.
A interação solicitação / resposta, neste caso, ocorre da seguinte forma ( consulte a cláusula 4.10.1 na especificação ):
- O cliente (remetente) publica uma mensagem de solicitação com algum tópico, que especifica o tópico para a resposta.
- () , , . . , .
- , , .
- . - . , .
Correlation Data —
Os dados de correlação são usados pelo remetente da mensagem de pedido para determinar a qual pedido a mensagem de resposta pertence quando é recebida. Se não houver dados de correlação, o solicitante não exigirá nenhum dado de correlação.
Se a mensagem de solicitação contiver dados de correlação, o receptor também deve incluir os dados de correlação como uma propriedade no pacote PUBLICAR da mensagem de resposta.
O valor dos dados de correlação é significativo apenas para o remetente da mensagem de solicitação e o receptor da mensagem de resposta.
Identificador de assinatura - identificador de assinatura
Um número que representa o ID da assinatura.
Se a publicação for o resultado de uma correspondência com mais de uma assinatura, vários IDs de assinatura serão especificados; nesse caso, sua ordem não importa.
Um cliente também pode fazer várias assinaturas que correspondem a uma determinada publicação e usar o mesmo identificador para várias delas. Nesse caso, o pacote PUBLISH conterá vários IDs de assinatura idênticos.
O ID de assinatura está associado a qualquer assinatura criada ou modificada como resultado do pacote SUBSCRIBE. Se houver um ID de assinatura, ele será salvo com a assinatura. Se esta propriedade não for especificada, nenhuma assinatura será salva com a assinatura.
Os IDs de inscrição fazem parte do estado da sessão no servidor e são devolvidos ao cliente que recebe o pacote PUBLICAR correspondente. Eles são removidos do estado de sessão do servidor quando o servidor recebe um pacote UNSUBSCRIBE, quando o servidor recebe um pacote SUBSCRIBE do cliente para o mesmo filtro de tópico, mas com uma ID de inscrição diferente ou sem ID de inscrição, ou quando o servidor envia uma Sessão Presente de 0 no pacote CONNACK.
Intervalo de expiração da sessão - intervalo de expiração da sessão
Um número que representa o intervalo (em segundos) para expirar a sessão.
Se não houver intervalo de expiração da sessão, será usado o valor 0. Se for definido como 0 ou não estiver presente, a sessão será encerrada quando a conexão de rede for fechada.
Se o intervalo de expiração da sessão for 0xFFFFFFFF (UINT_MAX), a sessão não expirará.
O cliente e o servidor devem manter o estado da sessão após o fechamento da conexão de rede se o intervalo de expiração da sessão for maior que 0.
O cliente pode se conectar ao servidor por meio de uma rede que fornece uma conexão intermitente. Este cliente pode usar um curto intervalo de expiração de sessão para que possa se reconectar quando a rede ficar disponível novamente e continuar a entregar mensagens de maneira confiável. Se o cliente não tiver tempo para restaurar a conexão, as mensagens serão perdidas.
Definir Clean Start para 1 e intervalo de expiração 0 é equivalente a definir CleanSession para 1 na especificação MQTT versão 3.1.1. Definir Clean Start para 0 e nenhum intervalo de expiração de sessão é equivalente a definir CleanSession para 0 na especificação MQTT versão 3.1.1.
Identificador de cliente atribuído - identificador de cliente atribuído
Uma string que é o ID do cliente atribuído pelo servidor. Usado se um identificador de cliente de comprimento zero foi usado no pacote CONNECT.
Servidor Keep Alive - servidor Keep Alive
Um número que define o tempo de Keep Alive atribuído pelo servidor. Se o servidor retorna Server Keep Alive em um pacote CONNACK, o cliente DEVE usar esse valor em vez do valor enviado como Keep Alive. Se o servidor não enviar Server Keep Alive, ele DEVE usar o valor Keep Alive definido pelo cliente no pacote CONNECT.
O principal uso do Servidor Keep Alive para um servidor é informar ao cliente que ele o desconectará em caso de inatividade antes que o Keep Alive especificado pelo cliente expire.
Método de autenticação - método de autenticação
Uma string contendo o nome do método de autenticação usado para autenticação estendida.
Se não houver um método de autenticação, a autenticação estendida não será executada.
Um método de autenticação é um acordo entre um cliente e um servidor sobre o significado dos dados enviados nos dados de autenticação e quaisquer outros campos em CONNECT, e as trocas e processamento exigidos pelo cliente e servidor para completar a autenticação. O método de autenticação geralmente é um mecanismo SASL.
Dados de autenticação - dados de autenticação
Dados binários contendo dados de autenticação. Enviado apenas se um método de autenticação for especificado. O conteúdo desses dados é determinado pelo método de autenticação.
Solicitar informações do problema - informações sobre o problema da solicitação
O cliente usa esse valor para indicar se uma sequência de caracteres de razão ou propriedades personalizadas são despachadas em caso de falha.
- 0 - o servidor pode retornar uma string de razão ou propriedades customizadas em um pacote CONNACK ou DISCONNECT, mas não deve enviar uma string de razão ou propriedades customizadas em qualquer pacote que não seja PUBLISH, CONNACK ou DISCONNECT,
- 1 - O servidor pode retornar uma string de razão ou propriedades personalizadas para qualquer pacote quando permitido.
Intervalo de atraso da mensagem - intervalo de atraso da mensagem
Um número que representa o intervalo de atraso da mensagem de vontade (em segundos). Se não houver intervalo de atraso, o padrão é 0 e não há atraso antes que a Mensagem de Will seja publicada.
O servidor atrasa a postagem da mensagem até que o intervalo de atraso expire ou a sessão termine, o que ocorrer primeiro. Se uma nova conexão de rede a esta sessão for estabelecida antes que o intervalo de atraso expire, o servidor NÃO DEVE enviar uma mensagem de vontade.
Uma maneira de usar isso é evitar a publicação de uma mensagem de vontade se houver uma desconexão temporária da rede e o cliente puder se reconectar e continuar a sessão antes que a mensagem seja publicada.
Solicitar informações de resposta - solicitar informações para uma resposta
Um byte com valor 0 ou 1. O cliente usa esse valor para solicitar ao servidor as informações de resposta CONNACK.
- 0 - o servidor não deve retornar informações de resposta,
- 1 - O servidor pode retornar informações de resposta em um pacote CONNACK, mas isso não é necessário mesmo que o cliente tenha solicitado essas informações.
Informações de resposta - informações para resposta
Uma string UTF-8 usada como base para criar o Tópico de resposta. A maneira como o cliente cria um Tópico de Resposta a partir das informações de resposta não é definida por esta especificação.
Isso normalmente é usado para transmitir um subconjunto globalmente exclusivo de tópicos que são reservados para este cliente, pelo menos durante o tempo de vida de sua sessão. O uso desse mecanismo permite que essa configuração seja executada uma vez no servidor, e não em cada cliente.
Referência do servidor - link para o servidor
Uma string que pode ser usada pelo cliente para identificar outro servidor em uso. O valor desta string é uma lista de links separados por espaço. O formato dos links não é regulamentado.
O servidor pode solicitar que o cliente use um servidor diferente, enviando um CONNACK ou DISCONNECT com o código de razão “Usar outro servidor” ou “Servidor movido”. Ao enviar um desses códigos, o servidor também pode incluir uma propriedade de referência do servidor para indicar a localização do servidor ou servidores que o cliente deve usar.
- Use um servidor diferente - O cliente deve alternar temporariamente para usar um servidor diferente.
- Servidor movido - O cliente deve sempre se conectar a um servidor diferente.
Recomenda-se que cada link consista em um nome seguido de dois pontos e um número de porta. Se o nome contiver dois pontos, a string do nome pode ser colocada entre colchetes. Um nome entre colchetes não pode conter o caractere de colchete direito ("]"). Isso é usado para representar um endereço IPv6 que usa dois pontos como separador.
O nome em um link de servidor geralmente é o nome do host, nome DNS, nome SRV ou endereço IP. O valor após os dois pontos é geralmente o número da porta decimal. Isso não é necessário se as informações da porta forem obtidas do nome (por exemplo, para SRV) ou for o padrão.
Se vários links forem fornecidos, o cliente deve selecionar um deles.
Exemplos de
myserver.xyz.org
myserver.xyz.org:8883
10.10.151.22:8883 [fe80 :: 9610: 3eff: fe1c]: 1883
myserver.xyz.org:8883
10.10.151.22:8883 [fe80 :: 9610: 3eff: fe1c]: 1883
String de motivo - a string de motivo
Uma string que descreve o motivo associado a esta resposta. O servidor usa esse valor para fornecer informações adicionais ao cliente.
O uso correto da string de razão no cliente incluirá o uso dessas informações em uma exceção lançada pelo código do cliente ou o registro da string de razão.
Máximo de recebimento - o valor máximo do número de pacotes QOS> 0
Um número que define a cota de envio, que é usado para limitar o número de pacotes PUBLISH QOS> 0 que podem ser enviados sem receber PUBACK (para QoS 1) ou PUBCOMP (para QoS 2). Ou seja, esse valor é usado para limitar o número de publicações de QoS 1 e QoS 2 enviadas simultaneamente. O cliente / servidor não deve enviar mensagens com QoS 1 e QoS 2 se houver Receber Máximo de mensagens enviadas que ainda não receberam respostas. Quando o Máximo de Recebimento é alcançado, o envio de pacotes com QoS 0 também pode ser pausado, mas não obrigatório. Ao mesmo tempo, não há necessidade de atrasar o envio de outros pacotes além de PUBLICAR.
Se o cliente e o servidor configuraram o Máximo de Recebimento para 1, eles garantem que não haja mais de uma mensagem "em andamento" ao mesmo tempo.
O valor especificado aplica-se apenas à conexão de rede atual e é reinicializado na reconexão.
Se não for especificado, o padrão é 65.535.
Máximo do alias do tópico - o valor máximo do alias do tópico
Um número que representa o valor máximo de um alias de tópico.
Este valor indica o maior valor que é aceito como o alias do tópico. É usado para limitar o número de apelidos de tópico que precisam ser armazenados nesta conexão.
Alias do tópico - alias do tópico
Para reduzir o tamanho do pacote PUBLICAR, o remetente pode usar um alias de tópico. Este é um valor inteiro usado para identificar o tópico em vez de usar o nome do tópico. Essa técnica reduz o tamanho do pacote PUBLICAR e é útil quando os nomes dos tópicos são longos e o mesmo nome é freqüentemente reutilizado em uma conexão de rede.
Do lado do destinatário, ao receber um pseudônimo para um tema, é estabelecida a correspondência necessária entre o tema e seu pseudônimo.
Se o pacote PUBLISH contém um apelido de tópico, o receptor o processa da seguinte maneira ( consulte a seção 3.3.4 na especificação ):
- ,
a) , , ,
b) , , , .
- ,
a) ,
b) , .
Maximum QoS — QoS
Pode ser 0 ou 1. Se não houver QoS máximo, o cliente usará o QoS máximo de 2.
Se o servidor não suportar pacotes PUBLICAR QoS 1 ou QoS 2, ele DEVE enviar o QoS máximo no pacote CONNACK indicando o QoS mais alto que suporta.
Se o cliente receber o máximo de QoS do servidor, ele não deve enviar PUBLICAR pacotes com um nível de QoS excedendo o máximo especificado.
Manter disponível - salvar está disponível
- 0 - mensagens salvas não são suportadas,
- 1 - mensagens salvas são suportadas.
Um cliente que recebe um Retain Available valor de 0 do servidor NÃO DEVE enviar um pacote PUBLISH com a bandeira RETAIN definida como 1.
Propriedade do usuário - propriedade do usuário
É um par de strings “nome” - “valor”. Esta propriedade, ao contrário de outras, pode aparecer várias vezes. O mesmo nome pode ser usado para várias propriedades.
Esta propriedade pode ser usada para fornecer diagnósticos adicionais ou outras informações.
O significado dessas propriedades não é especificado na especificação, seu significado e interpretação são conhecidos apenas pelos clientes de envio e recebimento.
Tamanho máximo do pacote - tamanho máximo do pacote
Um número que especifica o tamanho máximo do pacote que o cliente / servidor está disposto a aceitar. O tamanho do pacote é o número total de bytes no pacote MQTT. Esta propriedade é usada para indicar que os pacotes que excedem esse limite não serão processados.
Se não houver um tamanho máximo de pacote, nenhum limite de tamanho de pacote será imposto.
É responsabilidade do aplicativo selecionar um valor de tamanho máximo de pacote apropriado se ele optar por limitar o tamanho do pacote.
Assinatura curinga disponível - assinatura curinga disponível
- 0 - assinaturas curinga não são suportadas,
- 1 - essas assinaturas são suportadas.
Se a propriedade estiver ausente, as assinaturas curinga serão suportadas.
Se o servidor suportar assinaturas curinga, ele ainda poderá rejeitar uma solicitação de assinatura específica que contenha uma assinatura curinga.
Identificador de assinatura disponível - o identificador de assinatura está disponível
- 0 - IDs de assinatura não são suportados,
- 1 - IDs de assinatura são suportados.
Se a propriedade estiver ausente, os IDs de assinatura serão suportados.
Assinatura compartilhada disponível - assinatura compartilhada disponível
- 0 - assinaturas gerais não são suportadas,
- 1 - há suporte para assinaturas gerais.
Se a propriedade estiver ausente, as assinaturas gerais serão suportadas.
Conclusão
Deixe-me lembrá-lo de que o artigo nasceu enquanto eu trabalhava na incorporação da funcionalidade emergente descrita acima no serviço da plataforma IoT. Também me pareceu bastante conveniente exibir a exibição das propriedades recebidas do cliente na interface do objeto ( você pode ler mais sobre objetos aqui >>> ). Você pode ocultar propriedades desinteressantes e pode incluir propriedades customizadas adicionais para exibição. Em geral, é assim. Provavelmente é tudo. Para testar a funcionalidade, achei este projeto redboltz / mqtt_cpp bastante conveniente e claro . Eu ficaria muito feliz se nos comentários você compartilhasse outros projetos de software livre de clientes MQTT (com e sem interface de usuário) que suportam a versão 5.0.