ホームページ > バックエンド開発 > PHPの問題 > PHP プロトコル解析とコルーチン クライアントで機能するもの

PHP プロトコル解析とコルーチン クライアントで機能するもの

醉折花枝作酒筹
リリース: 2023-03-10 22:40:01
転載
2433 人が閲覧しました

MQTT は、パブリッシュ/サブスクライブ モデルに基づいた「軽量」通信プロトコルです。オーバーヘッドと帯域幅の使用量が少ないインスタント メッセージング プロトコルとして、モノのインターネットの重要な部分になっています。今日は、学習について説明します。 simps/mqttについて。

PHP プロトコル解析とコルーチン クライアントで機能するもの

MQTT は、パブリッシュ/サブスクライブ (パブリッシュ/サブスクライブ) モードに基づく「軽量」通信プロトコルであり、低オーバーヘッド、低帯域幅のインスタント メッセージング プロトコルとして、モノのインターネットの重要な部分

Swoole は、モノのインターネット プロジェクトを開発する機能も PHP に提供します。open_mqtt_protocol オプションを設定するだけで済みます。これを有効にすると、MQTT ヘッダーが解析されます。 Worker プロセスでは、onReceive イベントは毎回完全な MQTT データ パケットを返します。

もちろん、Workerman によって以前に提供されていた非同期 MQTT クライアント ライブラリやその他のオープン ソース ライブラリなど、他のオープン ソース ライブラリもありますが、これらはここで 1 つずつ紹介します

Simps の MQTT ライブラリの最初のバージョンは Workerman の実装を参照し、Swoole のコルーチン機能を使用できるようにし、いくつかの問題も修正しています

##私もしたいと思います@walkor に感謝します。PHP エコシステムによる貢献

最初のバージョンの実装はフレームワークに組み込まれていたため、一部のユーザーの使用が制限されていました。そこで私たちは再びリファクタリングを開始し、MQTT をライブラリに分離しました。これにより、ユーザーが使いやすくなっただけでなく、PHP エコシステムが強化されました。これにより、PHP プログラマーは Web 開発に限定されなくなりました。

最初のバージョンがリリースされました, Simps また、コミュニケーション グループで MQTT について質問するユーザーもたくさんいます。Swoole は関連するいくつかのバグも修正しました。現在、PHP Swoole を使用して IoT 関連プロジェクトを開発することは、さらに強力になるはずです。

At the同時に、MQTT ライブラリの最初のバージョンは MQTT 3.x のみをサポートし、MQTT 5.0 はサポートしません。GitHub には関連するサポート対象クラス ライブラリが見つからないため、3.x バージョンをリファクタリングした後、MQTT 5.0 もサポートされます

これはおそらくこれです。MQTT v5.0 プロトコルをサポートする最初の PHP ライブラリです...
MQTT プロトコル バージョン 3.1、3.1.1、および 5.0 をサポートし、QoS 0、QoS 1、QoS 2 をサポートします次に、ここにあります。Composer を使用してインストールします。

composer require simps/mqtt
ログイン後にコピー

インストールが成功したら、MQTT5.0 を例として、サブスクリプションとパブリッシュの使用法を見てみましょう

サブスクリプション

最初にサブスクリプションを行う必要があります。サブスクリプションが成功した後、対応するトピックの公開メッセージを受信するには、subscribe.php を作成し、次の内容を記述します。

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[&#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
                ]
            );
        }
    }
});
ログイン後にコピー

php submit.php を実行します。次のような出力が得られます

array(3) {
  ["type"]=>
  int(9)
  ["message_id"]=>
  int(1)
  ["codes"]=>
  array(1) {
    [0]=>
    int(1)
  }
}
ログイン後にコピー

サブスクリプションが成功したことを示し、対応するコードはサブスクリプション トピックに対応する QoS レベルです

Publish

サブスクリプションが成功した後、パブリケーションをテストするためにpublish.phpを作成します

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);
    }
});
ログイン後にコピー

コードは3秒ごとにサブスクライブすることを意味しますトピックsimps-mqtt/user001/getはメッセージをパブリッシュします

新しいターミナルウィンドウを開いて実行しますphp public.php を実行すると、次の出力が得られます:

array(4) {
  ["type"]=>
  int(4)
  ["message_id"]=>
  int(1)
  ["code"]=>
  int(0)
  ["message"]=>
  string(7) "Success"
}
ログイン後にコピー

Message is added here, so that users can Reading, there is no need to look up to match the code. What is the Meaning?

購読ウィンドウに戻ると、印刷された出版情報が表示されます

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)
  }
}
ログイン後にコピー

このような単純なパブリッシュおよびサブスクライブ機能が実現されています

このライブラリには、最適化する価値のある部分がまだいくつかあります。 MQTT5 をまだサポートしていない認証タイプや、まだサポートされていない一部のプロパティなど、まだ完了していないものがあります。

参加したい学生は PR を送信できます。質問がある場合は、PR を送信することもできます。問題を送信して、一緒に PHP エコシステムを構築しましょう

推奨学習:

php ビデオ チュートリアル

以上がPHP プロトコル解析とコルーチン クライアントで機能するものの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート