Connectez-vous à IoT Platform et recevez les messages d'abonnement côté serveur en utilisant le SDK PHP.
Prérequis
Vous disposez d'un ID de groupe de consommateurs et vous êtes abonné aux messages des rubriques requises.
Gérer les groupes de consommateurs AMQP : utilisez le groupe de consommateurs par défaut (DEFAULT_GROUP) dans IoT Platform ou créez un groupe de consommateurs.
Configurer un abonnement côté serveur AMQP : abonnez-vous aux messages des rubriques requises à l'aide d'un groupe de consommateurs.
Télécharger le SDK
Cet exemple de code utilise la bibliothèque Stomp PHP pour communiquer avec IoT Platform via le protocole STOMP. Rendez-vous sur Stomp PHP pour télécharger le client et consulter les instructions.
Pour connaître les versions de PHP compatibles, consultez la déclaration require dans le fichier composer.json du SDK Stomp PHP.
Les versions de Stomp PHP antérieures à la 5.0.0 présentent un problème connu de reconnexion. Nous recommandons d'utiliser la version 5.0.0 ou une version ultérieure. Pour plus d'informations, consultez la page Issues.
Exécutez la commande suivante dans le répertoire de votre projet PHP pour installer Stomp PHP 5.0.0.
composer require stomp-php/stomp-php 5.0.0
Exemple de code
<?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();
}
}
Remplacez les valeurs fictives du code par vos valeurs réelles. Pour plus d'informations sur les paramètres, consultez la rubrique Connecter un client AMQP à IoT Platform.
Spécifiez des valeurs de paramètre valides. Dans le cas contraire, le client AMQP ne parviendra pas à se connecter à IoT Platform.
|
Paramètre |
Description |
|
accessKey |
Connectez-vous à la console IoT Platform, placez le curseur sur votre photo de profil dans le coin supérieur droit, puis cliquez sur AccessKey Management pour obtenir l'ID AccessKey et le secret AccessKey. Remarque
Si vous utilisez un utilisateur RAM, vous devez lui accorder l'autorisation de gérer IoT Platform (AliyunIOTFullAccess). Dans le cas contraire, la connexion échouera. Pour plus d'informations sur l'octroi de cette autorisation, consultez la rubrique Accès des utilisateurs RAM. |
|
accessSecret |
|
|
consumerGroupId |
L'ID du groupe de consommateurs dans l'instance IoT Platform. Connectez-vous à la console IoT Platform. Dans l'instance correspondante, accédez à pour afficher l'ID de votre groupe de consommateurs. |
|
iotInstanceId |
L'ID de l'instance. Vous pouvez le trouver sur la page Aperçu de la console IoT Platform.
|
|
clientId |
L'ID client. Vous devez définir cet ID. Sa longueur maximale est de 64 caractères. Nous vous recommandons d'utiliser un identifiant unique, tel que l'UUID, l'adresse MAC ou l'adresse IP du serveur où se trouve votre client AMQP. Une fois le client AMQP connecté et démarré, connectez-vous à la console IoT Platform. Sur l'onglet Groupes de consommateurs de la page de l'instance, cliquez sur View à côté du groupe de consommateurs. La page Consumer Group Details affiche ce paramètre. Cela vous aide à identifier les différents clients. |
|
client |
Crée une connexion entre le client AMQP et IoT Platform : Pour plus d'informations sur le point de terminaison AMQP correspondant à |
Résultats de l'exemple
-
Succès : Un message de journal similaire à celui ci-dessous est renvoyé, indiquant que le client AMQP s'est connecté à IoT Platform et a reçu les messages avec succès.
$ 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 -
Échec : Un message de journal similaire à celui ci-dessous est renvoyé, indiquant que le client AMQP n'a pas réussi à se connecter à IoT Platform.
Utilisez le journal d'erreurs pour vérifier votre code et vos paramètres réseau. Résolvez le problème et exécutez à nouveau le code.
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
Corps de message binaire
Pour transmettre des données binaires, utilisez un paramètre d'encodage Base64, car STOMP est un protocole basé sur du texte. Sans encodage, les corps de message risquent d'être tronqués.
Ajoutez le paramètre encode=base64 à userName comme indiqué ci-dessous. Le serveur encode alors le corps du message en Base64 avant de l'envoyer.
$userName = $clientId . "|authMode=aksign"
. ",signMethod=" . $signMethod
. ",timestamp=" . $timeStamp
. ",authId=" . $accessKey
. ",iotInstanceId=" . $iotInstanceId
. ",consumerGroupId=" . $consumerGroupId
. ",encode=base64" . "|";
Références
Pour plus d'informations sur les codes d'erreur relatifs aux messages d'abonnement côté serveur, consultez la rubrique Codes d'erreur liés aux messages.