MQTT は、パブリッシュ/サブスクライブ モデルに基づいた「軽量」通信プロトコルです。オーバーヘッドと帯域幅の使用量が少ないインスタント メッセージング プロトコルとして、モノのインターネットの重要な部分になっています。今日は、学習について説明します。 simps/mqttについて。
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 を例として、サブスクリプションとパブリッシュの使用法を見てみましょうサブスクリプション
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 ] ); } } });php submit.php を実行します。次のような出力が得られます
array(3) { ["type"]=> int(9) ["message_id"]=> int(1) ["codes"]=> array(1) { [0]=> int(1) } }サブスクリプションが成功したことを示し、対応するコードはサブスクリプション トピックに対応する QoS レベルですPublishサブスクリプションが成功した後、パブリケーションをテストするためにpublish.phpを作成します
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); } });コードは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 中国語 Web サイトの他の関連記事を参照してください。