Tous les produits
Search
Centre de documentation

IoT Platform:Exemple : Connexion avec le SDK Python 3

Dernière mise à jour :Aug 09, 2026

Utilisez le SDK Python 3 pour vous connecter à Alibaba Cloud IoT Platform et recevoir des messages via un abonnement côté serveur.

Prérequis

Vous avez obtenu un ID de groupe de consommateurs et vous êtes abonné aux messages de la rubrique requise.

Préparer votre environnement de développement

Python 3.0 ou une version ultérieure est requis. Cet exemple utilise Python 3.8.

Télécharger le SDK

Cet exemple utilise les bibliothèques stomp.py et schedule. Pour les instructions d'installation, consultez Installing Packages.

Exemple de code

L'exemple de code suivant est basé sur la version 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()

Remplacez les valeurs d'espace réservé dans le code par vos valeurs réelles. Pour plus d'informations sur les paramètres, consultez Connecter un client AMQP à IoT Platform.

Important

Spécifiez des valeurs de paramètres valides. Sinon, le client AMQP ne parviendra pas à se connecter à IoT Platform.

Paramètre

Description

accessKey

Connectez-vous à la console IoT Platform, placez le pointeur sur votre photo de profil dans le coin supérieur droit et cliquez sur AccessKey Management pour obtenir l'ID AccessKey et le secret AccessKey.

Remarque Si vous utilisez un utilisateur RAM, vous devez accorder à cet utilisateur l'autorisation AliyunIOTFullAccess. Sinon, la connexion échouera. Pour plus d'informations sur l'attribution des autorisations, consultez Accéder à IoT Platform en tant qu'utilisateur RAM.

accessSecret

consumerGroupId

ID du groupe de consommateurs dans l'instance IoT Platform.

Connectez-vous à la console IoT Platform. Dans l'instance correspondante, accédez à Message Forwarding > Server-side Subscription > Consumer Group List pour afficher l'ID de votre groupe de consommateurs.

iotInstanceId

ID de l'instance. Vous pouvez consulter l'ID de l'instance actuelle dans l'onglet Overview de la console IoT Platform.

  • Si un ID d'instance est disponible, vous devez le spécifier dans le paramètre.

  • Si l'onglet Overview n'est pas affiché ou si aucun ID d'instance n'est disponible, définissez ce paramètre sur une chaîne vide, par exemple iotInstanceId = "".

clientId

ID client. Vous devez définir cet ID. Sa longueur maximale est de 64 caractères. Nous vous recommandons d'utiliser un identifiant unique, tel que l'UUID, l'adresse MAC ou l'adresse IP du serveur sur lequel se trouve votre client AMQP.

Une fois le client AMQP connecté et démarré, connectez-vous à la console IoT Platform. Sur l'onglet Consumer Groups de la page Message Forwarding > > > Server-side Subscription de l'instance, cliquez sur View à côté du groupe de consommateurs. La page Consumer Group Details affiche ce paramètre. Cela vous aide à identifier les différents clients.

conn

Établit une connexion TLS entre le client AMQP et IoT Platform.

Pour connaître l'endpoint AMQP correspondant à ${YourHost}, consultez Afficher et gérer les endpoints des instances.

conn.set_ssl

Résultats d'exemple

  • Succès : Si vous voyez des messages de journal similaires aux suivants, le client AMQP est connecté à IoT Platform et reçoit des messages.

    successfully connected
    successfully subscribe
    check connection, is_connected: %s True
    check connection, is_connected: %s True
  • Échec : Si vous voyez des messages de journal similaires aux suivants, le client AMQP n'a pas réussi à se connecter à IoT Platform.

    Utilisez le journal d'erreurs pour vérifier votre code et vos paramètres réseau. Résolvez le problème et exécutez à nouveau le code.

    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

Format binaire

Pour transmettre des données binaires, utilisez un paramètre d'encodage Base64, car STOMP est un protocole basé sur du texte. Sans encodage, les corps des messages peuvent être tronqués.

Ajoutez le paramètre encode=base64 à userName comme indiqué ci-dessous. Le serveur encode alors le corps du message en Base64 avant de l'envoyer.

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

Références

Pour plus d'informations sur les codes d'erreur relatifs aux messages d'abonnement côté serveur, consultez Codes d'erreur liés aux messages.