全部產品
Search
文件中心

IoT Platform:PHP SDK接入樣本

更新時間:Jun 30, 2024

本文介紹使用PHP SDK接入阿里雲物聯網平台,接收服務端訂閱訊息的樣本。

前提條件

已擷取消費組ID,並訂閱Topic訊息。

下載SDK

本樣本提供基於Stomp PHP庫的程式碼範例,使用STOMP協議和物聯網平台雲端通訊。請訪問Stomp PHP下載用戶端和查看使用說明。

Stomp PHP SDK適用的PHP版本,請參見Stomp PHP SDK中composer.jsonrequire聲明。

因Stomp PHP 5.0.0以下版本存在SDK斷開後可能無法重連問題,建議您下載Stomp PHP 5.0.0或其以上版本SDK。詳細說明,請參見Issues

您可在PHP專案檔目錄下,執行以下命令,下載Stomp PHP 5.0.0版本的SDK。

composer require stomp-php/stomp-php 5.0.0

程式碼範例

<?php
require __DIR__ . '/vendor/autoload.php';
use Stomp\Client;
use Stomp\Network\Observer\Exception\HeartbeatException;
use Stomp\Network\Observer\ServerAliveObserver;
use Stomp\StatefulStomp;

//參數說明,請參見AMQP用戶端接入說明文檔。
// 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取 AccessKey 的方式進行調用,僅供參考
$accessKey = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
$accessSecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$consumerGroupId = "${YourConsumerGroupId}";
$clientId = "${YourClientId}";
//iotInstanceId:執行個體ID。
$iotInstanceId = "${YourIotInstanceId}";
$timeStamp = round(microtime(true) * 1000);
//簽名方法:支援hmacmd5,hmacsha1和hmacsha256。
$signMethod = "hmacsha1";
//userName組裝方法,請參見AMQP用戶端接入說明文檔。
//若使用二進位傳輸,則userName需要添加encode=base64參數,服務端會將訊息體base64編碼後再推送。具體添加方法請參見下一章節“二進位訊息體說明”。
$userName = $clientId . "|authMode=aksign"
            . ",signMethod=" . $signMethod
            . ",timestamp=" . $timeStamp
            . ",authId=" . $accessKey
            . ",iotInstanceId=" . $iotInstanceId
            . ",consumerGroupId=" . $consumerGroupId
            . "|";
$signContent = "authId=" . $accessKey . "&timestamp=" . $timeStamp;
//計算簽名,password組裝方法,請參見AMQP用戶端接入說明文檔。
$password = base64_encode(hash_hmac("sha1", $signContent, $accessSecret, $raw_output = TRUE));
//接入網域名稱,請參見AMQP用戶端接入說明文檔。
$client = new Client('ssl://${YourHost}:61614');
$sslContext = ['ssl' => ['verify_peer' => true, 'verify_peer_name' => false], ];
$client->getConnection()->setContext($sslContext);

//服務端心跳監聽。
$observer = new ServerAliveObserver();
$client->getConnection()->getObservers()->addObserver($observer);
//心跳設定,需要雲端每30s發送一次心跳包。
$client->setHeartbeat(0, 30000);
$client->setLogin($userName, $password);
try {
    $client->connect();
}
catch(StompException $e) {
    echo "failed to connect to server, msg:" . $e->getMessage() , PHP_EOL;
}
//無異常時繼續執行。
$stomp = new StatefulStomp($client);
$stomp->subscribe('/topic/#');
echo "connect success";

while (true) {
    try {

        // 檢查串連狀態
        if (!$client->isConnected()) {
            echo "connection not exists, will reconnect after 10s.", PHP_EOL;
            sleep(10);
            $client->connect();
            $stomp->subscribe('/topic/#');
            echo "connect success", PHP_EOL;
        }

        //處理訊息商務邏輯。
        echo $stomp->read();
    }
    catch(HeartbeatException $e) {
        echo 'The server failed to send us heartbeats within the defined interval.', PHP_EOL;
        $stomp->getClient()->disconnect();
    } catch(Exception $e) {
        echo 'process message occurs error: '. $e->getMessage() , PHP_EOL;
        $stomp->getClient()->disconnect();
    }
}   

您需按照如下表格中的參數說明,修改代碼中的參數值。更多參數說明,請參見AMQP用戶端接入說明

重要

請確保參數值輸入正確,否則AMQP用戶端接入會失敗。

參數

說明

accessKey

登入物聯網平台控制台,將滑鼠移至帳號頭像上,然後單擊AccessKey管理,擷取AccessKey ID和AccessKey Secret。

說明

如果使用RAM使用者,您需授予該RAM使用者管理物聯網平台的許可權(AliyunIOTFullAccess),否則將串連失敗。授權方法請參見RAM使用者訪問

accessSecret

consumerGroupId

當前物聯網平台對應執行個體中的消費組ID。

登入物聯網平台控制台,在對應執行個體的訊息轉寄 > 服務端訂閱 > 消費組列表查看您的消費組ID。

iotInstanceId

執行個體ID。您可在物聯網平台控制台執行個體概覽頁面,查看當前執行個體的ID。

  • 若有ID值,必須傳入該ID值。

  • 若無執行個體概覽頁面或ID值,傳入空值,即iotInstanceId = ""

clientId

表示用戶端ID,需您自訂,長度不可超過64個字元。建議使用您的AMQP用戶端所在伺服器UUID、MAC地址、IP等唯一標識。

AMQP用戶端接入並啟動成功後,登入物聯網平台控制台,在對應執行個體的訊息轉寄 > 服務端訂閱 > 消費組列表頁簽,單擊消費組對應的查看消費組詳情頁面將顯示該參數,方便您識別區分不同的用戶端。

client

建立AMQP用戶端與物聯網平台的串連:$client = new Client('ssl://${YourHost}:61614');

${YourHost}對應的AMQP接入網域名稱資訊,請參見查看和配置執行個體終端節點資訊(Endpoint)

運行結果樣本

  • 成功:返回類似如下日誌資訊,表示AMQP用戶端已接入物聯網平台並成功接收訊息。成功

  • 失敗:返回類似如下日誌資訊,表示AMQP用戶端串連物聯網平台失敗。

    您可根據日誌提示,檢查代碼或網路環境,然後修正問題,重新運行代碼。

    失敗

二進位訊息體說明

當您需要傳輸位元據時,由於STOMP協議為文本協議,需要使用base64編碼參數,否則訊息體可能會被截斷。

本樣本中,userName需要按以下方法添加encode=base64參數,使服務端將訊息體base64編碼後再推送。

$userName = $clientId . "|authMode=aksign"
                . ",signMethod=" . $signMethod
                . ",timestamp=" . $timeStamp
                . ",authId=" . $accessKey
                . ",iotInstanceId=" . $iotInstanceId
                . ",consumerGroupId=" . $consumerGroupId
                . ",encode=base64" . "|";

相關文檔

服務端訂閱訊息相關錯誤碼,請參見訊息相關錯誤碼