すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:PHP 用 SDK を使用してクライアントを IoT Platform に接続する

最終更新日:Mar 22, 2025

このトピックでは、PHP 用 SDK を使用して Advanced Message Queuing Protocol(AMQP)クライアントを Alibaba Cloud IoT Platform に接続し、サーバー側サブスクリプション機能を使用して IoT Platform からメッセージを受信する方法について説明します。

前提条件

トピックのメッセージをサブスクライブするコンシューマーグループの ID を取得します。

SDK をダウンロードする

サンプルコードは Stomp PHP ライブラリに基づいて記述されており、Simple Text Oriented Message Protocol(STOMP)を介して Stomp PHP クライアントを IoT Platform に接続できます。 Stomp PHP クライアントをダウンロードして手順を表示するには、Stomp PHP にアクセスしてください。

Stomp SDK for PHP がサポートする PHP バージョンについては、Stomp SDK for PHP の composer.json ファイルの require パラメーターの宣言を参照してください。composer.json

5.0.0 より前の Stomp PHP バージョンでは、SDK が切断された後、SDK が IoT Platform に再接続できない場合があります。 Stomp PHP 5.0.0 以降をダウンロードすることをお勧めします。詳細については、問題 を参照してください。

PHP プロジェクトディレクトリで、次のコマンドを実行して Stomp PHP 5.0.0 の SDK をダウンロードします。

composer require stomp-php/stomp-php 5.0.0

サンプルコード

<?php
// パラメータの詳細については、「AMQP クライアントを IoT Platform に接続する」トピックを参照してください。
// AccessKey ペアをプロジェクトコードにハードコードすると、プロジェクトコードが漏洩した場合に AccessKey ペアが公開される可能性があります。この場合、アカウント内のリソースは安全ではなくなります。次のサンプルコードは、環境変数から AccessKey ペアを取得する方法の例を示しています。この例は参照用です。
require __DIR__ . '/vendor/autoload.php';
use Stomp\Client;
use Stomp\Network\Observer\Exception\HeartbeatException;
use Stomp\Network\Observer\ServerAliveObserver;
use Stomp\StatefulStomp;

$accessKey = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
$accessSecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$consumerGroupId = "${YourConsumerGroupId}"; // コンシューマーグループ ID
$clientId = "${YourClientId}"; // クライアント ID
// iotInstanceId: IoT Platform インスタンスの ID。
$iotInstanceId = "${YourIotInstanceId}"; // IoT Platform インスタンス ID
$timeStamp = round(microtime(true) * 1000);
// 署名アルゴリズム。有効な値:hmacmd5、hmacsha1、および hmacsha256。
$signMethod = "hmacsha1";
// userName パラメータの構造。詳細については、「AMQP クライアントを IoT Platform に接続する」トピックを参照してください。
// バイナリ形式でメッセージを送信する場合は、userName パラメータに encode=base64 を指定します。IoT Platform は、これらのメッセージを送信する前に、Base64 アルゴリズムを使用してこれらのメッセージをエンコードします。詳細については、このトピックの「バイナリ形式のメッセージ」セクションを参照してください。
$userName = $clientId . "|authMode=aksign"
            . ",signMethod=" . $signMethod
            . ",timestamp=" . $timeStamp
            . ",authId=" . $accessKey
            . ",iotInstanceId=" . $iotInstanceId
            . ",consumerGroupId=" . $consumerGroupId
            . "|";
$signContent = "authId=" . $accessKey . "&timestamp=" . $timeStamp;
// 署名を計算します。パスワードの構築方法の詳細については、「AMQP クライアントを IoT Platform に接続する」トピックを参照してください。
$password = base64_encode(hash_hmac("sha1", $signContent, $accessSecret, $raw_output = TRUE));
// エンドポイント。詳細については、「AMQP クライアントを IoT Platform に接続する」トピックを参照してください。
$client = new Client('ssl://${YourHost}:61614'); // エンドポイント
$sslContext = ['ssl' => ['verify_peer' => true, 'verify_peer_name' => false], ];
$client->getConnection()->setContext($sslContext);

// クライアントと IoT Platform 間の接続の状態を監視するリスナーを設定します。
$observer = new ServerAliveObserver();
$client->getConnection()->getObservers()->addObserver($observer);
// ハートビート設定。この設定により、IoT Platform は 30 秒ごとにハートビートパケットを送信できます。
$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; // 接続が存在しません。10 秒後に再接続します。
            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 クライアントを IoT Platform に接続する」をご参照ください。

重要

有効なパラメーター値を指定していることを確認してください。そうでない場合、AMQP クライアントは IoT Platform に接続できません。

パラメーター

説明

accessKey

IoT Platform コンソールにログインし、右上隅のプロフィール画像にポインターを移動して、[accesskey 管理] をクリックして、AccessKey ID と AccessKey シークレットを取得します。

説明

Resource Access Management(RAM)ユーザーを使用する場合は、AliyunIOTFullAccess ポリシーを RAM ユーザーにアタッチする必要があります。このポリシーにより、RAM ユーザーは IoT Platform リソースを管理できます。そうでない場合、IoT Platform への接続は失敗します。詳細については、「RAM ユーザーとして IoT Platform にアクセスする」をご参照ください。

accessSecret

consumerGroupId

IoT Platform インスタンスのコンシューマーグループの ID。

コンシューマーグループの ID を表示するには、次の手順を実行します。IoT Platform コンソールにログインし、管理するインスタンスのカードをクリックします。左側のナビゲーションウィンドウで、[メッセージ転送] > [サーバー側サブスクリプション] を選択します。コンシューマーグループの ID は、[コンシューマーグループ] タブに表示されます。

iotInstanceId

IoT Platform コンソール の [概要] タブでインスタンス ID を表示できます。IoT Platform コンソール

  • インスタンス ID が表示されている場合は、このパラメーターをインスタンス ID に設定する必要があります。

  • [概要] タブが表示されていない場合、または インスタンスに ID がない場合は、iotInstanceId = "" の形式でこのパラメーターを空のままにします。

clientId

クライアントの ID。カスタム ID を指定する必要があります。ID は 1 ~ 64 文字の長さである必要があります。クライアントが実行されているサーバーの UUID、MAC アドレス、IP アドレスなど、一意の識別子をクライアント ID として使用することをお勧めします。

AMQP クライアントが IoT Platform に接続して起動した後、次の手順を実行してクライアントの詳細を表示します。IoT Platform コンソールにログインし、管理する インスタンス のカードをクリックします。左側のナビゲーションウィンドウで、[メッセージ転送] > [サーバー側サブスクリプション] を選択します。 [コンシューマーグループ] タブで、管理するコンシューマーグループを見つけ、[アクション] 列の [表示] をクリックします。各クライアントの ID は、[コンシューマーグループステータス] タブに表示されます。クライアント ID を使用して、クライアントを簡単に識別できます。

client

AMQP クライアントと IoT Platform 間の接続を確立します。形式:$client = new Client('ssl://${YourHost}:61614');

${YourHost} 変数に指定できるエンドポイントの詳細については、「インスタンスのエンドポイントを管理する」をご参照ください。

サンプル結果

  • 次のような出力が表示された場合、AMQP クライアントは IoT Platform に接続されており、メッセージを受信できます。成功

  • 次のような出力が表示された場合、AMQP クライアントは IoT Platform に接続できません。

    ログに基づいてコードまたはネットワーク環境を確認し、問題を解決してから、コードを再度実行できます。

    失败

バイナリ形式のメッセージ

バイナリ形式でメッセージを送信する場合は、Base64 アルゴリズムを使用してメッセージをエンコードします。 Base64 アルゴリズムを使用してメッセージをエンコードしない場合、STOMP はテキストベースのプロトコルであるため、メッセージが切り捨てられる可能性があります。

次のコードは、userName パラメーターに encode=base64 を指定する方法を示しています。この設定により、IoT Platform はメッセージを送信する前に Base64 アルゴリズムを使用してメッセージをエンコードできます。

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

関連情報

サーバー側サブスクリプション機能に関連するエラーコードの詳細については、「IoT プラットフォームログ」トピックの メッセージに関連するエラーコード セクションをご参照ください。