Conecte-se ao IoT Platform e receba mensagens de assinatura do lado do servidor usando o SDK para PHP.
Pré-requisitos
Obtenha um ID de grupo de consumidores e assine as mensagens dos tópicos necessários.
Gerenciar grupos de consumidores AMQP: Use o grupo de consumidores padrão (DEFAULT_GROUP) no IoT Platform ou crie um novo grupo.
Configure uma assinatura do lado do servidor AMQP: Assine as mensagens dos tópicos desejados por meio de um grupo de consumidores.
Baixe o SDK
Este código de exemplo usa a biblioteca Stomp PHP para se comunicar com o IoT Platform via protocolo STOMP. Acesse Stomp PHP para baixar o cliente e consultar as instruções.
Para verificar as versões compatíveis do PHP, consulte a declaração require no arquivo composer.json do SDK Stomp PHP.
Versões do Stomp PHP anteriores à 5.0.0 apresentam um problema conhecido de reconexão. Recomendamos a versão 5.0.0 ou superior. Para mais detalhes, veja Issues.
Execute o comando abaixo no diretório do seu projeto PHP para instalar o Stomp PHP 5.0.0.
composer require stomp-php/stomp-php 5.0.0
Código de exemplo
<?php
require __DIR__ . '/vendor/autoload.php';
use Stomp\Client;
use Stomp\Network\Observer\Exception\HeartbeatException;
use Stomp\Network\Observer\ServerAliveObserver;
use Stomp\StatefulStomp;
// For parameter details, see the documentation on connecting an AMQP client.
// WARNING: Hard-coding your AccessKey is a security risk. This example retrieves it from an environment variable for enhanced security.
$accessKey = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
$accessSecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$consumerGroupId = "${YourConsumerGroupId}";
$clientId = "${YourClientId}";
// iotInstanceId: The ID of the IoT Platform instance.
$iotInstanceId = "${YourIotInstanceId}";
$timeStamp = round(microtime(true) * 1000);
// The signature algorithm. Supported values are hmacmd5, hmacsha1, and hmacsha256.
$signMethod = "hmacsha1";
// For instructions on how to construct the username, see the AMQP client connection documentation.
// To transmit binary data, add the encode=base64 parameter to the username. The server will then Base64-encode the message body before sending the message. See the "Binary message body" section for more information.
$userName = $clientId . "|authMode=aksign"
. ",signMethod=" . $signMethod
. ",timestamp=" . $timeStamp
. ",authId=" . $accessKey
. ",iotInstanceId=" . $iotInstanceId
. ",consumerGroupId=" . $consumerGroupId
. "|";
$signContent = "authId=" . $accessKey . "×tamp=" . $timeStamp;
// Calculate the signature. For instructions on how to construct the password, see the documentation on connecting an AMQP client.
$password = base64_encode(hash_hmac("sha1", $signContent, $accessSecret, $raw_output = TRUE));
// The connection endpoint. For details, see the AMQP client connection documentation.
$client = new Client('ssl://${YourHost}:61614');
$sslContext = ['ssl' => ['verify_peer' => true, 'verify_peer_name' => false], ];
$client->getConnection()->setContext($sslContext);
// Listen for server heartbeats.
$observer = new ServerAliveObserver();
$client->getConnection()->getObservers()->addObserver($observer);
// Heartbeat configuration. The client expects a heartbeat packet from the server every 30 seconds.
$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;
}
// If the connection is successful, execution continues.
$stomp = new StatefulStomp($client);
$stomp->subscribe('/topic/#');
echo "connect success";
while (true) {
try {
// Check the connection status.
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;
}
// Add your message processing logic here.
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();
}
}
Substitua os valores de espaço reservado no código pelos seus valores reais. Para obter mais informações sobre os parâmetros, consulte Conectar um cliente AMQP ao IoT Platform.
Especifique valores válidos para os parâmetros. Caso contrário, o cliente AMQP não conseguirá se conectar ao IoT Platform.
|
Parâmetro |
Descrição |
|
accessKey |
Faça login no console do IoT Platform, passe o mouse sobre sua foto de perfil no canto superior direito e clique em AccessKey Management para obter o AccessKey ID e o AccessKey secret. Nota
Se você utilizar um usuário RAM, conceda a ele a permissão para gerenciar o IoT Platform (AliyunIOTFullAccess). Sem essa permissão, a conexão falhará. Para saber como conceder permissões, consulte Acesso de Usuário RAM. |
|
accessSecret |
|
|
consumerGroupId |
O ID do grupo de consumidores na instância do IoT Platform. Faça login no console do IoT Platform. Na instância correspondente, acesse para visualizar o ID do seu grupo de consumidores. |
|
iotInstanceId |
O ID da instância. Encontre-o na página Overview do console do IoT Platform.
|
|
clientId |
O ID do cliente. Defina este ID, que pode ter até 64 caracteres. Recomendamos o uso de um identificador exclusivo, como UUID, endereço MAC ou endereço IP do servidor onde o cliente AMQP está localizado. Após conectar e iniciar o cliente AMQP, faça login no console do IoT Platform. Na aba Consumer Groups da página da instância, clique em View ao lado do grupo de consumidores. A página Consumer Group Details exibirá esse parâmetro, facilitando a identificação dos diferentes clientes. |
|
client |
Estabelece uma conexão entre o cliente AMQP e o IoT Platform: Para informações sobre o endpoint AMQP referente a |
Resultados de exemplo
-
Sucesso: Uma mensagem de log semelhante à abaixo é retornada, indicando que o cliente AMQP se conectou ao IoT Platform e recebeu mensagens com êxito.
$ 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 -
Falha: Uma mensagem de log semelhante à abaixo é retornada, indicando que o cliente AMQP não conseguiu se conectar ao IoT Platform.
Use o log de erros para verificar seu código e as configurações de rede. Corrija o problema e execute o código novamente.
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
Corpo de mensagem binária
Como o STOMP é um protocolo baseado em texto, use um parâmetro de codificação Base64 para transmitir dados binários. Sem essa codificação, os corpos das mensagens podem ser truncados.
Adicione o parâmetro encode=base64 ao userName conforme mostrado abaixo. Dessa forma, o servidor codificará o corpo da mensagem em Base64 antes de enviá-la.
$userName = $clientId . "|authMode=aksign"
. ",signMethod=" . $signMethod
. ",timestamp=" . $timeStamp
. ",authId=" . $accessKey
. ",iotInstanceId=" . $iotInstanceId
. ",consumerGroupId=" . $consumerGroupId
. ",encode=base64" . "|";
Referências
Para mais informações sobre códigos de erro relacionados a mensagens de assinatura do lado do servidor, consulte Códigos de erro relacionados a mensagens.