Topik ini menjelaskan cara menggunakan SDK untuk Python 2.7 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 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 Kelola Grup Konsumen.
Anda dapat menggunakan grup konsumen untuk berlangganan pesan topik. Untuk informasi lebih lanjut, lihat Konfigurasikan Langganan Sisi Server AMQP.
Lingkungan pengembangan
Contoh ini menggunakan Python 2.7.
Unduh SDK
Kami merekomendasikan penggunaan pustaka Apache Qpid Proton 0.29.0. Pustaka ini merangkum API Python. Untuk mengunduh pustaka dan melihat petunjuknya, kunjungi Qpid Proton 0.29.0.
Instal Qpid Proton. Untuk informasi lebih lanjut, lihat Menginstal Qpid Proton.
Setelah menginstal Qpid Proton, jalankan perintah Python berikut untuk memeriksa apakah pustaka SSL tersedia:
import proton;print('%s' % 'SSL present' if proton.SSL.present() else 'SSL NOT AVAILABLE')Contoh kode
# encoding=utf-8
import sys
import logging
import time
from proton.handlers import MessagingHandler
from proton.reactor import Container
import hashlib
import hmac
import base64
import os
reload(sys)
sys.setdefaultencoding('utf-8')
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
console_handler = logging.StreamHandler(sys.stdout)
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())
class AmqpClient(MessagingHandler):
def __init__(self):
super(AmqpClient, self).__init__()
def on_start(self, event):
# Titik akhir. Untuk informasi lebih lanjut, lihat topik "Menghubungkan klien AMQP ke IoT Platform".
url = "amqps://${YourHost}:5671"
# 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 mendapatkan 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}"
clientId = "${YourClientId}"
# iotInstanceId: ID instance IoT Platform.
iotInstanceId = "${YourIotInstanceId}"
# 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".
userName = clientId + "|authMode=aksign" + ",signMethod=" + signMethod \
+ ",timestamp=" + timestamp + ",authId=" + accessKey \
+ ",iotInstanceId=" + iotInstanceId + ",consumerGroupId=" + consumerGroupId + "|"
signContent = "authId=" + accessKey + "×tamp=" + 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 = event.container.connect(url, user=userName, password=passWord, heartbeat=60)
self.receiver = event.container.create_receiver(conn)
# Jika koneksi berhasil dibuat, fungsi berikut dipanggil:
def on_connection_opened(self, event):
logger.info("Koneksi berhasil dibuat, remoteUrl: %s", event.connection.hostname)
# Jika koneksi ditutup, fungsi berikut dipanggil:
def on_connection_closed(self, event):
logger.info("Koneksi ditutup: %s", self)
# Jika server jarak jauh menutup koneksi karena kesalahan, fungsi berikut dipanggil:
def on_connection_error(self, event):
logger.info("Kesalahan koneksi")
# Jika terjadi kesalahan koneksi AMQP, seperti kesalahan otentikasi atau kesalahan soket, fungsi berikut dipanggil:
def on_transport_error(self, event):
if event.transport.condition:
if event.transport.condition.info:
logger.error("%s: %s: %s" % (
event.transport.condition.name, event.transport.condition.description,
event.transport.condition.info))
else:
logger.error("%s: %s" % (event.transport.condition.name, event.transport.condition.description))
else:
logging.error("Kesalahan transportasi tidak ditentukan")
# Jika pesan diterima, fungsi berikut dipanggil:
def on_message(self, event):
message = event.message
content = message.body.decode('utf-8')
topic = message.properties.get("topic")
message_id = message.properties.get("messageId")
print("menerima pesan: message_id=%s, topic=%s, content=%s" % (message_id, topic, content))
event.receiver.flow(1)
Container(AmqpClient()).run()Anda dapat mengonfigurasi parameter dalam kode sebelumnya sesuai dengan deskripsi parameter pada tabel berikut. Untuk informasi lebih lanjut tentang parameter lainnya, lihat Menghubungkan Klien AMQP ke IoT Platform.
Pastikan Anda menentukan nilai parameter yang valid. Jika tidak, klien AMQP gagal terhubung ke IoT Platform.
Parameter | Deskripsi |
url | Titik akhir yang digunakan oleh klien AMQP untuk terhubung ke IoT Platform. Format: Untuk informasi lebih lanjut tentang titik akhir yang dapat Anda tentukan untuk variabel |
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 . 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.
|
clientId | ID klien. Anda harus menentukan ID kustom. ID tersebut 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 . 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. |
Hasil sampel
Jika informasi serupa dengan output berikut ditampilkan, klien AMQP berhasil terhubung ke IoT Platform dan dapat menerima pesan.

Parameter
Contoh
Deskripsi
message_id
2**************7
ID pesan.
topic
/***********/******/thing/event/property/post
Topik yang digunakan untuk mengirimkan properti perangkat.
content
{"deviceType":"CustomCategory","iotId":"qPi***","requestId":"161***","checkFailedData":{},"productKey":"g4***","gmtCreate":1613635594038,"deviceName":"de***","items":{"Temperature":{"value":24,"time":1613635594036},"Humidity":{"value":26,"time":1613635594036}}}
Isi pesan.
Jika informasi serupa dengan output berikut ditampilkan, klien AMQP gagal terhubung ke IoT Platform.
Anda dapat memeriksa kode atau lingkungan jaringan berdasarkan log, menyelesaikan masalah, lalu menjalankan kode lagi.

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".