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.
Manage AMQP consumer groups: Use el grupo de consumidores predeterminado (DEFAULT_GROUP) en IoT Platform o cree un nuevo grupo de consumidores.
Configure an AMQP server-side subscription: Suscríbase a los mensajes de topic obligatorios mediante un grupo de consumidores.
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 + "×tamp=" + 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.
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 |
|
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 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.
|
|
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 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 |
|
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.