View a markdown version of this page

Mensagens diretas - AWS IoT Core

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Mensagens diretas

AWS IoT Core agora oferece suporte a mensagens diretas. Você pode enviar uma mensagem para um único dispositivo conectado pelo ID do cliente MQTT, sem exigir que o dispositivo se inscreva em um tópico.

Anteriormente, enviar uma mensagem para um dispositivo específico exigia a publicação em um tópico no qual o dispositivo estava inscrito, sem uma forma integrada de confirmar a entrega. O remetente chama a API SendDirectMessage HTTP, especificando o ID do cliente do destinatário e um tópico alvo. Quandoconfirmation=true, AWS IoT Core entrega em QoS 1 e aguarda o PUBACK do receptor antes de retornar uma resposta bem-sucedida. Isso dá a você uma confirmação de entrega de ponta a ponta. A resposta da API e o Amazon CloudWatch Logs fornecem visibilidade total do status da entrega e dos motivos da falha.

As mensagens diretas não são processadas pelas AWS IoT Regras para execução de regras, não são colocadas em fila para dispositivos off-line e não oferecem suporte a mensagens retidas.

Pré-requisitos

Tanto o remetente quanto o destinatário exigem ações políticas específicas para usar mensagens diretas. O remetente deve ter iot:SendDirectMessage permissão. O ID do cliente de destino é especificado como o recurso e a chave de iot:Topic condição (opcional) restringe quais tópicos um remetente pode enviar mensagens diretas. O destinatário deve ter iot:Receive permissão sobre o tópico de destino. O destinatário não precisa de iot:Subscribe permissão — AWS IoT Core entrega mensagens diretas sem exigir uma assinatura de tópico. Para obter mais detalhes e exemplos de políticas, consulteExemplos de políticas de mensagens diretas.

Para os mapeamentos de porta e autenticação usados por solicitações HTTP, consulte Protocolos, mapeamentos de porta e autenticação.

SendDirectMessage API

Os remetentes podem enviar mensagens diretas fazendo solicitações HTTP POST para uma URL específica do cliente:

https://IoT_data_endpoint/connections/client_id/messages?topic=topic_name&confirmation=true&timeout=10
  • IoT_data_endpointé o endpoint de dados do AWS IoT dispositivo. Veja AWS IoT dados do dispositivo e endpoints de serviço para encontrar seu endpoint.

  • client_idé um identificador exclusivo do cliente MQTT para o qual enviar a mensagem. Os IDs do cliente não devem exceder 128 caracteres e não podem começar com um cifrão ($). Os IDs do cliente MQTT devem ser codificados em URL (codificados por porcentagem) quando contêm caracteres que não são válidos em solicitações HTTP, como espaços, barras (/) e caracteres. UTF-8 Para obter mais informações, consulte limites e cotas do agente de AWS IoT Core mensagens e do protocolo.

  • topic_nameé o tópico no qual o destinatário recebe a mensagem, URL-encoded. Não deve começar com $. Não deve ser um tópico AWS IoT Core reservado. Consulte a página AWS IoT Core de cotas de serviço para ver os limites de extensão e profundidade do tópico. Para obter mais informações, consulte limites e cotas do agente de AWS IoT Core mensagens e do protocolo.

  • confirmationé um booleano. Quando definida comotrue, a API entrega a mensagem no QoS 1 e espera que o cliente MQTT envie uma confirmação de entrega (PUBACK) antes de retornar uma resposta bem-sucedida. Se a confirmação de entrega não for recebida dentro do período de tempo limite especificado, a API retornará HTTP 504.

  • timeouté um número inteiro que representa o tempo máximo, em segundos, de espera por uma confirmação de entrega (PUBACK) do cliente receptor após a entrega da mensagem. Esse parâmetro só é usado quando confirmation definido comotrue. Se confirmation forfalse, esse parâmetro será ignorado. O tempo total de resposta da API pode ser maior que esse valor devido ao processamento interno. Defina o tempo limite do cliente HTTP para um valor maior que esse parâmetro.

Códigos de status de resposta da API

A tabela a seguir lista os códigos de status HTTP retornados pela SendDirectMessage API e as ações recomendadas para cada um. Ative AWS IoT Core CloudWatch os registros para ver registros de SendDirectMessage eventos detalhados, incluindo o campo de motivo para tratamento de erros programáticos.

SendDirectMessage Códigos de status de resposta da API
Código HTTP Ação recomendada
200 OK Se a confirmação de entrega foi solicitada comconfirmation=true, isso indica que o destinatário confirmou o recebimento da mensagem. Caso contrário, isso indica que a mensagem foi enviada com sucesso.
400 solicitação inválida Isso significa que um dos parâmetros é inválido. Revise a mensagem ou CloudWatch os registros de resposta HTTP para identificar falhas e correções específicas. Verifique se o nome e o tópico Client-id estão válidos e URL-encoded corretos.
403 proibido Isso significa que a política do remetente não concede iot:SendDirectMessage sobre o cliente e o tópico alvo, ou a política do destinatário não concede iot:Receive sobre o tópico. Analise a mensagem ou CloudWatch os registros de resposta HTTP para identificar uma falha específica e atualize a política correspondente. Consulte Exemplos de políticas de mensagens diretas.
404 Not Found (404 Não encontrado) Isso significa que o ID do cliente de destino não está conectado AWS IoT Core. Examine a mensagem ou CloudWatch os registros de resposta HTTP pelo motivo específico, verifique se o receptor está conectado e tente novamente. Se a mensagem de resposta indicar “O ID do cliente de destino não está conectado, mas tem uma sessão persistente ativa”, o cliente de destino tem uma sessão persistente não expirada, mas está atualmente offline.
413 Carga útil muito grande A carga útil excede o tamanho máximo permitido. Reduza o tamanho da carga útil e tente novamente. Cotas de serviço do AWS IoT Core
429, muitas solicitações Isso significa que a conta excedeu o limite de SendDirectMessage solicitações por segundo ou a conexão do receptor excedeu o limite de publicação de saída. Revise a mensagem ou CloudWatch os registros de resposta HTTP pelo motivo específico, reduza a taxa de solicitações e implemente um recuo exponencial. Cotas de serviço do AWS IoT Core
500 Internal Server Error Isso indica um erro inesperado do lado do servidor. Repita a solicitação com um recuo exponencial. Se o problema persistir, entre em contato com o AWS Support com o TraceID da resposta.
Tempo limite do gateway 504 Isso significa que o receptor não enviou o PUBACK dentro do período de tempo limite especificado. Aumente o valor do tempo limite, verifique se o cliente MQTT do receptor envia mensagens PUBACK para QoS 1 ou verifique se o receptor está processando mensagens lentamente.

Exemplos

AWS CLI
aws iot-data send-direct-message \ --client-id myDevice \ --topic commands/reboot \ --confirmation \ --timeout 10 \ --payload '{"action": "reboot"}' \ --cli-binary-format raw-in-base64-out \ --region us-west-2 \ --endpoint-url https://IoT_data_endpoint

A --cli-binary-format opção é necessária se você estiver usando a AWS Command Line Interface versão 2. Para que essa seja a configuração padrão, execute aws configure set cli-binary-format raw-in-base64-out. Para obter mais informações, consulte A AWS CLI comporta opções de linha de comando globais no Guia do usuário da AWS Command Line Interface versão 2.

curl (X.509 client certificate, port 8443)
curl --tlsv1.2 \ --cacert Amazon-root-CA-1.pem \ --cert device.pem.crt \ --key private.pem.key \ --request POST \ --data '{"action": "reboot"}' \ "https://IoT_data_endpoint:8443/connections/myDevice/messages?topic=commands%2Freboot&confirmation=true&timeout=10"

Comportamento do cliente receptor

O Direct Messaging entrega mensagens aos clientes (destinatários) do MQTT sem exigir uma assinatura de tópico. Para se beneficiar totalmente das mensagens diretas, o destinatário deve suportar os seguintes comportamentos:

  • Receba mensagens sobre tópicos não inscritos explicitamente — A mensagem direta do destinatário pode enviar mensagens para tópicos nos quais o destinatário não se inscreveu explicitamente. No entanto, algumas implementações do cliente MQTT filtram ou descartam mensagens em tópicos não inscritos. Se seu cliente descartar essas mensagens, as mensagens diretas funcionarão apenas em tópicos nos quais o destinatário também tenha se inscrito. Para receber mensagens diretas sobre qualquer tópico, verifique se o gerenciador de mensagens do seu cliente processa as mensagens independentemente do estado da assinatura.

  • Lidar com a QoS determinada pela API — O nível de QoS da mensagem entregue é definido pelo confirmation parâmetro na solicitação de API do remetente, não pela assinatura do destinatário. Quandoconfirmation=true, a mensagem chega ao QoS 1 e o cliente do receptor deve enviar um PUBACK para confirmar a entrega. Quandoconfirmation=false, a mensagem chega ao QoS 0 sem necessidade de confirmação. Garanta que a implementação do MQTT do seu cliente manipule corretamente as mensagens recebidas de QoS 0 e QoS 1.