All Products
Search
Document Center

IoT Platform:Menghubungkan klien ke IoT Platform menggunakan SDK untuk Python 3

Last Updated:Jul 02, 2025

Topik ini menjelaskan cara menggunakan SDK untuk Python 3 guna menghubungkan klien Advanced Message Queuing Protocol (AMQP) ke Alibaba Cloud IoT Platform dan menerima pesan dari IoT Platform melalui fitur langganan sisi server.

Prasyarat

ID grup konsumen yang berlangganan pesan dari topik telah diperoleh.

  • Anda dapat menggunakan grup konsumen default bernama DEFAULT_GROUP atau membuat grup konsumen di konsol IoT Platform. Untuk informasi lebih lanjut, lihat Mengelola Grup Konsumen.

  • Anda dapat menggunakan grup konsumen untuk berlangganan pesan dari topik. Untuk informasi lebih lanjut, lihat Konfigurasi Langganan Sisi Server AMQP.

Lingkungan pengembangan

Gunakan Python 3.0 atau versi yang lebih baru. Dalam contoh ini, Python 3.8 digunakan.

Unduh SDK

Dalam contoh ini, pustaka stomp.py dan schedule digunakan. Untuk mengunduh pustaka dan melihat petunjuknya, kunjungi stomp.py dan schedule.

Instal pustaka stomp.py dan schedule. Untuk informasi lebih lanjut, lihat Menginstal Paket.

Kode contoh

Topik ini menyediakan kode contoh dengan menggunakan stomp.py 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):
    # Jika Anda melakukan hard-code pasangan AccessKey dalam kode proyek, pasangan AccessKey tersebut mungkin terungkap jika kode proyek bocor. Dalam hal ini, sumber daya dalam akun Anda menjadi tidak aman. Contoh kode berikut memberikan contoh tentang cara memperoleh pasangan AccessKey dari variabel lingkungan. Contoh ini hanya untuk referensi.
    accessKey = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
    accessSecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
    consumerGroupId = "${YourConsumerGroupId}"
    # iotInstanceId: ID instance IoT Platform.
    iotInstanceId = "${YourIotInstanceId}"
    clientId = "${YourClientId}"
    # Algoritma tanda tangan. Nilai valid: hmacmd5, hmacsha1, dan hmacsha256.
    signMethod = "hmacsha1"
    timestamp = current_time_millis()
    # Struktur parameter userName. Untuk informasi lebih lanjut, lihat topik "Menghubungkan klien AMQP ke IoT Platform".
    # Jika Anda perlu mentransmisikan pesan dalam format biner, tentukan encode=base64 dalam parameter userName. Sebelum IoT Platform mengirimkan pesan-pesan tersebut, IoT Platform mengkodekan pesan-pesan tersebut menggunakan algoritma Base64. Untuk informasi lebih lanjut, lihat bagian "Pesan dalam format biner" dari topik ini.
    username = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
                    + ",timestamp=" + timestamp + ",authId=" + accessKey \
                    + ",iotInstanceId=" + iotInstanceId \
                    + ",consumerGroupId=" + consumerGroupId + "|"
    signContent = "authId=" + accessKey + "&timestamp=" + timestamp
    # Hitung tanda tangan. Untuk informasi lebih lanjut tentang cara membangun kata sandi, lihat topik "Menghubungkan klien AMQP ke IoT Platform".
    password = do_sign(accessSecret.encode("utf-8"), signContent.encode("utf-8"))
    
    conn.set_listener('', MyListener(conn))
    conn.connect(username, password, wait=True)
    # Hapus tugas historis yang digunakan untuk memeriksa koneksi dan buat tugas untuk memeriksa koneksi.
    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('menerima kesalahan "%s"' % frame.body)

    def on_message(self, frame):
        print('menerima pesan "%s"' % frame.body)

    def on_heartbeat_timeout(self):
        print('on_heartbeat_timeout')

    def on_connected(self, headers):
        print("berhasil terhubung")
        conn.subscribe(destination='/topic/#', id=1, ack='auto')
        print("berhasil berlangganan")

    def on_disconnected(self):
        print('terputus')
        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. Jika koneksi gagal dibuat, metode ini akan membuat koneksi ulang.
def do_check(conn):
    print('memeriksa koneksi, is_connected: %s', conn.is_connected())
    if (not conn.is_connected()):
        try:
            connect_and_subscribe(conn)
        except Exception as e:
            print('terputus, ', e)

# Periksa status koneksi secara terjadwal.
def connection_check_timer():
    while 1:
        schedule.run_pending()
        time.sleep(10)

// Titik akhir. Untuk informasi lebih lanjut, lihat topik "Menghubungkan klien AMQP ke IoT Platform". Jangan awali titik akhir dengan 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('koneksi gagal')
    raise e
    
# Periksa status koneksi secara terjadwal dalam thread asinkron.
thread = threading.Thread(target=connection_check_timer)
thread.start()

Anda dapat mengonfigurasi parameter dalam kode sebelumnya berdasarkan deskripsi parameter dalam tabel berikut. Untuk informasi lebih lanjut tentang parameter lainnya, lihat Menghubungkan Klien AMQP ke IoT Platform.

Penting

Pastikan Anda menentukan nilai parameter yang valid. Jika tidak, klien AMQP gagal terhubung ke IoT Platform.

Parameter

Deskripsi

accessKey

Masuk ke konsol IoT Platform, arahkan penunjuk mouse ke foto profil di sudut kanan atas, lalu klik AccessKey Management untuk mendapatkan ID AccessKey dan rahasia AccessKey.

Catatan: Jika Anda menggunakan Pengguna Resource Access Management (RAM), Anda harus melampirkan kebijakan AliyunIOTFullAccess ke Pengguna RAM. Kebijakan ini memungkinkan Pengguna RAM mengelola sumber daya IoT Platform. Jika tidak, koneksi ke IoT Platform gagal. Untuk informasi lebih lanjut, lihat Akses IoT Platform sebagai Pengguna RAM.

accessSecret

consumerGroupId

ID grup konsumen dari instance IoT Platform.

Untuk melihat ID grup konsumen, lakukan langkah-langkah berikut: Masuk ke konsol IoT Platform dan klik kartu instance yang ingin Anda kelola. Di panel navigasi di sebelah kiri, pilih Message Forwarding > Server-side Subscription. ID grup konsumen ditampilkan pada tab Consumer Groups.

iotInstanceId

ID instance IoT Platform. Anda dapat melihat ID instance pada tab Ikhtisar di konsol IoT Platform.

  • Jika ID instance ditampilkan, Anda harus menyetel parameter ini ke ID instance.

  • Jika tab Ikhtisar tidak ditampilkan atau instance Anda tidak memiliki ID, biarkan parameter ini kosong dalam format iotInstanceId = "".

clientId

ID klien. Anda harus menentukan ID kustom. ID harus memiliki panjang 1 hingga 64 karakter. Kami merekomendasikan Anda menggunakan pengenal unik sebagai ID klien, seperti UUID, alamat MAC, atau alamat IP server tempat klien berjalan.

Setelah klien AMQP terhubung ke IoT Platform dan dimulai, lakukan langkah-langkah berikut untuk melihat detail klien: Masuk ke konsol IoT Platform dan klik kartu instance yang ingin Anda kelola. Di panel navigasi di sebelah kiri, pilih Message Forwarding > Server-side Subscription. Pada tab Consumer Groups, temukan grup konsumen yang ingin Anda kelola dan klik View di kolom Tindakan. ID setiap klien ditampilkan pada tab Consumer Group Status. Anda dapat menggunakan ID klien untuk mengidentifikasi klien dengan mudah.

conn

Koneksi Transport Layer Security (TLS) yang dibuat antara klien AMQP dan IoT Platform.

Untuk informasi lebih lanjut tentang titik akhir yang dapat Anda tentukan untuk variabel ${YourHost}, lihat Kelola titik akhir instance.

conn.set_ssl

Hasil contoh

  • Jika informasi serupa dengan output berikut ditampilkan, klien AMQP berhasil terhubung ke IoT Platform dan dapat menerima pesan.成功

  • Jika informasi serupa dengan output berikut ditampilkan, klien AMQP gagal terhubung ke IoT Platform.

    Periksa kode atau lingkungan jaringan berdasarkan log, selesaikan masalah, lalu jalankan kode lagi.

    失败

Pesan dalam format biner

Untuk mentransmisikan pesan dalam format biner, gunakan algoritma Base64 untuk mengkodekan pesan. Jika tidak menggunakan algoritma Base64, pesan mungkin terpotong karena STOMP adalah protokol berbasis teks.

Kode berikut menunjukkan cara menentukan encode=base64 dalam parameter userName. Pengaturan ini memungkinkan IoT Platform mengkodekan pesan menggunakan algoritma Base64 sebelum mengirimkannya.

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

Referensi

Untuk informasi lebih lanjut tentang kode kesalahan yang terkait dengan fitur langganan sisi server, lihat bagian Kode Kesalahan yang Terkait dengan Pesan dari topik "Log IoT Platform".