Todos os produtos
Search
Central de documentação

IoT Platform:Exemplo: Conexão com o SDK para Python 3

Última atualização: Jun 26, 2026

Use o SDK para Python 3 para se conectar ao Alibaba Cloud IoT Platform e receber mensagens por meio de uma assinatura do lado do servidor.

Pré-requisitos

Obtenha um ID de grupo de consumidores e assine as mensagens dos tópicos necessários.

Prepare o ambiente de desenvolvimento

Use o Python 3.0 ou superior. Este exemplo usa a versão 3.8 do Python.

Baixe o SDK

Este exemplo usa as bibliotecas stomp.py e schedule. Para obter instruções de instalação, consulte Instalando Pacotes.

Código de exemplo

O código de exemplo a seguir baseia-se na versão 7.0.0 da biblioteca 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()

Substitua os valores de espaço reservado no código pelos seus valores reais. Para mais informações sobre os parâmetros, consulte Conectar um cliente AMQP ao IoT Platform.

Importante

Especifique valores válidos para os parâmetros. Caso contrário, o cliente AMQP não conseguirá se conectar ao IoT Platform.

Parâmetro

Descrição

accessKey

Faça login no console do IoT Platform, passe o ponteiro do mouse sobre sua foto de perfil no canto superior direito e clique em AccessKey Management para obter o AccessKey ID e o AccessKey secret.

Nota Se você usar um usuário RAM, conceda a permissão AliyunIOTFullAccess a esse usuário. Caso contrário, a conexão falhará. Para mais detalhes sobre como conceder permissões, consulte Acessar o IoT Platform como um usuário RAM.

accessSecret

consumerGroupId

ID do grupo de consumidores na instância do IoT Platform.

Faça login no console do IoT Platform. Na instância correspondente, acesse Message Forwarding > Server-side Subscription > Consumer Group List para visualizar o ID do seu grupo de consumidores.

iotInstanceId

ID da instância. Visualize o ID da instância atual na aba Overview do console do IoT Platform.

  • Se houver um ID de instância disponível, especifique-o no parâmetro.

  • Se a aba Overview não estiver visível ou não houver um ID de instância disponível, defina este parâmetro como uma string vazia, por exemplo, iotInstanceId = "".

clientId

ID do cliente. Defina este ID, que pode ter até 64 caracteres. Recomendamos o uso de um identificador exclusivo, como UUID, endereço MAC ou endereço IP do servidor onde o cliente AMQP está localizado.

Após a conexão e inicialização do cliente AMQP, faça login no console do IoT Platform. Na página Message Forwarding > > > Server-side Subscription da instância, clique em View ao lado do grupo de consumidores na aba Consumer Groups. A página Consumer Group Details exibirá este parâmetro, facilitando a identificação dos diferentes clientes.

conn

Estabelece uma conexão TLS entre o cliente AMQP e o IoT Platform.

Para informações sobre o endpoint AMQP correspondente a ${YourHost}, consulte Visualizar e gerenciar endpoints de instância.

conn.set_ssl

Resultados de exemplo

  • Sucesso: Se você visualizar mensagens de log semelhantes às abaixo, o cliente AMQP está conectado ao IoT Platform e recebendo mensagens.

    successfully connected
    successfully subscribe
    check connection, is_connected: %s True
    check connection, is_connected: %s True
  • Falha: Caso apareçam mensagens de log similares às seguintes, o cliente AMQP não conseguiu se conectar ao IoT Platform.

    Analise o log de erros para verificar seu código e as configurações de rede. Corrija o problema e execute o código novamente.

    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 binário

Como o STOMP é um protocolo baseado em texto, use um parâmetro de codificação Base64 para transmitir dados binários. Sem essa codificação, os corpos das mensagens podem ser truncados.

Adicione o parâmetro encode=base64 ao userName conforme mostrado abaixo. Dessa forma, o servidor codificará o corpo da mensagem em Base64 antes de enviá-lo.

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

Referências

Para mais informações sobre códigos de erro relacionados a mensagens de assinatura do lado do servidor, consulte Códigos de erro relacionados a mensagens.