Gunakan Python 3 SDK untuk terhubung ke Alibaba Cloud IoT Platform dan menerima pesan melalui langganan sisi server.
Prasyarat
Anda telah memperoleh ID kelompok konsumen dan berlangganan ke pesan topik yang diperlukan.
Manage AMQP consumer groups: Anda dapat menggunakan kelompok konsumen default (DEFAULT_GROUP) di IoT Platform atau membuat kelompok konsumen.
Configure an AMQP server-side subscription: Berlangganan ke pesan topik yang diperlukan menggunakan kelompok konsumen.
Persiapkan lingkungan pengembangan Anda
Anda dapat menggunakan Python 3.0 atau versi yang lebih baru. Contoh ini menggunakan Python 3.8.
Unduh SDK
Contoh ini menggunakan pustaka stomp.py dan schedule. Untuk petunjuk instalasi, lihat Installing Packages.
Kode contoh
Kode contoh berikut didasarkan pada stomp.py versi 7.0.0.
# 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):
# Untuk keamanan, jangan hardcode pasangan AccessKey Anda dalam kode.
# Contoh ini mengambil pasangan AccessKey dari variabel lingkungan sebagai referensi.
accessKey = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
accessSecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
consumerGroupId = "${YourConsumerGroupId}"
# iotInstanceId: ID instans.
iotInstanceId = "${YourIotInstanceId}"
clientId = "${YourClientId}"
# Algoritma signature. Nilai yang valid: hmacmd5, hmacsha1, dan hmacsha256.
signMethod = "hmacsha1"
timestamp = current_time_millis()
# Untuk informasi tentang cara menyusun parameter userName, lihat dokumentasi untuk menghubungkan klien AMQP.
# Jika Anda mentransmisikan data dalam format biner, Anda harus menambahkan parameter encode=base64 ke userName.
# Server kemudian akan mengencode isi pesan dalam Base64 sebelum mendorong pesan tersebut.
# Untuk informasi selengkapnya, lihat bagian "Binary format" dalam topik ini.
username = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
+ ",timestamp=" + timestamp + ",authId=" + accessKey \
+ ",iotInstanceId=" + iotInstanceId \
+ ",consumerGroupId=" + consumerGroupId + "|"
signContent = "authId=" + accessKey + "×tamp=" + timestamp
# Hitung signature. Untuk informasi tentang cara menyusun password, lihat dokumentasi untuk menghubungkan klien AMQP.
password = do_sign(accessSecret.encode("utf-8"), signContent.encode("utf-8"))
conn.set_listener('', MyListener(conn))
conn.connect(username, password, wait=True)
# Hapus tugas pengecekan koneksi sebelumnya dan buat yang baru.
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")
# Periksa koneksi dan lakukan koneksi ulang jika terputus.
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)
# Tugas terjadwal untuk memeriksa status koneksi.
def connection_check_timer():
while 1:
schedule.run_pending()
time.sleep(10)
# Titik akhir koneksi. Untuk informasi selengkapnya, lihat dokumentasi untuk menghubungkan klien AMQP.
# Masukkan titik akhir secara langsung. Jangan tambahkan awalan amqps://.
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
# Jalankan pengecekan koneksi terjadwal dalam thread asinkron.
thread = threading.Thread(target=connection_check_timer)
thread.start()
Ganti nilai placeholder dalam kode dengan nilai aktual Anda. Untuk informasi selengkapnya tentang parameter, lihat Connect an AMQP client to IoT Platform.
Tentukan nilai parameter yang valid. Jika tidak, klien AMQP gagal terhubung ke IoT Platform.
|
Parameter |
Deskripsi |
|
accessKey |
Login ke konsol IoT Platform, arahkan pointer ke gambar profil Anda di pojok kanan atas, lalu klik AccessKey Management untuk mendapatkan ID AccessKey dan Rahasia AccessKey. Catatan Jika Anda menggunakan RAM user, Anda harus memberikan izin |
|
accessSecret |
|
|
consumerGroupId |
ID kelompok konsumen dalam instans IoT Platform. Login ke konsol IoT Platform. Di instans yang sesuai, buka untuk melihat ID kelompok konsumen Anda. |
|
iotInstanceId |
ID instans. Anda dapat melihat ID instans saat ini di tab Overview di konsol IoT Platform.
|
|
clientId |
ID klien. Anda harus menentukan ID ini sendiri. Panjang ID maksimal 64 karakter. Kami menyarankan Anda menggunakan pengenal unik, seperti UUID, alamat MAC, atau alamat IP server tempat klien AMQP Anda berada. Setelah klien AMQP terhubung dan mulai berjalan, login ke konsol IoT Platform. Di halaman instans, buka tab Consumer Groups pada halaman , lalu klik View di samping kelompok konsumen. Halaman Consumer Group Details akan menampilkan parameter ini. Hal ini membantu Anda mengidentifikasi klien yang berbeda. |
|
conn |
Membuat koneksi TLS antara klien AMQP dan IoT Platform. Untuk informasi tentang titik akhir AMQP yang sesuai dengan |
|
conn.set_ssl |
Hasil contoh
-
Berhasil: Jika Anda melihat log pesan seperti berikut, klien AMQP telah terhubung ke IoT Platform dan menerima pesan.
successfully connected successfully subscribe check connection, is_connected: %s True check connection, is_connected: %s True -
Gagal: Jika Anda melihat log pesan seperti berikut, klien AMQP gagal terhubung ke IoT Platform.
Gunakan log kesalahan untuk memeriksa kode dan pengaturan jaringan Anda. Perbaiki masalah tersebut dan jalankan kembali kode.
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 biner
Untuk mentransmisikan data biner, gunakan pengkodean Base64 karena STOMP adalah protokol berbasis teks. Tanpa pengkodean, isi pesan mungkin terpotong.
Tambahkan parameter encode=base64 ke userName seperti yang ditunjukkan di bawah. Server kemudian akan mengkodekan isi pesan dalam Base64 sebelum mengirimkannya.
username = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
+ ",timestamp=" + timestamp + ",authId=" + accessKey \
+ ",iotInstanceId=" + iotInstanceId \
+ ",consumerGroupId=" + consumerGroupId \
+ ",encode=base64"+"|"
Referensi
Untuk informasi selengkapnya tentang kode kesalahan pesan langganan sisi server, lihat Message-related error codes.