Maison >développement back-end >Problème PHP >Ce qui fonctionne pour l'analyse du protocole PHP et les clients coroutine
MQTT est un protocole de communication « léger » basé sur le modèle de publication/abonnement. En tant que protocole de messagerie instantanée avec une faible surcharge et une faible utilisation de la bande passante, il est devenu un élément important de l'Internet des objets. Aujourd'hui, je vais vous montrer Apprendre. à propos de simps/mqtt.
MQTT est un protocole de communication « léger » basé sur le modèle de publication/abonnement (publication/abonnement), car un protocole de messagerie instantanée à faible surcharge et à faible bande passante est devenu une partie importante de l'Internet des objets
Swoole fournit également à PHP la possibilité de développer des projets Internet des objets. Il vous suffit de définir une option open_mqtt_protocol Après l'avoir activée, l'en-tête MQTT sera analysé. dans le processus Worker. L'événement onReceive renverra un paquet MQTT complet à chaque fois
Bien sûr, il y en a d'autres, comme la bibliothèque client asynchrone mqtt précédemment fournie par Workerman, et d'autres bibliothèques open source, que je ne ferai pas. présentez-les un par un ici
La première version de Simps de la bibliothèque MQTT fait référence à l'implémentation de Workerman, lui permettant d'utiliser les capacités de coroutine de Swoole, et corrige également certains problèmes
Je voudrais également merci @walkor pour cette contribution apportée par l'écosystème PHP
L'implémentation de la première version a été placée dans le framework, ce qui restreignait l'utilisation de certains utilisateurs. Nous avons donc commencé à refactoriser et séparé MQTT en une bibliothèque, ce qui a non seulement facilité son utilisation pour les utilisateurs, mais a également enrichi l'écosystème PHP, afin que les programmeurs PHP ne se limitent plus au développement Web
Après la sortie de la première version, Simps Il y a également de nombreux utilisateurs dans le groupe de communication qui posent des questions sur MQTT et ont également corrigé certains bugs associés. Désormais, l'utilisation de PHP + Swoole pour développer des projets liés à l'IoT devrait être encore plus puissante
À. en même temps, la première version de MQTT La bibliothèque ne prend en charge que MQTT 3.x et ne prend pas en charge MQTT 5.0. Il n'existe aucune bibliothèque de classes prise en charge pertinente trouvée sur GitHub, donc après avoir refactorisé la version 3.x, elle prend également en charge MQTT 5.0<.>
Peut-être que c'est la première bibliothèque PHP à prendre en charge le protocole MQTT v5.0...Prend en charge les versions 3.1, 3.1.1 et 5.0 du protocole MQTT, prend en charge QoS 0, QoS 1, QoS 2, puis ça arrive, utilisez composer pour installercomposer require simps/mqttAprès une installation réussie, jetons un coup d'œil à l'utilisation de l'abonnement et de la publication, en prenant MQTT5.0 comme exemple AbonnementLa première chose devrait être l'abonnement, l'abonnement est réussi. Ce n'est qu'alors que vous pourrez recevoir le message de publication du sujet correspondant. Créez un Subscribe.php et écrivez le contenu suivant
include __DIR__ . '/vendor/autoload.php'; use Simps\MQTT\Hex\ReasonCode; use Swoole\Coroutine; use Simps\MQTT\Client; use Simps\MQTT\Types; $config = [ 'host' => 'broker.emqx.io', 'port' => 1883, 'time_out' => 5, 'user_name' => 'user001', 'password' => 'hLXQ9ubnZGzkzf', 'client_id' => Client::genClientID(), 'keep_alive' => 10, 'properties' => [ 'session_expiry_interval' => 60, 'receive_maximum' => 200, 'topic_alias_maximum' => 200, ], 'protocol_level' => 5, ]; Coroutine\run(function () use ($config) { $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]); while (!$data = $client->connect()) { Coroutine::sleep(3); $client->connect(); } $topics['simps-mqtt/user001/get'] = [ 'qos' => 1, 'no_local' => true, 'retain_as_published' => true, 'retain_handling' => 2, ]; $timeSincePing = time(); $res = $client->subscribe($topics); // 订阅的结果 var_dump($res); while (true) { $buffer = $client->recv(); if ($buffer && $buffer !== true) { $timeSincePing = time(); // 收到的数据包 var_dump($buffer); } if (isset($config['keep_alive']) && $timeSincePing < (time() - $config['keep_alive'])) { $buffer = $client->ping(); if ($buffer) { echo 'send ping success' . PHP_EOL; $timeSincePing = time(); } else { $client->close(); break; } } // QoS1 发布回复 if ($buffer['type'] === Types::PUBLISH && $buffer['qos'] === 1) { $client->send( [ 'type' => Types::PUBACK, 'message_id' => $buffer['message_id'], 'code' => ReasonCode::SUCCESS ] ); } } });Exécutez php Subscribe.php, et vous obtiendrez le résultat suivant :
array(3) { ["type"]=> int(9) ["message_id"]=> int(1) ["codes"]=> array(1) { [0]=> int(1) } }indique que l'abonnement est réussi, codes correspondant au niveau de QoS du sujet d'abonnement correspondant PublierUne fois l'abonnement réussi , créez un publi.php pour tester la publication
include __DIR__ . '/vendor/autoload.php'; use Swoole\Coroutine; use Simps\MQTT\Client; $config = [ 'host' => 'broker.emqx.io', 'port' => 1883, 'time_out' => 5, 'user_name' => 'user002', 'password' => 'adIJS1D482sd', 'client_id' => Client::genClientID(), 'keep_alive' => 20, 'properties' => [ 'session_expiry_interval' => 60, 'receive_maximum' => 200, 'topic_alias_maximum' => 200, ], 'protocol_level' => 5, ]; Coroutine\run(function () use ($config) { $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]); while (!$client->connect()) { Coroutine::sleep(3); $client->connect(); } while (true) { $response = $client->publish( 'simps-mqtt/user001/get', '{"time":' . time() . '}', 1, 0, 0, ['topic_alias' => 1] ); var_dump($response); Coroutine::sleep(3); } });Le code signifie Le sujet abonné simps-mqtt/user001/get publie un message Ouvrez une nouvelle fenêtre de terminal et exécutez php submit. php et vous obtiendrez le résultat :
array(4) { ["type"]=> int(4) ["message_id"]=> int(1) ["code"]=> int(0) ["message"]=> string(7) "Success" }Le message est ajouté ici pour l'utilisateur Lisible, pas besoin de rechercher le code correspondant Retournez à la fenêtre d'abonnement et. vous verrez les informations de publication imprimées
array(8) { ["type"]=> int(3) ["topic"]=> string(0) "" ["message"]=> string(19) "{"time":1608017156}" ["dup"]=> int(1) ["qos"]=> int(1) ["retain"]=> int(0) ["message_id"]=> int(4) ["properties"]=> array(1) { ["topic_alias"]=> int(1) } }Une fonction de publication et d'abonnement aussi simple est implémentée Il y a encore certaines parties dans cette bibliothèque qui méritent d'être optimisées et qui ne sont pas encore terminées, comme comme le type Auth qui ne prend pas en charge MQTT5, et certaines propriétés ne sont pas encore prises en charge Les étudiants qui souhaitent participer peuvent soumettre un PR, ou soumettre un problème si vous avez des questions, travaillons ensemble pour construire le Écosystème PHP Apprentissage recommandé :
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!