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
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 ] ); } } });
array(3) { ["type"]=> int(9) ["message_id"]=> int(1) ["codes"]=> array(1) { [0]=> int(1) } }
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); } });
array(4) { ["type"]=> int(4) ["message_id"]=> int(1) ["code"]=> int(0) ["message"]=> string(7) "Success" }
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) } }
以上がPHP プロトコル解析とコルーチン クライアントで機能するものの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。