Hubungkan ke IoT Platform dan terima pesan langganan sisi server menggunakan PHP SDK.
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.
Unduh SDK
Kode contoh ini menggunakan pustaka Stomp PHP untuk berkomunikasi dengan IoT Platform melalui protokol STOMP. Kunjungi Stomp PHP untuk mengunduh klien dan melihat petunjuknya.
Untuk versi PHP yang kompatibel, lihat deklarasi require dalam file composer.json dari Stomp PHP SDK.
Versi Stomp PHP sebelum 5.0.0 memiliki masalah rekoneksi yang diketahui. Kami merekomendasikan versi 5.0.0 atau yang lebih baru. Untuk informasi selengkapnya, lihat Issues.
Jalankan perintah berikut di direktori proyek PHP Anda untuk menginstal Stomp PHP 5.0.0.
composer require stomp-php/stomp-php 5.0.0
Kode contoh
<?php
require __DIR__ . '/vendor/autoload.php';
use Stomp\Client;
use Stomp\Network\Observer\Exception\HeartbeatException;
use Stomp\Network\Observer\ServerAliveObserver;
use Stomp\StatefulStomp;
// Untuk detail parameter, lihat dokumentasi tentang menghubungkan client AMQP.
// PERINGATAN: Menyimpan AccessKey secara langsung dalam kode merupakan risiko keamanan. Contoh ini mengambilnya dari variabel lingkungan untuk meningkatkan keamanan.
$accessKey = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
$accessSecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$consumerGroupId = "${YourConsumerGroupId}";
$clientId = "${YourClientId}";
// iotInstanceId: ID instans IoT Platform.
$iotInstanceId = "${YourIotInstanceId}";
$timeStamp = round(microtime(true) * 1000);
// Algoritma signature. Nilai yang didukung adalah hmacmd5, hmacsha1, dan hmacsha256.
$signMethod = "hmacsha1";
// Untuk petunjuk cara menyusun username, lihat dokumentasi koneksi client AMQP.
// Untuk mengirimkan data biner, tambahkan parameter encode=base64 ke username. Server kemudian akan meng-encode isi pesan dalam Base64 sebelum mengirim pesan. Lihat bagian "Binary message body" untuk informasi selengkapnya.
$userName = $clientId . "|authMode=aksign"
. ",signMethod=" . $signMethod
. ",timestamp=" . $timeStamp
. ",authId=" . $accessKey
. ",iotInstanceId=" . $iotInstanceId
. ",consumerGroupId=" . $consumerGroupId
. "|";
$signContent = "authId=" . $accessKey . "×tamp=" . $timeStamp;
// Hitung signature. Untuk petunjuk cara menyusun password, lihat dokumentasi tentang menghubungkan client AMQP.
$password = base64_encode(hash_hmac("sha1", $signContent, $accessSecret, $raw_output = TRUE));
// Titik akhir koneksi. Untuk detailnya, lihat dokumentasi koneksi client AMQP.
$client = new Client('ssl://${YourHost}:61614');
$sslContext = ['ssl' => ['verify_peer' => true, 'verify_peer_name' => false], ];
$client->getConnection()->setContext($sslContext);
// Dengarkan heartbeat dari server.
$observer = new ServerAliveObserver();
$client->getConnection()->getObservers()->addObserver($observer);
// Konfigurasi heartbeat. Client mengharapkan paket heartbeat dari server setiap 30 detik.
$client->setHeartbeat(0, 30000);
$client->setLogin($userName, $password);
try {
$client->connect();
}
catch(StompException $e) {
echo "gagal terhubung ke server, msg:" . $e->getMessage() , PHP_EOL;
}
// Jika koneksi berhasil, eksekusi dilanjutkan.
$stomp = new StatefulStomp($client);
$stomp->subscribe('/topic/#');
echo "connect success";
while (true) {
try {
// Periksa status koneksi.
if (!$client->isConnected()) {
echo "koneksi tidak ada, akan mencoba kembali setelah 10 detik.", PHP_EOL;
sleep(10);
$client->connect();
$stomp->subscribe('/topic/#');
echo "connect success", PHP_EOL;
}
// Tambahkan logika pemrosesan pesan Anda di sini.
echo $stomp->read();
}
catch(HeartbeatException $e) {
echo 'Server gagal mengirim heartbeat dalam interval yang ditentukan.', PHP_EOL;
$stomp->getClient()->disconnect();
} catch(Exception $e) {
echo 'terjadi kesalahan saat memproses pesan: '. $e->getMessage() , PHP_EOL;
$stomp->getClient()->disconnect();
}
}
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 kursor ke gambar profil Anda di pojok kanan atas, lalu klik AccessKey Management untuk memperoleh ID AccessKey dan Rahasia AccessKey. Catatan
Jika Anda menggunakan Pengguna RAM, Anda harus memberikan izin kepada Pengguna RAM tersebut untuk mengelola IoT Platform (AliyunIOTFullAccess). Jika tidak, koneksi akan gagal. Untuk informasi selengkapnya tentang cara memberikan izin, lihat RAM User Access. |
|
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 menemukannya di halaman Overview pada Konsol IoT Platform.
|
|
clientId |
ID client. 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 client AMQP Anda berada. Setelah client AMQP terhubung dan mulai berjalan, login ke Konsol IoT Platform. Pada tab Consumer Groups di halaman untuk instans tersebut, klik View di samping kelompok konsumen. Halaman Consumer Group Details akan menampilkan parameter ini. Hal ini membantu Anda mengidentifikasi client yang berbeda. |
|
client |
Membuat koneksi antara client AMQP dan IoT Platform: Untuk informasi tentang titik akhir AMQP untuk |
Hasil contoh
-
Berhasil: Pesan log seperti berikut dikembalikan, menunjukkan bahwa klien AMQP telah terhubung ke IoT Platform dan berhasil menerima pesan.
$ php newfile.php connect successMESSAGE qos:1 destination:/xxx/thing/event/property/post message-id:xxx2096 topic:/xxx/xxx2/thing/event/property/post subscription:xxx generateTime:xxx {"deviceType":"CustomCategory","iotId":"xxx","requestId":"1614065952794","checkFailedData":{},"productKey":"xxx","gmtCreate":1614065819600,"deviceName":"xxx","items":{"Temperature":{"value":11,"time":1614065819597},"Humidity":{"value":28,"time":1614065819597}}} MESSAGE qos:1 destination:/xxx/xxx2/thing/event/property/post -
Gagal: Pesan log seperti berikut dikembalikan, menunjukkan bahwa klien AMQP gagal terhubung ke IoT Platform.
Gunakan log kesalahan untuk memeriksa kode dan pengaturan jaringan Anda. Perbaiki masalah tersebut dan jalankan kembali kode.
xxx>php newfile.php PHP Fatal error: Uncaught Stomp\Exception\ConnectionException: Failed to connect. (0: php_network_getaddresses: getaddrinfo failed: □) Fatal error: Uncaught Stomp\Exception\ConnectionException: Failed to connect. (0: php_network_getaddresses: getaddrinfo failed: □) (Host: xxx.un cs.com) in xxx\stomp-php\stomp-php\src\Network\Connection.php:417 Stack trace: #0 xxx\stomp-php\stomp-php\src\Network\Connection.php(353): Stomp\Network\Connection->connectSocket(Array) #1 xxx\stomp-php\stomp-php\src\Network\Connection.php(327): Stomp\Network\Connection->getConnection() #2 xxx\stomp-php\stomp-php\src\Client.php(207): Stomp\Network\Connection->connect() #3 xxx.php(45): Stomp\Client->connect() #4 xxx.php(56): start_consume() #5 {main} Next Stomp\Exception\ConnectionException: Could not connect to a broker (Host: xxx) in xxx\stomp -php\src\Network\Connection.php:358 Stack t in xxx\vendor\stomp-php\stomp-php\src\Network\Connection.php on line 358
Isi pesan biner
Untuk mengirimkan data biner, gunakan encoding Base64 karena STOMP adalah protokol berbasis teks. Tanpa encoding, isi pesan mungkin terpotong.
Tambahkan parameter encode=base64 ke userName seperti yang ditunjukkan di bawah. Server kemudian akan meng-encode isi pesan dalam Base64 sebelum mengirimnya.
$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.