Rumah >rangka kerja php >Workerman >Bagaimanakah Laravel bekerjasama dengan baris arahan Workerman untuk memantau MQTT
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.
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.
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: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.➜ 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.
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 = '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(); } }
Antaranya, langgan dalam onConnect diikuti dengan yang diperlukan Apabila memantau topik, apabila mesej baharu diterima,
topikMQTT_HOST=mqtt-broker.test MQTT_PORT=1883 MQTT_USER=username MQTT_PASSWORD=password MQTT_DEBUG=truedalam 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: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:1Oleh 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.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!