All Products
Search
Document Center

IoT Platform:Contoh: Koneksi Python 3 SDK

Last Updated:Jun 17, 2026

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.

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 + "&timestamp=" + 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.

Penting

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 AliyunIOTFullAccess kepada pengguna tersebut. Jika tidak, koneksi akan gagal. Untuk informasi selengkapnya tentang cara memberikan izin, lihat Access IoT Platform as a RAM user.

accessSecret

consumerGroupId

ID kelompok konsumen dalam instans IoT Platform.

Login ke konsol IoT Platform. Di instans yang sesuai, buka Message Forwarding > Server-side Subscription > Consumer Group List untuk melihat ID kelompok konsumen Anda.

iotInstanceId

ID instans. Anda dapat melihat ID instans saat ini di tab Overview di konsol IoT Platform.

  • Jika ID instans tersedia, Anda harus menentukannya dalam parameter.

  • Jika tab Overview tidak ditampilkan atau tidak ada ID instans yang tersedia, atur parameter ini menjadi string kosong, misalnya, iotInstanceId = "".

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 Message Forwarding > > > Server-side Subscription, 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 ${YourHost}, lihat View and manage instance endpoints.

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.