Laravel WorkermanMQTT を監視するにはどうすればよいですか?以下の記事では、Laravel が Workerman コマンドラインと連携して MQTT を監視する方法を紹介しますので、ご参考になれば幸いです。
同社はモノのインターネットに取り組んでいます。サーバーは、MQTT プロトコルを介して PHP を通じてモノのインターネット デバイスと通信することがよくあります。PHP フレームワークでは Laravel が使用されています。 . 初めてこれに接したときに発見しました。比較できる情報はありません。しばらく調査しており、すでにいくつかのプロジェクトで使用しています。将来の参考のために、関連する手順をここに投稿します。同じようなニーズを持つ友人の参考に。
ご存知のとおり、PHP は Web 専用に設計された言語であり、ほとんどの場合、Web サーバーと通信します。バックエンド。他のバックエンド言語と組み合わせて「フロントエンド」としても使用されます。また、その基礎となる設計により、Web 上でより適した処理を行う能力も制限されます。したがって、使用したい場合は、 MQTT を監視するサーバーを使用するには、ここで説明したように、他のライブラリと連携する必要があります。主なライブラリは、workerman と swoole の 2 つです。現時点 (2019.08) で MQTT を監視するサーバーを実際に使用した経験としては、次のとおりです。 :
workerman:
swoole :
まとめると、最終的に workerman を選択しました。この記事では、構成と使用のための MQTT ライブラリとして workerman を使用します。
Composer は最新の PHP 開発には不可欠です。基本的に、より大きなフレームワークでは Composer の使用が推奨されるため、ここではComposer を使用して Laravel をインストールします。コマンドは次のとおりです:
composer create-project --prefer-dist laravel/laravel workman-mqtt '5.5.*'
Laravel指定バージョン 現在(2019.08)唯一のLTSバージョンは5.5.xですが、エンタープライズプロジェクトの安定性とセキュリティを考慮するとやはりLTSが選ばれます。プロジェクト名は workerman-mqtt で、MQTT のテストに特別に使用されます。
コンポーザーが遅すぎる場合は、Alibaba Cloud などの国内のコンポーザー ソースを使用してインストールを高速化することを検討できます。
上で述べたように、composer を使用して worker-mqtt をインストールするのは非常に簡単で、必要なコマンドは
➜ cd workerman-mqtt ➜ composer require workerman/mqtt Using version ^1.0 for workerman/mqtt ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 2 installs, 0 updates, 0 removals - Installing workerman/workerman (v3.5.20): Loading from cache - Installing workerman/mqtt (v1.0): Loading from cache workerman/workerman suggests installing ext-event (For better performance. ) Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested. Writing lock file Generating optimized autoload files Carbon 1 is deprecated, see how to migrate to Carbon 2. https://carbon.nesbot.com/docs/#api-carbon-2 You can run './vendor/bin/upgrade-carbon' to get help in updating carbon and other frameworks and libraries that depend on it. > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover Discovered Package: fideloper/proxy Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Package manifest generated successfully.
Laravelとworkermanを使用してMQTTを監視しているため、当然ながらartisanが最良の選択です。Laravelコンポーネントを使用することもできます。リスニングプロセスを管理するためのArtisanコマンド。関連するコマンド ファイルを作成します:
➜ php artisan make:command mqtt Console command created successfully.
次に、生成された workerman-mqtt/app/Console/Commands/mqtt.php ファイルを編集し、ファイルを次の内容に変更します:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Workerman\Worker; class mqtt extends Command { protected $signature = 'mqtt {action}'; protected $description = 'PHP Server MQTT Client'; protected $client_id = 'php-server'; public function __construct() { parent::__construct(); } public function handle() { global $argv; $arg = $this->argument('action'); $argv [1] = $arg; $worker = new Worker(); $worker->count = 1; $worker->onWorkerStart = function () { $mqtt = new \Workerman\Mqtt\Client("mqtt://" . env('MQTT_HOST') . ":" . env('MQTT_PORT'), array( // 'ssl' => array( // 'local_cert' => base_path() . '/path/mqtt/client.crt', // 'local_pk' => base_path() . '/path/mqtt/client.key', // 'cafile' => base_path() . '/path/mqtt/ca.crt', // 'verify_peer' => false, // 'allow_self_signed' => true, // ), // $mqtt->transport = 'ssl'; 'username' => env('MQTT_USER'), 'password' => env('MQTT_PASSWORD'), 'debug' => env('MQTT_DEBUG'), 'client_id' => $this->client_id . mt_rand(0, 999), 'will' => [ 'topic' => 'status/' . $this->client_id, 'content' => 0, 'qos' => 2, 'retain' => true, ] )); $mqtt->onConnect = function ($mqtt) { $mqtt->subscribe('/iot/#'); }; $mqtt->onMessage = function ($topic, $data, $mqtt) { var_dump($topic); var_dump($data); //TODO 业务代码 //publish消息到topic $mqtt->publish('test', 'hello workerman mqtt'); }; $mqtt->connect(); }; Worker::runAll(); } }
次に、プロジェクトのルート ディレクトリにある .env ファイルに移動し、次の項目を追加します。
MQTT_HOST=mqtt-broker.test MQTT_PORT=1883 MQTT_USER=username MQTT_PASSWORD=password MQTT_DEBUG=true
その中で、onConnect の subscribe の後に新しいメッセージの場合、onMessage の topic はメッセージのトピックであり、data は特定のメッセージ情報です。これら 2 つを使用して、onMessage でビジネス ロジックを記述することができますデータベースやログなど、Laravel フレームワーク自体の一部のコンポーネントは、Redis、メッセージ キュー MQ などの他のサービスと併用して、メッセージ キューをキャッシュしたり使用したりすることもできます。 。
これは他の Artisan コマンドと似ていますが、コマンドラインから直接実行するだけです:
➜ php artisan mqtt start Workerman[artisan] start in DEBUG mode ------------------------------------- WORKERMAN -------------------------------------- Workerman version:3.5.20 PHP version:7.1.30 -------------------------------------- WORKERS --------------------------------------- proto user worker listen processes status tcp zoco none none 1 [OK] -------------------------------------------------------------------------------------- Press Ctrl+C to stop. Start success. -> Try to connect to mqtt://mqtt-broker.test:1883 -- Tcp connection established -> Send CONNECT package client_id:php-server-superuser-subscribe95 username:username password:password clean_session:1 protocol_name:MQTT protocol_level:4 <- Recv CONNACK package, MQTT connect success -> Send SUBSCRIBE package, topic:/iot/# message_id:1 <- Recv SUBACK package, message_id:1
忘れないように注意してください。次の start は、workerman 自体に必要な起動パラメータです。
ワーカーマンの設定はメモリ上に常駐しているため、通常時は監視し続けており、プログラムにバグが発生して終了した場合でも、ワーカーマンは自動的に新しいプロセスを作成して処理します。
本番環境で MQTT データを長時間監視および処理する必要がある場合は、systemctl などのコマンドを使用して管理することをお勧めします。
これまでのところ、サーバー上の MQTT メッセージをクライアントとして監視することは可能ですが、ここには欠点があります。実際のビジネス ロジックを処理するときに、このライブラリを単独で呼び出して、指定されたトピックにメッセージをパブリッシュします。
もう 1 つの点は、このライブラリを使用する場合、このライブラリを使用する 2 つの職人コマンドを同時に実行することはできないということです。次のプロンプトが表示されます:
➜ php artisan mqtt start Workerman[artisan] start in DEBUG mode Workerman[artisan] already running
ネットワーク全体を検索しましたこの問題が見つかりました。解決策があります。 Timer クラスを介してタイミング機能を追加したり、別の方法で解決することもできますが、効率が要求される場合、これは最適な解決策ではありません。他の解決策がある場合は、MQTT 関連ビジネスを処理するサーバーとして PHP を選択しないことをお勧めします。 。
プログラミング関連の知識について詳しくは、プログラミング教育をご覧ください。 !
以上がLaravel は Workerman コマンドラインとどのように連携して MQTT を監視しますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。