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.
Gérer les groupes de consommateurs AMQP : Utilisez le groupe de consommateurs par défaut (DEFAULT_GROUP) dans IoT Platform ou créez un groupe de consommateurs.
Configurer un abonnement côté serveur AMQP : Abonnez-vous aux messages de la rubrique requise en utilisant un groupe de consommateurs.
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 + "×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()
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.
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 |
|
accessSecret |
|
|
consumerGroupId |
ID du groupe de consommateurs dans l'instance IoT Platform. Connectez-vous à la console IoT Platform. Dans l'instance correspondante, accédez à 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.
|
|
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 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 à |
|
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.