Maison  >  Article  >  cadre php  >  Méthode de mise en œuvre de combinaison de Swoole avec le protocole MQTT

Méthode de mise en œuvre de combinaison de Swoole avec le protocole MQTT

WBOY
WBOYoriginal
2023-06-25 11:00:342136parcourir

Avec le développement de l'Internet des objets, de plus en plus d'applications nécessitent une transmission et une communication de données en temps réel. Message Queuing Transport Protocol (MQTT) est un protocole léger adapté aux petits appareils et aux environnements à faible bande passante, et est souvent utilisé pour la transmission de données dans les appareils IoT. En tant que cadre de communication réseau hautes performances, asynchrone et axé sur les événements, Swoole fournit une implémentation efficace du protocole TCP/UDP/UnixSocket et peut être utilisé conjointement avec le protocole MQTT pour fournir une communication système plus efficace.

Cet article présentera comment utiliser les protocoles Swoole et MQTT pour communiquer et fournira une solution réalisable.

Tout d'abord, nous devons comprendre les connaissances de base du protocole MQTT. Il s'agit d'un protocole basé sur un modèle de publication/abonnement qui permet une communication bidirectionnelle entre les appareils. Il y a deux rôles principaux dans le protocole MQTT : les éditeurs et les abonnés. Les éditeurs publient des messages sur des sujets et les abonnés peuvent s'abonner à des sujets d'intérêt et recevoir des messages publiés par les éditeurs en temps réel. Dans le protocole MQTT, un sujet est défini sous forme de chaîne comme identifiant pour la publication/l'abonnement.

Ensuite, nous combinerons le framework Swoole pour implémenter le modèle de publication/abonnement du protocole MQTT.

Avant d'utiliser Swoole pour implémenter le protocole MQTT, nous devons installer la bibliothèque MQTT. Swoole peut utiliser la bibliothèque php-mqtt pour la communication MQTT, et nous pouvons utiliser composer pour l'installer :

composer require bluerhinos/phpmqtt dev-master

Après une installation réussie, nous pouvons commencer à utiliser Swoole pour communiquer avec le protocole MQTT.

Tout d'abord, nous devons créer un serveur TCP basé sur le framework Swoole. Sur ce serveur TCP, nous utiliserons le protocole MQTT pour la transmission des données. Dans le framework Swoole, nous pouvons créer un serveur TCP via le code suivant :

$server = new SwooleServer('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

Ensuite, nous devons enregistrer le hook de service au démarrage du serveur afin que les demandes des clients puissent être traitées. Dans cet exemple, nous utiliserons les méthodes onConnect, onReceive et onClose :

$server->on('connect', function ($serv, $fd) {
    echo "Client: Connect.
";
});

$server->on('receive', function ($serv, $fd, $from_id, $data) {
    echo "Receive Data: $data
";

    // 处理MQTT消息
});

$server->on('close', function ($serv, $fd) {
    echo "Client: Close.
";
});

Lors de la réception d'une demande client, nous analyserons le message MQTT. Étant donné que cet article se concentre sur la façon d'utiliser Swoole pour implémenter le protocole MQTT, nous nous concentrons uniquement sur la façon d'analyser les messages MQTT. Les messages MQTT peuvent être facilement analysés à l'aide de la bibliothèque php-mqtt Nous pouvons l'encapsuler dans une méthode :

function handleMqttMessage($client_id, $topic, $message)
{
    echo "Mqtt Message Received: 
";
    echo "Client ID: $client_id
";
    echo "Topic: $topic
";
    echo "Message: $message
";
}

Le travail restant consiste à envoyer les données analysées du message MQTT au client destinataire. Dans le protocole MQTT, nous pouvons communiquer en utilisant le mode publication/abonnement pour publier des messages sur des sujets spécifiés. Un client peut s'abonner à un sujet qui l'intéresse puis recevoir des messages publiés sur ce sujet. Dans le framework Swoole, nous pouvons utiliser swoole_server->task() pour envoyer des messages à des clients spécifiques.

Le code suivant permet d'envoyer le message à tous les clients abonnés au sujet correspondant après avoir reçu le message MQTT :

$server->on('receive', function ($serv, $fd, $from_id, $data) {
    $mqtt = new BluerhinosphpMQTT('localhost', 1883, 'Swoole_Server');
    $mqtt->debug = false;
    if (!$mqtt->connect()) {
        exit(1);
    }
    $topics['topic_name'] = array('qos' => 0, 'function' => 'handleMqttMessage');
    $mqtt->subscribe($topics, 0);
    while ($mqtt->proc()) {
    };
    $mqtt->close();
    echo "Receive Data: $data
";

    $data = json_decode($data, true);
    $message = $data['message'];

    $client_ids = $serv->getClientList();
    foreach ($client_ids as $client_id) {
        $serv->task("$client_id:$message");
    }

});

Chaque fois qu'un message client est reçu, nous le ferons tous appelez la méthode de rappel handleMqttMessage() en fonction de la rubrique souscrite, puis envoyez le message au client spécifié.

Enfin, nous devons envoyer le message au client dans l'événement Task :

$server->on('task', function ($serv, $task_id, $from_id, $data) {
    $client_id = strstr($data, ':', true);
    $message = substr(strstr($data, ':'), 1);
    $serv->send($client_id, $message);
});

Le code ci-dessus enverra le message au client et renverra une réponse après un envoi réussi Message ACK.

Résumé
Dans cet article, nous avons appris comment utiliser Swoole pour implémenter le protocole MQTT. De cette manière, nous pouvons parvenir à une communication efficace en temps réel et mieux gérer les demandes des clients en utilisant une approche asynchrone basée sur les événements. Le framework Swoole fournit une implémentation efficace du protocole TCP/UDP/UnixSocket, ce qui présente de nombreux avantages tant pour les grandes entreprises que pour les petits projets. À l'avenir, nous pouvons nous attendre à ce que davantage d'applications utilisent les protocoles Swoole et MQTT pour le transfert de données et la communication.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn