Rumah  >  Artikel  >  rangka kerja php  >  Bagaimanakah Laravel bekerjasama dengan baris arahan Workerman untuk memantau MQTT

Bagaimanakah Laravel bekerjasama dengan baris arahan Workerman untuk memantau MQTT

青灯夜游
青灯夜游ke hadapan
2022-12-13 20:28:021859semak imbas

Bagaimanakah

Laravel+Workerman memantau MQTT? Artikel berikut akan memperkenalkan kepada anda cara Laravel bekerjasama dengan baris arahan Workerman untuk memantau MQTT. Saya harap ia akan membantu anda.

Bagaimanakah Laravel bekerjasama dengan baris arahan Workerman untuk memantau MQTT

Syarikat ini terlibat dalam Internet of Things Pelayan sering berkomunikasi dengan peranti Internet of Things melalui PHP melalui protokol MQTT. Kebetulan rangka kerja PHP menggunakan Laravel . Saya menemuinya apabila saya mula-mula bersentuhan dengannya rakan yang mempunyai keperluan yang sama.

Ditulis pada permulaan

Seperti yang kita sedia maklum, PHP ialah bahasa yang direka khusus untuk Web, selalunya, ia berkomunikasi dengan Pelayan Web dan backend. Ia juga digunakan sebagai "front-end" bersama-sama dengan bahasa back-end yang lain. Reka bentuk asasnya juga menghadkan dirinya kepada perkara yang lebih sesuai untuk Web MQTT, anda memerlukan perpustakaan lain untuk bekerjasama, seperti yang dinyatakan di sini, terdapat dua perpustakaan utama, iaitu workerman dan swoole Pada masa ini (2019.08), dari segi pengalaman penggunaan sebenar MQTT pemantauan sisi pelayan, ia adalah seperti berikut:

pekerja:

    Mudah dipasang dengan satu baris arahan komposer [Cadangan berkaitan: "
  • Tutorial pekerja"]
  • Pustaka MQTT digunakan oleh ramai orang dan tarikh kemas kini lebih terkini
  • Menyokong Penyulitan MQTT TLS/SSL
  • Dokumentasi terperinci

swole:

    Pemasangan lebih rumit daripada Workerman Setiap persekitaran operasi mesti dipasang secara berasingan dan mungkin perlu disusun.
  • Terdapat lebih sedikit orang yang menggunakan MQTT dan telah dikemas kini sejak sekian lama
  • Terdapat sedikit dokumen dan kurang maklumat yang boleh ditemui
  • Tidak menyokong TLS /SSL encryption. Jika penyulitan diperlukan Persekitaran mungkin tidak begitu mesra
Ringkasnya, akhirnya saya memilih workererman Artikel ini menggunakan workererman sebagai perpustakaan MQTT untuk konfigurasi dan penggunaan.

Pasang Laravel, anda boleh meninggalkannya jika ia sudah dipasang

Komposer sepatutnya penting untuk pembangunan PHP moden Pada asasnya, rangka kerja yang lebih besar akan mengesyorkan penggunaan komposer, jadi di sini Gunakan komposer untuk memasang Laravel, arahannya adalah seperti berikut:

projek cipta komposer --prefer-dist laravel/laravel workerman-mqtt '5.5.*'

Versi yang ditentukan Laravel Ia adalah 5.5.x, yang merupakan satu-satunya versi LTS pada masa ini (2019.08) Memandangkan kestabilan dan keselamatan projek perusahaan, LTS masih dipilih. Nama projek ialah

workerman-mqtt, yang digunakan khas untuk menguji MQTT.

Jika komposer terlalu perlahan, anda boleh mempertimbangkan untuk menggunakan sumber komposer domestik seperti Alibaba Cloud untuk mempercepatkan pemasangan.

Pasang worker-mqtt

Seperti yang dinyatakan di atas, sangat mudah untuk memasang worker-mqtt dengan komposer Ia hanya memerlukan satu baris arahan:

➜  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.
menguruskan proses mendengar. Cipta fail arahan yang berkaitan:

Kemudian edit fail

workerman-mqtt/app/Console/Commands/mqtt.php

yang dihasilkan dan tukar fail kepada kandungan berikut:

➜  php artisan make:command mqtt
Console command created successfully.

Kemudian pergi ke fail .env di bawah direktori akar projek dan tambah item berikut:

<?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();
    }
}

Antaranya, langgan dalam onConnect diikuti dengan yang diperlukan Apabila memantau topik, apabila mesej baharu diterima,

topik
MQTT_HOST=mqtt-broker.test
MQTT_PORT=1883
MQTT_USER=username
MQTT_PASSWORD=password
MQTT_DEBUG=true
dalam onMessage ialah topik mesej, dan data ialah maklumat mesej khusus Dengan kedua-duanya, kita boleh menulis perniagaan kami dalam onMessage Logic, sudah tentu, juga boleh memperkenalkan beberapa komponen rangka kerja Laravel itu sendiri, seperti pangkalan data, log, dsb., atau ia juga boleh digunakan dengan perkhidmatan lain seperti Redis, MQ baris gilir mesej, dsb. untuk cache atau menggunakan baris gilir mesej.

Laksanakan perintah mqtt

Ia serupa dengan arahan artisan lain, cuma jalankan terus dari baris arahan:

Berhati-hati jangan lupa

mula

berikut, iaitu parameter permulaan yang diperlukan oleh pekerja itu sendiri.

➜  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
Oleh kerana tetapan pekerja berada dalam ingatan, ia sentiasa memantau dalam keadaan biasa Walaupun program mempunyai pepijat dan ditamatkan, pekerja akan membuat proses baharu untuk pemprosesan secara automatik.

Jika persekitaran pengeluaran perlu memantau dan memproses data MQTT untuk masa yang lama, adalah disyorkan untuk menggunakan arahan seperti systemctl untuk mengurusnya.

Kekurangan

Walaupun mungkin untuk memantau mesej MQTT pada pelayan sebagai pelanggan setakat ini, saya masih belum menemui jalan untuk panggil perpustakaan ini sahaja untuk menerbitkan mesej kepada topik yang ditentukan semasa memproses logik perniagaan sebenar.

Perkara lain ialah apabila menggunakan pustaka ini, anda tidak boleh menjalankan dua arahan artisan yang menggunakan pustaka ini pada masa yang sama Gesaan berikut akan muncul:

Masalah ini telah dicari di seluruh Internet tidak menemui sebarang penyelesaian. Walaupun fungsi pemasaan boleh ditambah melalui kelas Pemasa dan diselesaikan dengan kaedah alternatif, ini bukan penyelesaian yang optimum apabila kecekapan diperlukan. Jika terdapat penyelesaian lain, adalah disyorkan untuk tidak memilih PHP sebagai pelayan untuk mengendalikan perniagaan berkaitan MQTT .

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila layari: Pengajaran Pengaturcaraan! !

Atas ialah kandungan terperinci Bagaimanakah Laravel bekerjasama dengan baris arahan Workerman untuk memantau MQTT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam