Todos los productos
Search
Centro de documentos

IoT Platform:Ejemplo: conexión con el SDK de Python 3

Última actualización: Sep 03, 2026

Use el SDK de Python 3 para conectarse a Alibaba Cloud IoT Platform y recibir mensajes mediante una suscripción del lado del servidor.

Requisitos previos

Debe haber obtenido un ID de grupo de consumidores y haberse suscrito a los mensajes de topic obligatorios.

Preparación del entorno de desarrollo

Use Python 3.0 o versiones posteriores. Este ejemplo usa Python 3.8.

Descarga del SDK

Este ejemplo usa las bibliotecas stomp.py y schedule. Para consultar las instrucciones de instalación, consulte Installing Packages.

Código de ejemplo

El siguiente código de ejemplo se basa en la versión 7.0.0 de stomp.py.

# encoding=utf-8
import time
import sys
import hashlib
import hmac
import base64
import stomp
import ssl
import schedule
import threading
import os
def connect_and_subscribe(conn):
    # For security, do not hardcode your AccessKey pair in the code.
    # This example retrieves the AccessKey pair from environment variables for reference.
    accessKey = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
    accessSecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
    consumerGroupId = "${YourConsumerGroupId}"
    # iotInstanceId: The ID of the instance.
    iotInstanceId = "${YourIotInstanceId}"
    clientId = "${YourClientId}"
    # The signature algorithm. Valid values: hmacmd5, hmacsha1, and hmacsha256.
    signMethod = "hmacsha1"
    timestamp = current_time_millis()
    # For information about how to construct the userName parameter, see the documentation for connecting an AMQP client.
    # If you transmit data in a binary format, you must add the encode=base64 parameter to userName. 
    # The server then encodes the message body in Base64 before pushing the message. 
    # For more information, see the "Binary format" section in this topic.
    username = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
                    + ",timestamp=" + timestamp + ",authId=" + accessKey \
                    + ",iotInstanceId=" + iotInstanceId \
                    + ",consumerGroupId=" + consumerGroupId + "|"
    signContent = "authId=" + accessKey + "&timestamp=" + timestamp
    # Calculate the signature. For information about how to construct the password, see the documentation for connecting an AMQP client.
    password = do_sign(accessSecret.encode("utf-8"), signContent.encode("utf-8"))
    conn.set_listener('', MyListener(conn))
    conn.connect(username, password, wait=True)
    # Clear previous connection-check tasks and create a new one.
    schedule.clear('conn-check')
    schedule.every(1).seconds.do(do_check,conn).tag('conn-check')
class MyListener(stomp.ConnectionListener):
    def __init__(self, conn):
        self.conn = conn
    def on_error(self, frame):
        print('received an error "%s"' % frame.body)
    def on_message(self, frame):
        print('received a message "%s"' % frame.body)
    def on_heartbeat_timeout(self):
        print('on_heartbeat_timeout')
    def on_connected(self, headers):
        print("successfully connected")
        conn.subscribe(destination='/topic/#', id=1, ack='auto')
        print("successfully subscribe")
    def on_disconnected(self):
        print('disconnected')
        connect_and_subscribe(self.conn)
def current_time_millis():
    return str(int(round(time.time() * 1000)))
def do_sign(secret, sign_content):
    m = hmac.new(secret, sign_content, digestmod=hashlib.sha1)
    return base64.b64encode(m.digest()).decode("utf-8")
# Check the connection and reconnect if disconnected.
def do_check(conn):
    print('check connection, is_connected: %s', conn.is_connected())
    if (not conn.is_connected()):
        try:
            connect_and_subscribe(conn)
        except Exception as e:
            print('disconnected, ', e)
# A scheduled task to check the connection status.
def connection_check_timer():
    while 1:
        schedule.run_pending()
        time.sleep(10)
# The connection endpoint. For more information, see the documentation for connecting an AMQP client.
# Enter the endpoint directly. Do not add the amqps:// prefix.
conn = stomp.Connection([('${YourHost}', 61614)], heartbeats=(0,300))
conn.set_ssl(for_hosts=[('${YourHost}', 61614)], ssl_version=ssl.PROTOCOL_TLS)
try:
    connect_and_subscribe(conn)
except Exception as e:
    print('connecting failed')
    raise e
# Run the scheduled connection check in an asynchronous thread.
thread = threading.Thread(target=connection_check_timer)
thread.start()

Reemplace los valores de marcador de posición en el código con sus valores reales. Para obtener más información sobre los parámetros, consulte Connect an AMQP client to IoT Platform.

Importante

Especifique valores de parámetro válidos. De lo contrario, el cliente AMQP no podrá conectarse a IoT Platform.

Parámetro

Descripción

accessKey

Inicie sesión en la consola de IoT Platform, pase el puntero sobre su foto de perfil en la esquina superior derecha y haga clic en AccessKey Management para obtener el AccessKey ID y el AccessKey secret.

Nota Si usa un usuario RAM, debe otorgarle el permiso AliyunIOTFullAccess. De lo contrario, la conexión fallará. Para obtener más información sobre cómo otorgar permisos, consulte Access IoT Platform as a RAM user.

accessSecret

consumerGroupId

ID del grupo de consumidores en la instancia de IoT Platform.

Inicie sesión en la consola de IoT Platform. En la instancia correspondiente, vaya a Message Forwarding > Server-side Subscription > Consumer Group List para consultar su ID de grupo de consumidores.

iotInstanceId

ID de la instancia. Consulte el ID de la instancia actual en la pestaña Overview de la consola de IoT Platform.

  • Si hay un ID de instancia disponible, especifíquelo en el parámetro.

  • Si la pestaña Overview no se muestra o no hay ningún ID de instancia disponible, establezca este parámetro como una cadena vacía; por ejemplo, iotInstanceId = "".

clientId

ID del cliente. Defina este ID, el cual puede tener hasta 64 caracteres de longitud. Se recomienda usar un identificador único, como el UUID, la dirección MAC o la dirección IP del servidor donde se encuentra su cliente AMQP.

Una vez que el cliente AMQP esté conectado e iniciado, inicie sesión en la consola de IoT Platform. En la página Message Forwarding > > > Server-side Subscription de la instancia, dentro de la pestaña Consumer Groups, haga clic en View junto al grupo de consumidores. La página Consumer Group Details muestra este parámetro, lo que facilita la identificación de los distintos clientes.

conn

Establece una conexión TLS entre el cliente AMQP e IoT Platform.

Para obtener información sobre el endpoint AMQP correspondiente a ${YourHost}, consulte View and manage instance endpoints.

conn.set_ssl

Resultados de ejemplo

  • Éxito: Si observa mensajes de registro similares a los siguientes, significa que el cliente AMQP está conectado a IoT Platform y recibe mensajes correctamente.

    successfully connected
    successfully subscribe
    check connection, is_connected: %s True
    check connection, is_connected: %s True
  • Error: Si observa mensajes de registro similares a los siguientes, significa que el cliente AMQP no pudo conectarse a IoT Platform.

    Use el registro de errores para comprobar su código y la configuración de red. Resuelva el problema y vuelva a ejecutar el código.

    Could not connect to host ixxx.com, port 61614
    Traceback (most recent call last):
      File "xxx"
        self.xxx
      File "xxx"
        for r xxx
      File "xxx"
        for r xxx
    socket.gaierror: [Errno 11001] getaddrinfo failed

Formato binario

Para transmitir datos binarios, use un parámetro de codificación Base64, ya que STOMP es un protocolo basado en texto. Sin esta codificación, los cuerpos de los mensajes podrían truncarse.

Agregue el parámetro encode=base64 a userName como se muestra a continuación. El servidor codificará el cuerpo del mensaje en Base64 antes de enviarlo.

username = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
                    + ",timestamp=" + timestamp + ",authId=" + accessKey \
                    + ",iotInstanceId=" + iotInstanceId \
                    + ",consumerGroupId=" + consumerGroupId \ 
                    + ",encode=base64"+"|"

Referencias

Para obtener más información sobre los códigos de error de los mensajes de suscripción del lado del servidor, consulte Message-related error codes.