本文介绍使用PHP SDK接入阿里云物联网平台,接收服务端订阅消息的示例。
下载SDK
本示例提供基于Stomp PHP库的Demo,使用STOMP协议和云端通信。请访问Stomp PHP下载客户端和查看使用说明。
代码示例
以下Demo中涉及的参数说明,请参见AMQP客户端接入说明。
<?php
require __DIR__ . '/vendor/autoload.php';
use Stomp\Client;
use Stomp\Network\Observer\Exception\HeartbeatException;
use Stomp\Network\Observer\ServerAliveObserver;
use Stomp\StatefulStomp;
function start_consume() {
//参数说明,请参见AMQP客户端接入说明文档。
$accessKey = "${YourAccessKeyId}";
$accessSecret = "${YourAccessKeySecret}";
$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 . "×tamp=" . $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/#');
return $stomp;
}
$stomp = start_consume();
while (true) {
if ($stomp == null || !$stomp->getClient()->isConnected()) {
echo "connection not exists, will reconnect after 30s.", PHP_EOL;
sleep(10);
$stomp = start_consume();
}
try {
//处理消息业务逻辑。
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;
}
}
您需按照如下表格中的参数说明,修改代码中的参数值。更多参数说明,请参见AMQP客户端接入说明。
参数 | 示例 | 说明 |
---|---|---|
accessKey | LTAI4GFGQvKuqHJhFa****** |
登录物联网平台控制台,将鼠标移至账号头像上,然后单击AccessKey管理,获取AccessKey ID和AccessKey Secret。 说明 如果使用RAM用户,您需授予该用户管理物联网平台的权限(AliyunIOTFullAccess),否则将连接失败。授权方法请参见授权RAM用户访问物联网平台。
|
accessSecret | iMS8ZhCDdfJbCMeA005sieKe****** | |
consumerGroupId | VWhGZ2QnP7kxWpeSSjt****** | 消费组ID。
登录物联网平台控制台,在对应实例的 查看您的消费组ID。 |
iotInstanceId | "" | 实例ID。仅企业版实例需要传入。公共实例下,传入空值,即iotInstanceId = "" 。
您可登录物联网平台控制台,找到对应的实例,单击实例,进入实例详情页面查看企业版实例ID。 |
clientId | 12345 | 表示客户端ID,建议使用您的AMQP客户端所在服务器UUID、MAC地址、IP等唯一标识。长度不可超过64个字符。
登录物联网平台控制台,在对应实例的 ,单击消费组对应的查看,消费组详情页将显示该参数,方便您识别区分不同的客户端。 |
client | new Client('ssl://233***.iot-amqp.cn-shanghai.aliyuncs.com:61614') | 创建AMQP客户端与物联网平台的连接:$client = new Client('ssl://${YourHost}:61614'); 其中 |
运行结果示例
- 成功:返回类似如下日志信息,表示AMQP客户端已接入物联网平台并成功接收消息。
- 失败:返回类似如下日志信息,表示AMQP客户端连接物联网平台失败。
二进制消息体说明
当您需要传输二进制数据时,由于STOMP协议为文本协议,需要使用base64编码参数,否则消息体可能会被截断。
本示例中,userName需要按以下方法添加encode=base64参数,使服务端将消息体base64编码后再推送。
$userName = $clientId . "|authMode=aksign"
. ",signMethod=" . $signMethod
. ",timestamp=" . $timeStamp
. ",authId=" . $accessKey
. ",iotInstanceId=" . $iotInstanceId
. ",consumerGroupId=" . $consumerGroupId
. ",encode=base64" . "|";
在文档使用中是否遇到以下问题
更多建议
匿名提交