Maison  >  Article  >  développement back-end  >  Ce qui fonctionne pour l'analyse du protocole PHP et les clients coroutine

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

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-06-28 15:44:352405parcourir

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

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
                ]
            );
        }
    }
});

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

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);
    }
});

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer