¿Cómo puedo usar Python para publicar mensajes de MQTT en AWS IoT Core desde mi dispositivo?
No puedo enviar ni recibir mensajes de MQTT (Message Queuing Telemetry Transport) entre AWS IoT Core y mi dispositivo o cliente MQTT.
Descripción breve
Comprueba que el objeto de AWS IoT esté bien configurado y que sus certificados se hayan asociado correctamente. Para probar la configuración, puedes 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
- Crea un directorio de trabajo en el entorno de desarrollo. Por ejemplo, crea un directorio llamado iot-test-publish.
- Crea un subdirectorio para los certificados en el nuevo directorio de trabajo. Por ejemplo, crea un subdirectorio denominado certificates.
- En la línea de comandos, cambia el directorio por el nuevo directorio de trabajo.
Instalación de pip y AWS IoT SDK para Python
Nota: Antes de empezar, instala pip para el empaquetado de Python 3. Para obtener más información, consulta Installation (Instalación) en el sitio web de Python Packaging Authority (PyPA).
-
Para instalar el AWS IoT SDK para Python v2, utiliza el siguiente comando:
pip install awsiotsdkO bien:
Usa el siguiente comando para instalar el SDK para dispositivos de AWS IoT para Python (la versión anterior del SDK, v1):
pip install AWSIoTPythonSDK
Nota: Se recomienda utilizar la actualización más reciente para la versión de AWS IoT SDK para Python. Para obtener más información, consulta AWS IoT SDK for Python v2 (AWS IoT SDK para Python v2) o AWS IoT Device SDK for Python (SDK para dispositivos de AWS IoT para Python) en GitHub. También se recomienda usar estos SDK para conectarse a AWS IoT Core, pero estos SDK no son obligatorios; puedes usar cualquier otro cliente MQTT de terceros que cumpla con los requisitos para conectarse a AWS IoT Core.
Creación de una política de AWS IoT Core
- Abre la consola de AWS IoT Core.
- En el panel de navegación de la izquierda, selecciona Seguridad.
- En Seguridad, selecciona Políticas.
- Si ya tienes políticas de AWS IoT Core, selecciona Crear para crear una nueva política.
Alternativa:
Si no tienes ninguna política, en la página You don't have any policies yet page (Aún no tiene ninguna política), selecciona Create a policy (Crear una política). - En la página Create a policy (Crear una política), introduce un Nombre para la política. Por ejemplo, introduce el nombre admin.
- En Añadir declaraciones, sigue estos pasos:
En Acción, introduce iot:*.
Importante: Puedes permitir todas las acciones de AWS IoT (iot:*) con fines de prueba. Sin embargo, en una configuración de producción, se recomienda aumentar la seguridad. Para obtener más ejemplos de políticas de seguridad, consulta AWS IoT Core policy examples (Ejemplos de políticas de AWS IoT Core).
En ARN de recurso, introduce *.
En Efecto, marca la casilla Permitir. - Selecciona Crear.
Para obtener más información, consulta Crear una política de AWS IoT Core y Políticas de AWS IoT Core.
Creación de un objeto de AWS IoT
Nota: No tienes que crear ningún objeto para conectarte a AWS IoT. Sin embargo, los objetos te permiten usar controles de seguridad adicionales y otras características de AWS IoT, como Indexación de flotas, Trabajos o Sombra de dispositivo.
- En la consola de AWS IoT Core, en el panel de navegación de la izquierda, selecciona Administrar.
- Si ya tienes objetos, selecciona Crear para crear otro nuevo.
Alternativa:
Si no tienes ningún objeto, en la página You don't have any things yet (Aún no tienes ningún objeto) selecciona Register a thing (Registrar un objeto). - En la página Creación de objetos de AWS IoT, selecciona Crear un solo objeto.
- En la página Añadir su dispositivo al registro de objetos, sigue estos pasos:
Introduce un Nombre para el objeto. Por ejemplo, escribe Test-Thing.
(Opcional) En Add a type to this thing (Añadir un tipo a este objeto), selecciona o crea un tipo de objeto.
(Opcional) En Añadir este objeto a un grupo, selecciona o crea un grupo. Para obtener más información sobre los grupos, consulta Grupos de objetos estáticos y Grupos de objetos dinámicos.
(Opcional) En Definir atributos de objeto con búsqueda permitida (opcional), añade atributos como pares clave-valor.
Selecciona Siguiente.
Nota: Se recomienda hacer coincidir el nombre del objeto con el valor de “clientId”. Si los nombres coinciden, puedes usar las características principales de AWS IoT, como Indexación de flotas y Variables de políticas de objetos. - En la página Añadir un certificado para el objeto, selecciona Crear certificado. Verás notificaciones que confirman que se ha creado el objeto y un certificado para este.
- En la página Certificado creado, sigue estos pasos:
En In order to connect a device, you need to download the following (Para conectar un dispositivo, debes descargar lo siguiente), selecciona Download (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 You also need to download a root CA for AWS IoT (También tienes que descargar una CA raíz para AWS IoT), selecciona Download (Descargar). Se abre la página Autenticación del servidor con los certificados de CA para la autenticación del servidor. - En Amazon Trust Services Endpoints (preferred) (Puntos de enlace de servicios de confianza de Amazon [preferido]), selecciona Amazon Root CA 1 (CA raíz de Amazon 1). El certificado se abre en el navegador.
- Copia el certificado (todo desde -----BEGIN CERTIFICATE----- hasta -----END CERTIFICATE-----) y pégalo en un editor de texto.
- Guarda el certificado como un archivo .pem denominado root.pem en el subdirectorio de certificados.
- En la página El certificado se ha creado en la consola de AWS IoT Core, selecciona Activar. El botón cambia a Desactivar.
- Selecciona Asociar una política.
- En la página Añadir una política para el objeto, sigue estos pasos:
Selecciona la política de AWS IoT Core que creaste anteriormente. Por ejemplo, selecciona admin.
Selecciona Registrar objeto.
Para obtener más información, consulta Crear un objeto.
Copia de la URL del punto de enlace de AWS IoT Core
- En la consola de AWS IoT Core, en el panel de navegación de la izquierda, selecciona Configuración.
- En la página Configuración, en Punto de enlace personalizado, copia el Punto de enlace. Esta URL de punto de enlace personalizado de AWS IoT Core es única para tu cuenta y región de AWS.
Creación de un archivo de programa de Python
Guarda uno de los siguientes ejemplos de código de Python como un archivo de programa de Python denominado publish.py.
Para el AWS IoT SDK para Python v2, utiliza el siguiente código de ejemplo:
Importante: Sustituye customEndpointUrl por la URL del punto de enlace personalizado de AWS IoT Core. Sustituye certificates por el nombre del subdirectorio de certificados. Sustituye a1b23cd45e-certificate.pem.crt por el nombre del cliente .crt. Sustituye a1b23cd45e-private.pem.key por el nombre de la 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()
O bien:
Para el SDK para dispositivos de AWS IoT para Python v1, utiliza el siguiente código de ejemplo:
Importante: Sustituye customEndpointUrl por la URL del punto de enlace personalizado de AWS IoT Core. Sustituye certificates por el nombre del subdirectorio de certificados. Sustituye a1b23cd45e-certificate.pem.crt por el nombre del cliente .crt. Sustituye a1b23cd45e-private.pem.key por el nombre de la 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()
Nota: Las versiones anteriores del SDK para dispositivos de AWS IoT para Python no son compatibles con Python 3.12 o versiones posteriores. Asegúrate de usar la versión más reciente del SDK para dispositivos de AWS IoT para Python.
Prueba de la configuración
- En la consola de AWS IoT Core, en el panel de navegación de la izquierda, selecciona Probar.
- En la página Cliente MQTT, en Tema de suscripción, introduce test/testing.
- Selecciona 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, consulta Vea los mensajes MQTT con el cliente AWS IoT MQTT.
- Ejecuta el siguiente comando desde la línea de comandos:
python3 publish.py
El programa Python publica 20 mensajes de prueba en el tema test/testing que creaste en la consola de AWS IoT Core. Consulta el tema en la consola para ver los mensajes publicados.
Consejo: También puedes usar los ejemplos de pubsub incluidos para probar otras características de los SDK, como las suscripciones y conexiones de WebSockets. Para obtener más información, consulta pubsub (AWS IoT SDK para Python v2) o BasicPubSub (SDK para dispositivos de AWS IoT para Python) en el sitio web de GitHub.
(Opcional) Activación del registro de AWS IoT en Amazon CloudWatch
Puedes supervisar los registros de eventos para ver los mensajes de MQTT que publiques en AWS IoT Core. Consulta las instrucciones de configuración en Configure el AWS IoT registro y Supervise AWS IoT mediante registros CloudWatch.
Información relacionada
Cómo empezar con AWS IoT Core los tutoriales
Aprovisionamiento de dispositivos
Preguntas frecuentes (sitio web del protocolo de mensajes MQTT)
- Etiquetas
- AWS IoT Core
- Idioma
- Español

Contenido relevante
preguntada hace 9 meses
preguntada hace 8 meses
preguntada hace 8 meses
OFICIAL DE AWSActualizada hace 2 años
OFICIAL DE AWSActualizada hace 3 años