Conéctese a IoT Platform y reciba mensajes de suscripción del lado del servidor mediante el SDK de PHP.
Requisitos previos
Debe haber obtenido un ID de grupo de consumidores y haberse suscrito a los mensajes de tema requeridos.
Manage AMQP consumer groups: Use el grupo de consumidores predeterminado (DEFAULT_GROUP) en IoT Platform o cree uno nuevo.
Configure an AMQP server-side subscription: Suscríbase a los mensajes de tema requeridos mediante un grupo de consumidores.
Descarga del SDK
Este código de ejemplo utiliza la biblioteca Stomp PHP para comunicarse con IoT Platform mediante el protocolo STOMP. Visite Stomp PHP para descargar el cliente y consultar las instrucciones.
Para conocer las versiones de PHP compatibles, consulte la declaración require en el archivo composer.json del SDK de Stomp PHP.
Las versiones de Stomp PHP anteriores a la 5.0.0 presentan un problema conocido de reconexión. Se recomienda usar la versión 5.0.0 o posterior. Para obtener más información, consulte Issues.
Ejecute el siguiente comando en el directorio de su proyecto PHP para instalar Stomp PHP 5.0.0.
composer require stomp-php/stomp-php 5.0.0
Código de ejemplo
<?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();
}
}
Reemplace los valores de marcador de posición en el código por sus valores reales. Para obtener más información sobre los parámetros, consulte Connect an AMQP client to IoT Platform.
Especifique valores de parámetro válidos. De lo contrario, el cliente AMQP no podrá conectarse a IoT Platform.
|
Parámetro |
Descripción |
|
accessKey |
Inicie sesión en la consola de IoT Platform, pase el cursor sobre su foto de perfil en la esquina superior derecha y haga clic en AccessKey Management para obtener el AccessKey ID y el AccessKey secret. Nota
Si usa un usuario RAM, debe otorgarle el permiso para gestionar IoT Platform (AliyunIOTFullAccess). De lo contrario, la conexión fallará. Para obtener más información sobre cómo otorgar permisos, consulte RAM User Access. |
|
accessSecret |
|
|
consumerGroupId |
El ID del grupo de consumidores en la instancia de IoT Platform. Inicie sesión en la consola de IoT Platform. En la instancia correspondiente, vaya a para consultar su ID de grupo de consumidores. |
|
iotInstanceId |
El ID de la instancia. Puede encontrarlo en la página Overview de la consola de IoT Platform.
|
|
clientId |
El ID del cliente. Debe definir este ID. La longitud máxima es de 64 caracteres. Se recomienda usar un identificador único, como el UUID, la dirección MAC o la dirección IP del servidor donde se encuentra su cliente AMQP. Una vez que el cliente AMQP esté conectado e iniciado, inicie sesión en la consola de IoT Platform. En la pestaña Consumer Groups de la página de la instancia, haga clic en View junto al grupo de consumidores. La página Consumer Group Details muestra este parámetro. Esto le ayuda a identificar los diferentes clientes. |
|
client |
Establece una conexión entre el cliente AMQP e IoT Platform: Para obtener información sobre el endpoint AMQP correspondiente a |
Resultados de ejemplo
-
Éxito: Se devuelve un mensaje de registro similar al siguiente, lo que indica que el cliente AMQP se ha conectado a IoT Platform y ha recibido mensajes correctamente.
$ 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 -
Error: Se devuelve un mensaje de registro similar al siguiente, lo que indica que el cliente AMQP no pudo conectarse a IoT Platform.
Use el registro de errores para comprobar su código y la configuración de red. Resuelva el problema y ejecute el código nuevamente.
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
Cuerpo de mensaje binario
Para transmitir datos binarios, use un parámetro de codificación Base64, ya que STOMP es un protocolo basado en texto. Sin esta codificación, los cuerpos de los mensajes podrían truncarse.
Agregue el parámetro encode=base64 a userName como se muestra a continuación. El servidor codificará entonces el cuerpo del mensaje en Base64 antes de enviarlo.
$userName = $clientId . "|authMode=aksign"
. ",signMethod=" . $signMethod
. ",timestamp=" . $timeStamp
. ",authId=" . $accessKey
. ",iotInstanceId=" . $iotInstanceId
. ",consumerGroupId=" . $consumerGroupId
. ",encode=base64" . "|";
Referencias
Para obtener más información sobre los códigos de error de los mensajes de suscripción del lado del servidor, consulte Message-related error codes.