PHP SDK接入示例

本文介绍使用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接入域名信息,请参见管理实例终端节点

运行结果示例

  • 成功:返回类似如下日志信息,表示AMQP客户端已接入物联网平台并成功接收消息。成功

  • 失败:返回类似如下日志信息,表示AMQP客户端连接物联网平台失败。

    您可根据日志提示,检查代码或网络环境,然后修正问题,重新运行代码。

    失败

二进制消息体说明

当您需要传输二进制数据时,由于STOMP协议为文本协议,需要使用base64编码参数,否则消息体可能会被截断。

本示例中,userName需要按以下方法添加encode=base64参数,使服务端将消息体base64编码后再推送。

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

相关文档

服务端订阅消息相关错误码,请参见消息相关错误码