Heim  >  Artikel  >  PHP-Framework  >  Wie arbeitet Laravel mit der Workerman-Befehlszeile zusammen, um MQTT zu überwachen?

Wie arbeitet Laravel mit der Workerman-Befehlszeile zusammen, um MQTT zu überwachen?

青灯夜游
青灯夜游nach vorne
2022-12-13 20:28:021790Durchsuche

Wie überwacht

Laravel+Workerman MQTT? Der folgende Artikel stellt Ihnen vor, wie Laravel mit der Workerman-Befehlszeile zusammenarbeitet, um MQTT zu überwachen.

Wie arbeitet Laravel mit der Workerman-Befehlszeile zusammen, um MQTT zu überwachen?

Das Unternehmen beschäftigt sich mit dem Internet der Dinge und der Server kommuniziert häufig über PHP mit dem MQTT-Protokoll. Als ich zum ersten Mal damit in Kontakt kam, verwendete das PHP-Framework , Ich habe festgestellt, dass es keine vergleichbaren Informationen gibt, also habe ich eine Weile herumgesucht, wurde in mehreren Projekten verwendet und die relevanten Schritte werden hier für Ihre eigene Referenz in der Zukunft und als Referenz für Freunde mit ähnlichen Bedürfnissen veröffentlicht.

Am Anfang geschrieben

Wie wir alle wissen, ist PHP eine Sprache, die speziell für das Web entwickelt wurde. Meistens kommuniziert es mit dem Webserver und kooperiert auch mit anderen Backend-Sprachen ​​​​Um das „Frontend“ zu erstellen, schränkt das zugrunde liegende Design auch seine Eignung für diese Dinge im Web ein. Wenn Sie also den Server zur Überwachung von MQTT verwenden möchten, müssen Sie mit anderen Bibliotheken zusammenarbeiten. Es gibt zwei Hauptbibliotheken Hier erwähnt, nämlich workerman und swoole. Derzeit (2019.08) sind die Unterschiede in Bezug auf die tatsächliche Erfahrung mit der Verwendung des Servers zur Überwachung von MQTT wie folgt:

workerman:

  • Es ist einfach zu installieren und kann mit installiert werden eine Zeile Composer-Befehl [Verwandte Empfehlung: „workerman Tutorial“]
  • MQTT-Bibliothek Viele Leute verwenden sie und das Aktualisierungsdatum ist aktueller
  • Unterstützt MQTT TLS/SSL-Verschlüsselung
  • Detaillierte Dokumentation

Wolle:

  • Die Installation ist komplizierter als Workerman. Jede Betriebsumgebung muss separat installiert werden, und möglicherweise ist eine Kompilierungsumgebung erforderlich.
  • Es gibt weniger Leute, die MQTT verwenden, und es wurde schon lange aktualisiert.
  • Es gibt nur wenige Dokumente und es können weniger Informationen gefunden werden.
  • Es unterstützt keine TLS/SSL-Verschlüsselung. Wenn eine Verschlüsselung erforderlich ist, ist die Umgebung nicht geeignet Vielleicht nicht sehr freundlich

Zusammenfassend habe ich mich schließlich für Workererman entschieden. In diesem Artikel wird Workererman als MQTT-Bibliothek für die Konfiguration und Verwendung verwendet.

Installieren Sie Laravel, Sie können es weglassen, wenn es bereits installiert ist.

Composer sollte für die moderne PHP-Entwicklung unverzichtbar sein. Grundsätzlich empfehlen wir die Verwendung von Composer, daher verwenden wir hier Composer, um Laravel zu installieren :

Composer Create-Project --Prefer-Dist Laravel/Laravel Workerman-Mqtt '5.5.*' Stabilität und Sicherheit von Unternehmensprojekten oder entscheiden Sie sich für LTS. Der Projektname lautet

workerman-mqtt
und wird speziell zum Testen von MQTT verwendet.

Wenn Composer zu langsam ist, können Sie in Betracht ziehen, inländische Composer-Quellen wie Alibaba Cloud zu verwenden, um die Installation zu beschleunigen.

Worker-mqtt installieren

Wie oben erwähnt, ist es sehr einfach, worker-mqtt mit Composer zu installieren. Es ist nur eine Befehlszeile erforderlich:
➜  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.

Neuer Artisan-Befehl

Da Laravel mit workererman verwendet wird Um MQTT zu überwachen, ist artisan natürlich die beste Wahl. Sie können Laravel-Komponenten verwenden und auch den Befehl artisan verwenden, um den Abhörprozess zu verwalten. Erstellen Sie die entsprechende Befehlsdatei:
➜  php artisan make:command mqtt
Console command created successfully.

Bearbeiten Sie dann die generierte Datei

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

und ändern Sie die Datei in den folgenden Inhalt:

<?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();
    }
}
Gehen Sie dann zu .env unter Projektstammverzeichnis Fügen Sie der Datei die folgenden Elemente hinzu:

MQTT_HOST=mqtt-broker.test
MQTT_PORT=1883
MQTT_USER=username
MQTT_PASSWORD=password
MQTT_DEBUG=true
Darunter folgt auf subscribe in onConnect das Thema, das überwacht werden muss. Wenn eine neue Nachricht empfangen wird, ist

topic in onMessage das Thema Nachricht und Daten sind die spezifischen Nachrichteninformationen. Mit diesen beiden können wir unsere Geschäftslogik in onMessage schreiben. Natürlich können wir auch einige Komponenten des Laravel-Frameworks selbst einführen, z. B. Datenbanken, Protokolle usw mit anderen Diensten wie Redis, Message Queue MQ usw. Caching oder Verwendung von Message Queue usw. Das Ausführen des mqtt-Befehls

ähnelt anderen handwerklichen Befehlen. Führen Sie ihn einfach direkt über die Befehlszeile aus:
➜  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

Achten Sie darauf, den folgenden

start

nicht zu vergessen, den von Workerman selbst benötigten Startparameter.

Da sich die Workerman-Einstellung im Speicher befindet, wird sie unter normalen Umständen kontinuierlich überwacht. Selbst wenn das Programm einen Fehler aufweist und beendet wird, erstellt der Workerman automatisch einen neuen Prozess zur Verarbeitung.

Wenn die Produktionsumgebung MQTT-Daten über einen längeren Zeitraum überwachen und verarbeiten muss, wird empfohlen, zur Verwaltung Befehle wie systemctl zu verwenden.

Mängel

Obwohl es bisher möglich war, MQTT-Nachrichten auf dem Server als Client zu überwachen, gibt es hier einen Mangel. Bisher habe ich keine Möglichkeit gefunden, diese Bibliothek alleine aufzurufen, um das eigentliche Geschäft abzuwickeln Logik. Beim Veröffentlichen der Nachricht im angegebenen Thema.

Ein weiterer Punkt ist, dass Sie bei Verwendung dieser Bibliothek nicht zwei Handwerkerbefehle gleichzeitig ausführen können, die diese Bibliothek verwenden. Die folgende Eingabeaufforderung wird angezeigt:

➜  php artisan mqtt start
Workerman[artisan] start in DEBUG mode
Workerman[artisan] already running
Ich habe das gesamte Internet nach diesem Problem durchsucht und keine Lösung gefunden. Obwohl die Timing-Funktion über die Timer-Klasse hinzugefügt und durch alternative Methoden gelöst werden kann, ist dies nicht die optimale Lösung, wenn Effizienz erforderlich ist. Wenn es andere Lösungen gibt, wird empfohlen, PHP nicht als Server für die Abwicklung von MQTT-bezogenen Geschäften zu wählen .

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmierlehre! !

Das obige ist der detaillierte Inhalt vonWie arbeitet Laravel mit der Workerman-Befehlszeile zusammen, um MQTT zu überwachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen