¿Cómo puedo publicar mensajes de MQTT en AWS IoT Core desde mi dispositivo cuando uso Python?

8 minutos de lectura
0

No puedo enviar ni recibir mensajes de MQTT (MQ Telemetry Transport) entre AWS IoT Core y mi dispositivo o cliente MQTT. ¿Cómo puedo publicar mensajes de MQTT en AWS IoT Core?

Breve descripción

Compruebe que su objeto de AWS IoT esté bien configurado y que sus certificados se hayan asociado correctamente. Para probar la configuración, puede usar el cliente MQTT de AWS IoT y el código Python de ejemplo que se proporciona en este artículo.

Solución

Configuración de un directorio para probar la publicación en MQTT

1.    Cree un directorio de trabajo en su entorno de desarrollo. Por ejemplo: iot-test-publish.

2.    Cree un subdirectorio para los certificados en su nuevo directorio de trabajo. Por ejemplo: certificates.

3.    En la línea de comandos, cambie el directorio por el nuevo directorio de trabajo.

Instalación de pip y AWS IoT SDK para Python

1.    Si aún no lo ha hecho, instale pip para el empaquetado de Python 3. Para obtener más información, consulte Installation en el sitio web de Python Packaging Authority (PyPA).

2.    En la línea de comandos, ejecute lo siguiente para instalar AWS IoT SDK para Python v2:

pip install awsiotsdk

\Alternativa:

Ejecute el siguiente comando para instalar el SDK para dispositivos de AWS IoT para Python (la versión anterior del SDK):

pip install AWSIoTPythonSDK

Para obtener más información, consulte AWS IoT SDK for Python v2 o AWS IoT Device SDK for Python en GitHub.

Nota: Se recomienda utilizar estos SDK para conectarse a AWS IoT Core, pero no son imprescindibles. También puede conectarse mediante cualquier cliente MQTT de terceros compatible.

Creación de una política de AWS IoT Core

1.    Abra la consola de AWS IoT Core.

2.    En el panel de navegación de la izquierda, seleccione Seguridad.

3.    En Seguridad, seleccione Políticas.

4.    Si ya tiene políticas de AWS IoT Core, seleccione Crear para crear una nueva política.
\Alternativa:
Si no tiene ninguna política, en la página Aún no tiene ninguna política, seleccione Crear una política.

5.    En la página Crear una política, introduzca un Nombre para su política. Por ejemplo: admin.

6.    En Agregar instrucciones, haga lo siguiente:
En Acción, introduzca iot:*.
Importante: Permitir todas las acciones de AWS IoT (iot:*) resulta útil para realizar pruebas. Sin embargo, se recomienda aumentar la seguridad en el caso de una configuración de producción. Para ver más ejemplos de políticas de seguridad, consulte Example AWS IoT policies.
En ARN de recurso, introduzca *.
En Efecto, marque la casilla Permitir.

7.    Seleccione Crear.

Para obtener más información, consulte Create an AWS IoT Core policy y AWS IoT Core policies.

Creación de un objeto de AWS IoT

Nota: No necesita crear ningún objeto para conectarse a AWS IoT. Sin embargo, los objetos le permiten usar controles de seguridad adicionales y otras características de AWS IoT, como Indexación de flotas, Trabajos o Sombra de dispositivo.

1.    En la consola de AWS IoT Core, en el panel de navegación de la izquierda, seleccione Administrar.

2.    Si ya tiene objetos, seleccione Crear para crear otro nuevo.
\Alternativa:
Si no tiene ningún objeto, en la página Aún no tiene ningún objeto seleccione Registrar un objeto.

3.    En la página Creación de objetos de AWS IoT, seleccione Crear un solo objeto.

4.    En la página Añadir su dispositivo al registro de objetos, haga lo siguiente:
Introduzca un Nombre para el objeto. Por ejemplo: Test-Thing.
(Opcional) En Agregar un tipo a este objeto, seleccione o cree un tipo de objeto.
(Opcional) En Añadir este objeto a un grupo, seleccione o cree un grupo. Para obtener más información sobre los grupos, consulte Static thing groups y Dynamic thing groups.
(Opcional) En Definir atributos de objeto con búsqueda permitida (opcional), agregue atributos como pares clave-valor.
Seleccione Siguiente.

5.    En la página Añadir un certificado para el objeto, seleccione Crear certificado. Verá notificaciones que confirman que se ha creado su objeto y un certificado para el mismo.

6.    En la página El certificado se ha creado, haga lo siguiente:
En Para conectar un dispositivo, debe descargar lo siguiente, seleccione Descargar para el certificado, la clave pública y la clave privada.
Guarde cada uno de los archivos descargados en el subdirectorio de certificados que creó anteriormente.
En También necesita descargar una CA raíz para AWS IoT, seleccione Descargar. Se abre la página Autenticación del servidor con los certificados de CA para la autenticación del servidor.

7.    En Puntos de enlace de servicios de confianza de Amazon (preferido), seleccione Amazon Root CA 1. El certificado se abre en su navegador.

8.    Copie el certificado (todo desde -----BEGIN CERTIFICATE----- hasta -----END CERTIFICATE-----) y péguelo en un editor de texto.

9.    Guarde el certificado como un archivo.pem denominado root.pem en el subdirectorio de certificados.

10.    En la página El certificado se ha creado en la consola de AWS IoT Core, seleccione Activar. El botón cambia a Desactivar.

11.    Seleccione Asociar una política.

12.    En la página Añadir una política para el objeto, haga lo siguiente:
Seleccione la política de AWS IoT Core que creó anteriormente. Por ejemplo: admin.
Seleccione Registrar objeto.

Para obtener más información, consulte Create a thing object.

Copia de la URL del punto de enlace de AWS IoT Core

1.    En la consola de AWS IoT Core, en el panel de navegación de la izquierda, seleccione Configuración.

2.    En la página Configuración, en Punto de enlace personalizado, copie el Punto de enlace. Esta URL de punto de enlace personalizado de AWS IoT Core es personal para su cuenta y región de AWS.

Creación de un archivo de programa de Python

Guarde uno de los siguientes ejemplos de código de Python como un archivo de programa de Python denominado publish.py.

Si instaló anteriormente AWS IoT SDK para Python v2, utilice el siguiente código de ejemplo:

Importante: Sustituya customEndpointUrl por la URL del punto de enlace personalizado de AWS IoT Core. Sustituya certificates por el nombre de su subdirectorio de certificados. Sustituya a1b23cd45e-certificate.pem.crt por el nombre de su cliente .crt. Sustituya a1b23cd45e-private.pem.key por el nombre de su clave 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()

\Alternativa:

Utilice el siguiente código de ejemplo si instaló el SDK para dispositivos de AWS IoT para Python (la versión anterior del SDK):

Importante: Sustituya customEndpointUrl por la URL del punto de enlace personalizado de AWS IoT Core. Sustituya certificates por el nombre de su subdirectorio de certificados. Sustituya a1b23cd45e-certificate.pem.crt por el nombre de su cliente .crt. Sustituya a1b23cd45e-private.pem.key por el nombre de su clave 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()

Prueba de la configuración

1.    En la consola de AWS IoT Core, en el panel de navegación de la izquierda, seleccione Probar.

2.    En la página Cliente MQTT, en Tema de suscripción, introduzca test/testing.

3.    Seleccione Suscribirse al tema. Un tema de prueba denominado test/testing está listo para la publicación del mensaje de prueba. Para obtener más información, consulte View device MQTT messages with the AWS IoT MQTT client.

4.    Ejecute lo siguiente desde la línea de comandos:

python3 publish.py

El programa Python publica 20 mensajes de prueba en el tema test/testing que creó en la consola de AWS IoT Core. Consulte el tema en la consola para ver los mensajes publicados.

Consejo: También puede probar otras características de los SDK, como la suscripción y la conexión a través de WebSockets, con los ejemplos de pubsub incluidos. Para obtener más información, consulte pubsub (AWS IoT SDK para Python v2) o BasicPubSub (SDK para dispositivos de AWS IoT para Python) en GitHub.

(Opcional) Activación del registro de AWS IoT en Amazon CloudWatch

Puede monitorear los registros de eventos para ver los mensajes de MQTT que publique en AWS IoT Core. Consulte las instrucciones de configuración en Configure AWS IoT logging y Monitor AWS IoT using CloudWatch Logs.


Información relacionada

Getting started with AWS IoT Core

Device provisioning

FAQ (sitio web del protocolo de mensajería MQTT)

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años