Recursos MQTT compatíveis com o recurso do agente MQTT da Grade de Eventos do Azure

O MQTT é um protocolo de transporte de mensagens de publicação/assinatura que foi projetado para ambientes restritos. Ele é eficiente, escalonável e confiável, o que o tornou o padrão ouro para comunicação em cenários de IoT. O Agente MQTT dá suporte a clientes que publicam e assinam mensagens via MQTT v3.1.1, MQTT v3.1.1 por WebSockets, MQTT v5 e MQTT v5 por WebSockets. O Agente MQTT também dá suporte à comunicação de versão MQTT cruzada (MQTT 3.1.1 e MQTT 5).

O MQTT v5 introduziu muitos aprimoramentos em relação ao MQTT v3.1.1 para fornecer uma comunicação mais contínua, transparente e eficiente. Ele adicionou:

  • Melhores relatórios de erros.
  • Clientes de comunicação mais transparentes por meio de recursos como propriedades do usuário e tipo de conteúdo.
  • Mais controle aos clientes sobre a comunicação por meio de recursos como expiração de mensagem e sessão.
  • Padrões importantes, como o padrão de solicitação-resposta.

Fluxo de conexão:

Os clientes MQTT precisam se conectar via TLS 1.2 ou TLS 1.3. As tentativas de ignorar essa etapa causam falhas de conexão.

Durante a conexão com o Agente MQTT, use as seguintes portas durante a comunicação por meio do MQTT:

  • MQTT v3.1.1 e MQTT v5 na porta TCP 8883
  • MQTT v3.1.1 via WebSocket e MQTT v5 via WebSocket na porta TCP 443.

O pacote CONNECT deve incluir as seguintes propriedades:

  • O campo ClientId é obrigatório e deve incluir o nome da sessão do cliente. O nome da sessão precisa ser exclusivo no namespace. Você poderá usar o nome de autenticação do cliente como o nome da sessão se cada cliente estiver usando uma sessão por cliente. Se um cliente estiver usando várias sessões, ele precisará usar valores diferentes para ClientId em cada uma das sessões.
  • O campo Username é obrigatório se você não selecionou um valor em alternativeAuthenticationNameSources durante a criação do namespace. Nesse caso, você precisa fornecer o nome de autenticação do cliente no campo Username. Esse nome precisa corresponder ao nome de autenticação fornecido e ao valor do campo de certificado do cliente especificado durante a criação do recurso do cliente.

Saiba mais sobre a autenticação do cliente.

Suporte a várias sessões

O suporte a várias sessões permite que os clientes MQTT do aplicativo tenham uma implementação mais escalonável e confiável conectando-se ao Agente MQTT com várias sessões ativas ao mesmo tempo.

Configuração do namespace

Antes de usar esse recurso, você precisa configurar o namespace para permitir várias sessões por cliente. Use as seguintes etapas para configurar várias sessões por cliente no portal do Azure:

  • Acesse seu namespace no portal do Azure.
  • Em Configuração, altere o valor de Máximo de sessões de cliente por nome de autenticação para o número desejado de sessões por cliente.
  • Selecione Aplicar.

Observação

Para a configuração da CLI do Azure, atualize a propriedade MaxClientSessionsPerAuthenticationName no conteúdo do namespace com o valor desejado.

Fluxo de conexão:

Os pacotes CONNECT para cada sessão devem incluir as seguintes propriedades:

  • Forneça a propriedade Username no pacote CONNECT para indicar o nome de autenticação do cliente.
  • Forneça a propriedade ClientID no pacote CONNECT para indicar o nome da sessão, pois há um ou mais valores de ClientID para cada Username.

Por exemplo, as seguintes combinações de Username e ClientIds no pacote CONNECT permitem que o cliente "Mgmt-application" se conecte ao agente MQTT em três sessões independentes:

  • Primeira sessão:
    • Username: Mgmt-application
    • ClientId: Mgmt-Session1
  • Segunda sessão:
    • Username: Mgmt-application
    • ClientId: Mgmt-Session2
  • Terceira sessão:
    • Username: Mgmt-application
    • ClientId: Mgmt-Session3

Diagrama de um exemplo multissessão.

Para obter mais informações, confira Como estabelecer várias sessões para um só cliente.

Processamento das sessões:

  • Se um cliente tentar controlar a sessão ativa de outro cliente apresentando o seu nome de sessão com um nome de autenticação diferente, a solicitação de conexão dele será rejeitada com um erro de Não autorizado. Por exemplo, se o cliente B tentar se conectar à sessão 123 que está atribuída naquele momento ao cliente A, a solicitação de conexão do cliente B será rejeitada. Sendo assim, se o mesmo cliente tentar se reconectar com os mesmos nomes de sessão e o mesmo nome de autenticação, ele poderá controlar a sua sessão existente.
  • Se um recurso de cliente for excluído sem encerrar sua sessão, outros clientes não poderão usar seu nome de sessão até que ela expire. Por exemplo, se o cliente B criar uma sessão com o nome da sessão 123 e o cliente B for excluído, o cliente A só poderá se conectar à sessão 123 quando ela expirar.
  • O limite para o número de sessões por cliente se aplica a sessões online e offline a qualquer momento. Por exemplo, considere um namespace com o máximo de sessões de cliente por nome de autenticação definido como 1. Se o cliente A se conectar com uma sessão persistente 123 e for desconectado, o cliente A não poderá se conectar com uma nova sessão 456, pois sua sessão 123 ainda está ativa mesmo estando offline. Assim, é recomendável que o mesmo cliente sempre se reconecte com os mesmos nomes de sessão estáticos em vez de gerar um novo nome de sessão a cada reconexão.

Recursos do MQTT

O recurso Agente MQTT da Grade de Eventos do Azure dá suporte aos seguintes recursos MQTT:

Qualidade do serviço (QoS)

O Agente MQTT dá suporte ao QoS 0 e 1, que definem a garantia de entrega de mensagens em pacotes PUBLISH e SUBSCRIBE entre clientes e o Agente MQTT. A QoS 0 garante a entrega no máximo uma vez: as mensagens com a QoS 0 não são confirmadas pelo assinante nem são retransmitidas pelo editor. A QoS 1 garante a entrega pelo menos uma vez: as mensagens serão confirmadas pelo assinante e serão retransmitidas pelo editor se não forem confirmadas. A QoS permite que os clientes controlem a eficiência e a confiabilidade da comunicação.

Sessões persistentes

O Agente MQTT dá suporte a sessões persistentes para MQTT v3.1.1, de modo que o Agente MQTT preserva informações sobre a sessão de um cliente em caso de perda de conexão para garantir a confiabilidade da comunicação. Essas informações incluem as assinaturas do cliente e as mensagens de QoS 1 perdidas/não confirmadas. Os clientes podem configurar uma sessão persistente por meio da configuração do sinalizador cleanSession no pacote CONNECT como false.

Início Limpo e Expiração da Sessão

O MQTT v5 introduziu os recursos Início Limpo e Expiração da Sessão como um aprimoramento em relação ao MQTT v3.1.1 no processamento da persistência da sessão. O Clean Start é um recurso que permite que um cliente inicie uma nova sessão com o Agente MQTT, descartando todos os dados de sessão anteriores. A expiração da sessão permite que um cliente informe o Agente MQTT quando uma sessão inativa é considerada expirada e removida automaticamente. No pacote CONNECT, um cliente pode definir o sinalizador Início limpo como true e/ou o intervalo de expiração de sessão curto por motivos de segurança ou para evitar possíveis conflitos de dados que possam ter ocorrido durante a sessão anterior. Um cliente também pode definir um início limpo como false e/ou um intervalo de expiração de sessão longa para garantir a confiabilidade e a eficiência das sessões persistentes.

Configuração do intervalo máximo de expiração da sessão

Você pode configurar o intervalo máximo de expiração da sessão permitido para todos os seus clientes que se conectam ao namespace da Grade de Eventos. Para clientes MQTT v3.1.1, o limite configurado é aplicado como o intervalo de expiração da sessão padrão para todas as sessões persistentes. Para clientes MQTT v5, o limite configurado é aplicado como o valor máximo para a propriedade Intervalo de Expiração da Sessão no pacote CONNECT. Qualquer valor que exceder o limite será ajustado. O valor padrão dessa propriedade de namespace é de 1 hora e pode ser estendido até 8 horas. Use as seguintes etapas para configurar o intervalo máximo de expiração da sessão no portal do Azure:

  • Acesse seu namespace no portal do Azure.
  • Em Configuração, altere o valor de Intervalo máximo de expiração da sessão em horas para o limite desejado.
  • Selecione Aplicar.

Captura de tela para a configuração do intervalo máximo de expiração da sessão.

Estouro da Sessão

O Agente MQTT mantém uma fila de mensagens para cada sessão MQTT ativa que não está conectada, até que o cliente se conecte com o Agente MQTT novamente para receber as mensagens na fila. Se um cliente não se conectar para receber as mensagens QOS1 enfileiradas, a fila de sessões começará a acumular as mensagens até atingir seu limite: 100 mensagens ou 1 MB. Uma vez que a fila atinge seu limite durante a vida útil da sessão, a sessão é finalizada.

Mensagens “Last Will and Testament” (LWT) (versão prévia)

O “Last Will and Testament” (LWT, em português, “testamento vital”) notifica seus clientes MQTT com as desconexões abruptas de outros clientes MQTT. Você pode usar o LWT para garantir um fluxo previsível e confiável de comunicação entre clientes MQTT durante desconexões inesperadas, o que é valioso para cenários onde a comunicação em tempo real, a confiabilidade do sistema e as ações coordenadas são críticas. Os clientes que colaboram para executar tarefas complexas podem reagir às mensagens LWT uns dos outros ajustando seu comportamento, redistribuindo tarefas ou assumindo determinadas responsabilidades para manter o desempenho e a estabilidade do sistema. Para usar o LWT, um cliente pode especificar a mensagem, o tópico e o restante das propriedades do testamento no pacote CONNECT durante a conexão. Quando o cliente se desconecta abruptamente, o agente MQTT publica a mensagem de testamento para todos os clientes que assinaram o tópico do testamento.

Propriedades do usuário

O Agente MQTT dá suporte a propriedades do usuário em pacotes MQTT v5 PUBLISH que permitem adicionar pares chave-valor personalizados no cabeçalho da mensagem para fornecer mais contexto sobre a mensagem. Os casos de uso das propriedades de usuário são versáteis. Você pode usar esse recurso para incluir a finalidade ou a origem da mensagem para que o destinatário possa processar a mensagem sem analisar o conteúdo dela, economizando recursos de computação. Por exemplo, uma mensagem com uma propriedade de usuário indicando a finalidade como um "aviso" poderá disparar uma lógica de processamento diferente de uma com a finalidade "informativa".

Padrão de solicitação-resposta

O MQTT v5 introduziu campos no cabeçalho do pacote PUBLISH do MQTT que fornecem contexto para a mensagem de resposta no padrão de solicitação-resposta. Esses campos incluem um tópico de resposta e uma ID de correlação que o respondente pode usar na resposta sem configuração prévia. As informações de resposta permitem uma comunicação mais eficiente para o padrão de solicitação-resposta que é usado em cenários de comando e controle.

Diagrama do exemplo de padrão de solicitação-resposta.

Intervalo de expiração da mensagem:

No MQTT v5, o intervalo de expiração da mensagem permite que as mensagens tenham um tempo de vida configurável. O intervalo de expiração da mensagem é definido como o intervalo de tempo entre o tempo em que uma mensagem é publicada no Agente MQTT e a hora em que o Agente MQTT precisa descartar a mensagem não entregue. Esse recurso é útil em cenários em que as mensagens são válidas apenas por determinado período, como comandos sensíveis ao tempo, streaming de dados em tempo real ou alertas de segurança. Ao definir um intervalo de expiração de mensagem, o Agente MQTT pode remover automaticamente mensagens desatualizadas, garantindo que apenas informações relevantes estejam disponíveis para os assinantes. Se o intervalo de expiração de uma mensagem for definido como zero, isso significará que a mensagem nunca deverá expirar.

Aliases de tópico:

No MQTT v5, os aliases de tópico permitem que um cliente use um alias mais curto no lugar do nome completo do tópico na mensagem publicada. O Agente MQTT mantém um mapeamento entre o alias do tópico e o nome real do tópico. Esse recurso pode economizar a largura de banda da rede e reduzir o tamanho do cabeçalho da mensagem, especialmente para tópicos com nomes longos. Ele é útil em cenários em que o mesmo tópico é publicado repetidamente em várias mensagens, como em redes de sensores. O Agente MQTT dá suporte a até 10 aliases de tópico. Um cliente pode usar um campo Alias de Tópico no pacote PUBLISH para substituir o nome completo do tópico pelo alias correspondente.

Diagrama do exemplo de alias do tópico.

Controle de fluxo

No MQTT v5, o controle de fluxo refere-se ao mecanismo usado para gerenciar a taxa e o tamanho das mensagens que um cliente pode processar. O controle de fluxo pode ser configurado pela definição dos parâmetros Tamanho Máximo do Pacote e Tamanho Máximo do Recebimento no pacote CONNECT. O parâmetro Tamanho Máximo do Recebimento permite que o cliente limite o número de mensagens enviadas pelo agente ao número de mensagens que o cliente pode processar. O parâmetro Tamanho Máximo do Pacote define o tamanho máximo dos pacotes que o cliente pode receber. O Agente MQTT tem um limite de tamanho de mensagem de 512 KiB. Esse recurso garante a confiabilidade e a estabilidade da comunicação para dispositivos restritos com funcionalidades limitadas de velocidade de processamento ou de armazenamento.

Confirmações negativas e pacote de desconexão iniciado pelo servidor

Para MQTT v5, o Agente MQTT é capaz de enviar NACKs (confirmações negativas) e pacotes de desconexão iniciados pelo servidor que fornecem ao cliente mais informações sobre falhas para entrega ou conexão de mensagens. Esses recursos ajudam o cliente a diagnosticar o motivo de uma falha e executar as ações de mitigação apropriadas. O Agente MQTT usa os códigos de motivo definidos na Especificação do MQTT v5.

Limitações atuais

O Agente MQTT está adicionando mais recursos MQTT v5 e MQTT v3.1.1 no futuro para se alinhar mais com as especificações do MQTT. A lista a seguir detalha as diferenças atuais entre os recursos compatíveis com o Agente MQTT e as especificações do MQTT:

Limitações atuais do MQTT v5

Atualmente, o MQTT v5 é diferente da Especificação do MQTT v5 das seguintes maneiras:

  • Ainda não há suporte para assinaturas compartilhadas.
  • Ainda não há suporte para o sinalizador de retenção.
  • O intervalo de atraso ainda não tem suporte.
  • A QoS máxima é 1.
  • O Tamanho Máximo do Pacote é 512 KiB
  • A ordem das mensagens não é garantida.
  • Não há suporte para identificadores de assinatura.
  • Ainda não há suporte para identificadores de cliente atribuído.
  • O Número Máximo de Aliases de Tópico é dez. No momento, o servidor não atribui nenhum alias de tópico para as mensagens de saída. Os clientes podem atribuir e usar aliases de tópico dentro do limite definido.
  • A CONNACK não retorna a propriedade Informações de Resposta mesmo que a solicitação CONNECT contenha a propriedade Informações de Resposta da Solicitação.
  • As propriedades do usuário nos pacotes CONNECT, SUBSCRIBE, DISCONNECT, PUBACK e AUTH não são usadas pelo serviço e, portanto, não têm suporte. Se alguma dessas solicitações incluir propriedades do usuário, a solicitação irá falhar.
  • Se o servidor receber um PUBACK de um cliente com o código de resposta Sem sucesso, a conexão será encerrada.
  • O tempo máximo de keep alive é de 1.160 segundos.

Limitações atuais do MQTT v3.1.1

Atualmente, o MQTT v5 é diferente da Especificação do MQTT v3.1.1 das seguintes maneiras:

  • Ainda não há suporte para a QoS2 e o Sinalizador de Retenção. Uma solicitação de publicação com um sinalizador de retenção ou com uma QoS2 falha e fecha a conexão.
  • A ordem das mensagens não é garantida.
  • O tempo máximo de keep alive é de 1.160 segundos.

Exemplos de código:

Este repositório contém exemplos de código C#, C e Python que mostram como enviar a telemetria, enviar comandos e transmitir alertas. Os certificados criados por meio dos exemplos são adequados para teste, mas não são adequados para ambientes de produção.

Próximas etapas:

Saiba mais sobre o MQTT:

Saiba mais sobre o Agente MQTT: