ホームページ  >  記事  >  PHPフレームワーク  >  Laravel は Workerman コマンドラインとどのように連携して MQTT を監視しますか

Laravel は Workerman コマンドラインとどのように連携して MQTT を監視しますか

青灯夜游
青灯夜游転載
2022-12-13 20:28:021792ブラウズ

Laravel WorkermanMQTT を監視するにはどうすればよいですか?以下の記事では、Laravel が Workerman コマンドラインと連携して MQTT を監視する方法を紹介しますので、ご参考になれば幸いです。

Laravel は Workerman コマンドラインとどのように連携して MQTT を監視しますか

同社はモノのインターネットに取り組んでいます。サーバーは、MQTT プロトコルを介して PHP を通じてモノのインターネット デバイスと通信することがよくあります。PHP フレームワークでは Laravel が使用されています。 . 初めてこれに接したときに発見しました。比較できる情報はありません。しばらく調査しており、すでにいくつかのプロジェクトで使用しています。将来の参考のために、関連する手順をここに投稿します。同じようなニーズを持つ友人の参考に。

最初に書いた

ご存知のとおり、PHP は Web 専用に設計された言語であり、ほとんどの場合、Web サーバーと通信します。バックエンド。他のバックエンド言語と組み合わせて「フロントエンド」としても使用されます。また、その基礎となる設計により、Web 上でより適した処理を行う能力も制限されます。したがって、使用したい場合は、 MQTT を監視するサーバーを使用するには、ここで説明したように、他のライブラリと連携する必要があります。主なライブラリは、workerman と swoole の 2 つです。現時点 (2019.08) で MQTT を監視するサーバーを実際に使用した経験としては、次のとおりです。 :

workerman:

  • インストールが簡単、composer コマンド 1 行でインストールできます [関連推奨事項: "workerman チュートリアル "]
  • MQTT ライブラリは多くの人に使用されており、更新日も新しいです
  • MQTT TLS/SSL 暗号化をサポート
  • ドキュメントの詳細

swoole :

  • インストールは Workerman よりも複雑です。各オペレーティング環境は個別にインストールする必要があり、コンパイルする必要がある場合もあります。
  • MQTT を使用する人は少なく、更新されてから長い時間が経ちます。
  • ドキュメントが少なく、見つかる情報も少なくなります。
  • MQTT は使用しません。 TLS/SSL 暗号化をサポートする 暗号化が必要な場合 環境はあまり優しくない可能性があります

まとめると、最終的に workerman を選択しました。この記事では、構成と使用のための MQTT ライブラリとして workerman を使用します。

Laravel をインストールします (すでにインストールされている場合は省略できます)

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 などの国内のコンポーザー ソースを使用してインストールを高速化することを検討できます。

worker-mqtt のインストール

上で述べたように、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.
という 1 行だけです。

新しいartisanコマンドを作成する

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 = &#39;mqtt {action}&#39;;

    protected $description = &#39;PHP Server MQTT Client&#39;;

    protected $client_id = &#39;php-server&#39;;

    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 などの他のサービスと併用して、メッセージ キューをキャッシュしたり使用したりすることもできます。 。

mqtt コマンドを実行します

これは他の 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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。