Como publicar mensagens MQTT no AWS IoT Core do meu dispositivo ao usar o Python?

8 minuto de leitura
0

Não consigo enviar nem receber mensagens MQTT (MQ Telemetry Transport) entre o AWS IoT Core e meu dispositivo ou cliente MQTT. Como publicar mensagens MQTT no AWS IoT Core?

Breve descrição

Verifique se seu item do AWS IoT está configurado corretamente e se seus certificados estão devidamente anexados. Para testar sua configuração, você pode usar o cliente MQTT do AWS IoT e o exemplo de código Python fornecido neste artigo.

Resolução

Configurar um diretório para testar a publicação do MQTT

1.    Crie um diretório de trabalho no seu ambiente de desenvolvimento. Por exemplo: iot-test-publish.

2.    Crie um subdiretório para certificados no seu novo diretório de trabalho. Por exemplo: certificates.

3.    Na linha de comando, altere o diretório para seu novo diretório de trabalho.

Instalar o pip e o SDK do AWS IoT para Python

1.    Se ainda não fez isso, instale o pacote pip para Python 3. Para obter mais informações, consulte Installation no site da Python Packaging Authority (PyPA).

2.    Instale o SDK do AWS IoT para Python v2 executando o seguinte na linha de comando:

pip install awsiotsdk

-ou-

Instale o AWS IoT Device SDK para Python (a versão anterior do SDK) executando o seguinte comando:

pip install AWSIoTPythonSDK

Para obter mais informações, consulte AWS IoT SDK para Python v2 ou AWS IoT Device SDK para Python no GitHub.

Observação: esses SDKs são recomendados para conexão com o AWS IoT Core, mas não são obrigatórios. Você também pode se conectar usando qualquer cliente MQTT de terceiros compatível.

Criar uma política do AWS IoT Core

1.    Abra o console do AWS IoT Core.

2.    No painel de navegação esquerdo, escolha Seguro.

3.    Em Seguro, escolha Políticas.

4.    Se você tiver políticas existentes do AWS IoT Core, escolha Criar para criar uma nova política.
-ou-
Se você não tiver políticas existentes, na página Você ainda não tem políticas, escolha Criar uma política.

5.    Na página Criar uma política, insira um Nome para sua política. Por exemplo: admin.

6.    Em Adicionar instruções, faça o seguinte:
Em Ação, insira iot:*.
Importante: permitir todas as ações do AWS IoT (iot:*) é útil para testes. No entanto, é uma prática recomendada aumentar a segurança de uma configuração de produção. Para exemplos de políticas mais seguras, consulte Exemplos de políticas do AWS IoT.
Em ARN de recursos, insira *.
Em Efeito, marque a caixa de seleção Permitir.

7.    Escolha Criar.

Para obter mais informações, consulte Criar uma política do AWS IoT Core e Políticas do AWS IoT Core.

Criar uma coisa do AWS IoT

Observação: não é necessário criar uma coisa para se conectar ao AWS IoT. No entanto, coisas permitem que você use controles de segurança adicionais e outros recursos do AWS IoT, como Indexação de frotas, Trabalhos ou Sombra do dispositivo.

1.    No console do AWS IoT Core, no painel de navegação esquerdo, escolha Gerenciar.

2.    Se você tiver coisas existentes, escolha Criar para criar uma coisa nova.
-ou-
Se você não tiver coisas, na página Você ainda não tem coisas, escolha Registrar uma coisa.

3.    Na página Criar coisas do AWS IoT, selecione Criar uma única coisa.

4.    Na página Adicionar seu dispositivo ao registro de coisas, faça o seguinte:
Insira um Nome para sua regra. Por exemplo: Teste-Coisa.
(Opcional) Em Adicionar um tipo a essa coisa, escolha ou crie um tipo de coisa.
(Opcional) Em Adicionar essa coisa a um grupo, escolha ou crie um grupo. Para obter mais informações sobre grupos, consulte Grupos de coisas estáticos e Grupos de coisas dinâmicos.
(Opcional) Em Definir atributos pesquisáveis da coisa (opcional), adicione atributos como pares de chave/valor.
Selecione Avançar.

5.    Na página Adicionar um certificado à sua coisa, escolha Criar certificado. Você vê notificações confirmando que sua coisa e um certificado para sua coisa foram criados.

6.    Na página Certificado criado, faça o seguinte:
Em Para conectar um dispositivo, você precisa fazer download do seguinte, escolha Fazer download para o certificado, a chave pública e a chave privada.
Salve cada um dos arquivos baixados no subdiretório de certificados que você criou anteriormente.
Em Você também precisa fazer download de uma CA raiz para o AWS IoT, escolha Fazer download. A página Autenticação do servidor é aberta em Certificados de CA para autenticação do servidor.

7.    Em Endpoints de serviços de confiança da Amazon (preferencial), escolha Amazon Root CA 1. O certificado é aberto no navegador.

8.    Copie o certificado (desde -----BEGIN CERTIFICATE----- até -----END CERTIFICATE-----) e cole-o em um editor de texto.

9.    Salve o certificado como um arquivo .pem denominado root.pem no subdiretório de certificados.

10.    Na página Certificado criado do console do AWS IoT Core, escolha Ativar. O botão muda para Desativar.

11.    Escolha Anexar uma política.

12.    Na página Adicionar uma política à sua coisa, faça o seguinte:
Selecione a política do AWS IoT Core que você criou anteriormente. Por exemplo: admin.
Escolha Registrar coisa.

Para obter mais informações, consulte Criar um objeto de coisa.

Copiar o URL do endpoint do AWS IoT Core

1.    No console do AWS IoT Core, no painel de navegação esquerdo, escolha Configurações.

2.    Na página Configurações, em Endpoint personalizado, copie o Endpoint. Esse URL de endpoint personalizado do AWS IoT Core é pessoal para sua conta e região da AWS.

Criar um arquivo de programa Python

Salve um dos exemplos de código Python a seguir como um arquivo de programa Python denominado publish.py.

Se você instalou o AWS IoT SDK para Python v2 anteriormente, use o seguinte código de exemplo:

Importante: substitua customEndpointUrl pela seu URL de endpoint personalizado do AWS IoT Core. Substitua certificates pelo nome do seu subdiretório de certificados. Substitua a1b23cd45e-certificate.pem.crt pelo nome do seu cliente .crt. Substitua a1b23cd45e-private.pem.key pelo nome da sua chave privada.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

from awscrt import io, mqtt, auth, http
from awsiot import mqtt_connection_builder
import time as t
import json

# Define ENDPOINT, CLIENT_ID, PATH_TO_CERTIFICATE, PATH_TO_PRIVATE_KEY, PATH_TO_AMAZON_ROOT_CA_1, MESSAGE, TOPIC, and RANGE
ENDPOINT = "customEndpointUrl"
CLIENT_ID = "testDevice"
PATH_TO_CERTIFICATE = "certificates/a1b23cd45e-certificate.pem.crt"
PATH_TO_PRIVATE_KEY = "certificates/a1b23cd45e-private.pem.key"
PATH_TO_AMAZON_ROOT_CA_1 = "certificates/root.pem"
MESSAGE = "Hello World"
TOPIC = "test/testing"
RANGE = 20

# Spin up resources
event_loop_group = io.EventLoopGroup(1)
host_resolver = io.DefaultHostResolver(event_loop_group)
client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)
mqtt_connection = mqtt_connection_builder.mtls_from_path(
            endpoint=ENDPOINT,
            cert_filepath=PATH_TO_CERTIFICATE,
            pri_key_filepath=PATH_TO_PRIVATE_KEY,
            client_bootstrap=client_bootstrap,
            ca_filepath=PATH_TO_AMAZON_ROOT_CA_1,
            client_id=CLIENT_ID,
            clean_session=False,
            keep_alive_secs=6
            )
print("Connecting to {} with client ID '{}'...".format(
        ENDPOINT, CLIENT_ID))
# Make the connect() call
connect_future = mqtt_connection.connect()
# Future.result() waits until a result is available
connect_future.result()
print("Connected!")
# Publish message to server desired number of times.
print('Begin Publish')
for i in range (RANGE):
    data = "{} [{}]".format(MESSAGE, i+1)
    message = {"message" : data}
    mqtt_connection.publish(topic=TOPIC, payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
    print("Published: '" + json.dumps(message) + "' to the topic: " + "'test/testing'")
    t.sleep(0.1)
print('Publish End')
disconnect_future = mqtt_connection.disconnect()
disconnect_future.result()

-ou-

Se você instalou o AWS IoT Device SDK para Python (a versão anterior do SDK), use o seguinte código de exemplo:

Importante: substitua customEndpointUrl pela seu URL de endpoint personalizado do AWS IoT Core. Substitua certificates pelo nome do seu subdiretório de certificados. Substitua a1b23cd45e-certificate.pem.crt pelo nome do seu cliente .crt. Substitua a1b23cd45e-private.pem.key pelo nome da sua chave privada.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import time as t
import json
import AWSIoTPythonSDK.MQTTLib as AWSIoTPyMQTT

# Define ENDPOINT, CLIENT_ID, PATH_TO_CERTIFICATE, PATH_TO_PRIVATE_KEY, PATH_TO_AMAZON_ROOT_CA_1, MESSAGE, TOPIC, and RANGE
ENDPOINT = "customEndpointUrl"
CLIENT_ID = "testDevice"
PATH_TO_CERTIFICATE = "certificates/a1b23cd45e-certificate.pem.crt"
PATH_TO_PRIVATE_KEY = "certificates/a1b23cd45e-private.pem.key"
PATH_TO_AMAZON_ROOT_CA_1 = "certificates/root.pem"
MESSAGE = "Hello World"
TOPIC = "test/testing"
RANGE = 20

myAWSIoTMQTTClient = AWSIoTPyMQTT.AWSIoTMQTTClient(CLIENT_ID)
myAWSIoTMQTTClient.configureEndpoint(ENDPOINT, 8883)
myAWSIoTMQTTClient.configureCredentials(PATH_TO_AMAZON_ROOT_CA_1, PATH_TO_PRIVATE_KEY, PATH_TO_CERTIFICATE)

myAWSIoTMQTTClient.connect()
print('Begin Publish')
for i in range (RANGE):
    data = "{} [{}]".format(MESSAGE, i+1)
    message = {"message" : data}
    myAWSIoTMQTTClient.publish(TOPIC, json.dumps(message), 1)
    print("Published: '" + json.dumps(message) + "' to the topic: " + "'test/testing'")
    t.sleep(0.1)
print('Publish End')
myAWSIoTMQTTClient.disconnect()

Testar a configuração

1.    No console do AWS IoT Core, no painel de navegação à esquerda, selecione Testar.

2.    Na página Cliente MQTT, em Tópico de assinatura, insira teste/testar.

3.    Escolha Assinar um tópico. Um tópico de teste chamado test/testing está pronto para publicação da mensagem de teste. Para obter mais informações, consulte View device MQTT messages with the AWS IoT MQTT client.

4.    Execute o seguinte na linha de comando:

python3 publish.py

O programa Python publica 20 mensagens de teste no tópico test/testing que você criou no console do AWS IoT Core. Visualize o tópico no console para ver as mensagens publicadas.

Dica: você também pode testar outros recursos dos SDKs, como assinatura e conexão via WebSockets, usando os exemplos pubsub incluídos. Para obter mais informações, consulte pubsub (AWS IoT SDK para Python v2) ou BasicPubSub (AWS IoT Device SDK para Python) no GitHub.

(Opcional) Ative o registro em log do AWS IoT no Amazon CloudWatch

Você pode monitorar logs de eventos para mensagens MQTT que você publica no AWS IoT Core. Para obter instruções de configuração, consulte Configurar registro em log do AWS IoT e Monitorar o AWS IoT usando o CloudWatch Logs.


Informações relacionadas

Conceitos básicos do AWS IoT Core

Provisionamento de dispositivos

Perguntas frequentes (site do protocolo de mensagens MQTT)

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos