Ce qui fonctionne pour l'analyse du protocole PHP et les clients coroutine

醉折花枝作酒筹
Libérer: 2023-03-10 22:40:01
avant
2410 Les gens l'ont consulté

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.

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 (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 installer

composer require simps/mqtt
Copier après la connexion

Aprè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

Abonnement

La 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__ . &#39;/vendor/autoload.php&#39;;

use Simps\MQTT\Hex\ReasonCode;
use Swoole\Coroutine;
use Simps\MQTT\Client;
use Simps\MQTT\Types;

$config = [
    &#39;host&#39; => &#39;broker.emqx.io&#39;,
    &#39;port&#39; => 1883,
    &#39;time_out&#39; => 5,
    &#39;user_name&#39; => &#39;user001&#39;,
    &#39;password&#39; => &#39;hLXQ9ubnZGzkzf&#39;,
    &#39;client_id&#39; => Client::genClientID(),
    &#39;keep_alive&#39; => 10,
    &#39;properties&#39; => [
        &#39;session_expiry_interval&#39; => 60,
        &#39;receive_maximum&#39; => 200,
        &#39;topic_alias_maximum&#39; => 200,
    ],
    &#39;protocol_level&#39; => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, [&#39;open_mqtt_protocol&#39; => true, &#39;package_max_length&#39; => 2 * 1024 * 1024]);
    while (!$data = $client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    $topics[&#39;simps-mqtt/user001/get&#39;] = [
        &#39;qos&#39; => 1,
        &#39;no_local&#39; => true,
        &#39;retain_as_published&#39; => true,
        &#39;retain_handling&#39; => 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[&#39;keep_alive&#39;]) && $timeSincePing < (time() - $config[&#39;keep_alive&#39;])) {
            $buffer = $client->ping();
            if ($buffer) {
                echo &#39;send ping success&#39; . PHP_EOL;
                $timeSincePing = time();
            } else {
                $client->close();
                break;
            }
        }
        // QoS1 发布回复
        if ($buffer[&#39;type&#39;] === Types::PUBLISH && $buffer[&#39;qos&#39;] === 1) {
            $client->send(
                [
                    &#39;type&#39; => Types::PUBACK,
                    &#39;message_id&#39; => $buffer[&#39;message_id&#39;],
                    &#39;code&#39; => ReasonCode::SUCCESS
                ]
            );
        }
    }
});
Copier après la connexion

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)
  }
}
Copier après la connexion

indique que l'abonnement est réussi, codes correspondant au niveau de QoS du sujet d'abonnement correspondant

Publier

Une fois l'abonnement réussi , créez un publi.php pour tester la publication

include __DIR__ . &#39;/vendor/autoload.php&#39;;

use Swoole\Coroutine;
use Simps\MQTT\Client;

$config = [
    &#39;host&#39; => &#39;broker.emqx.io&#39;,
    &#39;port&#39; => 1883,
    &#39;time_out&#39; => 5,
    &#39;user_name&#39; => &#39;user002&#39;,
    &#39;password&#39; => &#39;adIJS1D482sd&#39;,
    &#39;client_id&#39; => Client::genClientID(),
    &#39;keep_alive&#39; => 20,
    &#39;properties&#39; => [
        &#39;session_expiry_interval&#39; => 60,
        &#39;receive_maximum&#39; => 200,
        &#39;topic_alias_maximum&#39; => 200,
    ],
    &#39;protocol_level&#39; => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, [&#39;open_mqtt_protocol&#39; => true, &#39;package_max_length&#39; => 2 * 1024 * 1024]);
    while (!$client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    while (true) {
        $response = $client->publish(
            &#39;simps-mqtt/user001/get&#39;,
            &#39;{"time":&#39; . time() . &#39;}&#39;,
            1,
            0,
            0,
            [&#39;topic_alias&#39; => 1]
        );
        var_dump($response);
        Coroutine::sleep(3);
    }
});
Copier après la connexion

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"
}
Copier après la connexion

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)
  }
}
Copier après la connexion

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é :

Tutoriel vidéo php

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal