Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O MQTT (Message Queue Telemetry Transport) é um protocolo de transporte de mensagens de publicação/assinatura que foi projetado para ambientes restritos. O MQTT é eficiente, escalonável e confiável, o que o torna popular para a comunicação em cenários de IoT (Internet das Coisas). O Agente MQTT dá suporte a clientes que publicam e assinam mensagens via MQTT v3.1.1, MQTT v3.1.1 por WebSocket, MQTT v5 e MQTT v5 por WebSocket. O Agente MQTT também dá suporte à comunicação entre versões do MQTT (MQTT 3.1.1 e MQTT 5).
O agente MQTT na Grade de Eventos do Azure também dá suporte a dispositivos e serviços que enviam mensagens MQTT por HTTPS, simplificando a integração com clientes não MQTT. A Grade de Eventos permite que você envie mensagens MQTT à nuvem para análise de dados, armazenamento e visualizações, entre outros casos de uso. Esse recurso está atualmente em versão prévia.
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.
- Comunicação mais transparente para clientes 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
Seus clientes MQTT devem se conectar pelo protocolo TLS 1.2 ou TLS 1.3. As tentativas de ignorar essa etapa causam falhas de conexão.
Ao se conectar 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 por WebSocket e MQTT v5 por 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 paraClientIdem cada uma das sessões. - O campo
Usernameserá obrigatório se você não tiver selecionado um valor emalternativeAuthenticationNameSourcesdurante a criação do namespace. Nesse caso, você precisa fornecer o nome de autenticação do cliente no campoUsername. 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 simultaneamente.
Configuração do namespace
Antes de usar esse recurso, você precisa configurar o namespace para permitir várias sessões por cliente. Para configurar várias sessões por cliente no portal do Azure, siga estas etapas:
- Acesse seu namespace no portal do Azure.
- Em Configuração, altere o valor de Máximo de sessões do cliente por nome de autenticação para o número desejado de sessões por cliente.
- Escolha 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
Usernameno pacote CONNECT para indicar o nome de autenticação de cliente. - Forneça a propriedade
ClientIDno pacote CONNECT para indicar o nome da sessão, pois há um ou mais valores de ID do cliente para cada nome de usuário.
Por exemplo, as seguintes combinações de Username e ClientId 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
-
Para obter mais informações, confira Estabelecer várias sessões para um só cliente.
Processamento de 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 foi atribuída naquele momento ao cliente A, a solicitação de conexão do cliente B será rejeitada. No entanto, 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. O cliente A se conecta com uma sessão persistente 123 e, em seguida, é desconectado. O cliente A não pode se conectar com uma nova sessão 456 porque sua sessão 123 ainda está ativa, mesmo que esteja 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 agente MQTT da Grade de Eventos dá suporte aos seguintes recursos MQTT.
Qualidade de Serviço
O Agente MQTT dá suporte aos níveis 0 e 1 de QoS, que definem a garantia de entrega de mensagens em pacotes PUBLISH e SUBSCRIBE entre clientes e o Agente MQTT.
- O QoS 0 garante a entrega no máximo uma vez: o assinante não reconhece as mensagens com o QoS 0 e o editor não as retransmite.
- O QoS 1 garante uma entrega pelo menos uma vez: o assinante reconhece as mensagens e o editor as retransmite se elas 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 caso ele se desconecte para garantir a confiabilidade da comunicação. Essas informações incluem as assinaturas do cliente e as mensagens de QoS 1 perdidas ou não confirmadas. Os clientes podem configurar uma sessão persistente definindo o 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 permite que um cliente inicie uma nova sessão com o Agente MQTT, descartando qualquer dado de sessões 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 Clean Start como true. Um cliente também pode definir um 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 o sinalizador Clean Start como false ou um intervalo de expiração de sessão longa para garantir a confiabilidade e a eficiência das sessões persistentes.
Configuração máxima do intervalo de expiração da sessão
Você pode configurar o intervalo máximo de expiração da sessão permitido para todos os 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 de 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 de intervalo de expiração da sessão no pacote CONNECT. Qualquer valor que exceda o limite é ajustado. O valor padrão dessa propriedade de namespace é de uma hora e pode se estender até oito horas. Para configurar o intervalo máximo de expiração da sessão no portal do Azure, siga estas etapas:
- 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.
- Escolha Aplicar.
Estouro de sessão
O Agente MQTT mantém uma fila de mensagens para cada sessão MQTT ativa que não esteja 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 QoS 1 enfileiradas, a fila de sessão acumulará as mensagens até atingir seu limite de 100 mensagens ou 1 MB. Depois que a fila atingir seu limite durante o tempo de vida da sessão, a sessão será encerrada.
Mensagens Last Will and Testament
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. Essa funcionalidade é valiosa para cenários em que 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 Will, o tópico Will e o restante das propriedades Will no pacote CONNECT durante a conexão. Quando o cliente se desconecta inesperadamente, o agente MQTT publica a mensagem Will para todos os clientes que assinaram o tópico Will. Para reduzir o ruído de desconexões flutuantes, o cliente pode definir o intervalo de atraso como um valor maior que zero. Nesse caso, se o cliente se desconectar inesperadamente, mas restaurar a conexão antes que o intervalo de atraso expire, a mensagem Will não será publicada.
Propriedades do usuário
O Agente MQTT dá suporte a propriedades do usuário em pacotes PUBLISH do MQTT v5 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, o que economiza recursos de computação. Por exemplo, uma mensagem com uma propriedade de usuário que indica 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.
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 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 impreteríveis, 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. Essa etapa garante 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 alias de tópico. Um cliente pode usar um campo Topic Alias no pacote PUBLISH para substituir o nome completo do tópico pelo alias correspondente.
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. Para configurar o controle de fluxo, defina os parâmetros Maximum Packet Size e Receive Maximum no pacote CONNECT. O parâmetro Receive Maximum 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 Maximum Packet Size 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 o MQTT v5, o Agente MQTT é capaz de enviar pacotes de desconexão iniciados pelo servidor e confirmações negativas que fornecem ao cliente mais informações sobre falhas para conexão ou entrega 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.
Ordenação de mensagens
O MQTT v5 garante a entrega de mensagens em ordem em cada tópico e em cada cliente quando o nível 1 do QoS é usado, o que é crucial para fluxos de trabalho que exigem integridade de sequência. É ideal para cenários como telemetria, execução de comando e dados de série temporal.
No entanto, ele não garante a ordenação em diferentes tópicos ou quando as mensagens são enviadas com diferentes níveis de QoS. Para saber mais, entre em contato conosco em askmqtt@microsoft.com.
Identificadores de cliente atribuídos
O MQTT v5 apresenta suporte para identificadores de cliente atribuídos, o que permite que o Agente MQTT gere e retorne uma ID de cliente exclusiva quando o cliente não fornecer uma. O suporte do Agente MQTT para esse recurso garante a integração perfeita do cliente e reduz a necessidade de os clientes gerenciarem seus próprios identificadores. Ele é especialmente útil em cenários em que o provisionamento de cliente é dinâmico ou quando os dispositivos não têm nenhuma identidade pré-configurada. As IDs de cliente atribuídas podem ser recuperadas da resposta CONNACK e reutilizadas em sessões futuras para manter a consistência na identificação.
Gerenciar os limites de sessão e identificador de cliente no MQTT
- Identificadores de cliente atribuídos permitem que os clientes se conectem sem especificar identificadores predefinidos, habilitando sessões temporárias ou persistentes.
- Os clientes podem evitar ser bloqueados usando intervalos de expiração de sessão curtos durante a primeira conexão e salvando o identificador de cliente atribuído para uso futuro.
- Para atualizações ou redefinições de firmware, os clientes devem manter seu identificador de cliente conhecido ou usar intervalos de expiração de sessão modestos para evitar bloqueios prolongados.
- A configuração do namespace pode aumentar os limites de sessão por cliente para minimizar interrupções durante atualizações ou reversões.
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.
- O intervalo máximo de atraso será de 300.
- A QoS máxima é 1.
- O tamanho máximo do pacote é de 512 KiB.
- Não há suporte para identificadores de assinatura.
- O número máximo de alias de tópico é 10. No momento, o servidor não atribui nenhum alias de tópico para as mensagens de saída. Os clientes podem atribuir e usar alias de tópico dentro do limite definido.
- O CONNACK não retorna a propriedade
Response Informationmesmo que a solicitação CONNECT contenha a propriedadeRequest Response Information. - 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 pacote 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:
- Não há suporte para QoS 2. Uma solicitação de publicação com um sinalizador
RETAINou com um QoS2 falha e fecha a conexão. - 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.
Conteúdo relacionado
Para saber mais sobre o MQTT, consulte a Especificação MQTT v5. Para saber mais sobre o Agente MQTT, confira: