Maison  >  Article  >  cadre php  >  Comment Laravel coopère-t-il avec la ligne de commande Workerman pour surveiller MQTT

Comment Laravel coopère-t-il avec la ligne de commande Workerman pour surveiller MQTT

青灯夜游
青灯夜游avant
2022-12-13 20:28:021792parcourir

Comment

Laravel+Workerman surveille-t-il MQTT ? L'article suivant vous présentera comment Laravel coopère avec la ligne de commande Workerman pour surveiller MQTT. J'espère que cela vous sera utile.

Comment Laravel coopère-t-il avec la ligne de commande Workerman pour surveiller MQTT

L'entreprise est engagée dans l'Internet des objets, et le serveur communique souvent avec les appareils de l'Internet des objets via PHP via le protocole MQTT. Il arrive que le framework PHP utilise Laravel pour la première fois. , j'ai trouvé qu'il n'y avait pas d'informations comparables, alors j'ai tâtonné pendant un moment , a été utilisé dans plusieurs projets, et les étapes pertinentes sont publiées ici pour votre propre référence à l'avenir et pour la référence d'amis ayant des besoins similaires.

Écrit au début

Comme nous le savons tous, PHP est un langage conçu spécifiquement pour le Web La plupart du temps, il communique avec le serveur Web, il coopère également avec d'autres langages back-end. ​​​​pour faire le "front end", sa conception sous-jacente limite également son adéquation à ces choses sur le Web, donc si vous souhaitez utiliser le serveur pour surveiller MQTT, vous avez besoin d'autres bibliothèques pour coopérer. Il existe deux bibliothèques principales. mentionné ici, à savoir Workerman et Swoole Actuellement (2019.08), en termes d'expérience réelle d'utilisation du serveur pour surveiller MQTT, les différences sont les suivantes :

workerman :

  • Il est facile à installer et peut être installé avec. une ligne de commande composer [Recommandation associée : "workerman Tutorial"]
  • Bibliothèque MQTT De nombreuses personnes l'utilisent et la date de mise à jour est plus récente
  • Prend en charge le cryptage MQTT TLS/SSL
  • Documentation détaillée

swoole :

  • L'installation est plus compliquée que Workerman. Chaque environnement d'exploitation doit être installé séparément et un environnement de compilation peut être nécessaire.
  • Il y a moins de personnes qui utilisent MQTT et il est mis à jour depuis longtemps
  • Il y a peu de documents et moins d'informations peuvent être trouvées
  • Il ne prend pas en charge le cryptage TLS/SSL Si le cryptage est requis, l'environnement. ce n'est peut-être pas très convivial

En résumé, j'ai finalement choisi Workererman Cet article utilise Workererman comme bibliothèque MQTT pour la configuration et l'utilisation.

Installez Laravel, vous pouvez l'omettre s'il est déjà installé

Composer devrait être indispensable pour le développement PHP moderne. Fondamentalement, les frameworks plus grands recommanderont d'utiliser composer, nous utilisons donc ici composer pour installer Laravel. :

composer create-project --prefer-dist laravel/laravel work-mqtt '5.5.*'

La version spécifiée de Laravel est 5.5.x, qui est la seule version LTS actuellement (2019.08), en tenant compte de la stabilité et sécurité des projets d'entreprise, ou choisissez LTS. Le nom du projet est workerman-mqtt, qui est spécialement utilisé pour tester MQTT.

Si composer est trop lent, vous pouvez envisager d'utiliser des sources de composition nationales telles que Alibaba Cloud pour accélérer l'installation.

Installer Worker-mqtt

Comme mentionné ci-dessus, il est très simple d'installer Worker-mqtt avec Composer. Cela ne nécessite qu'une seule ligne de commande :

➜  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.

Nouvelle commande artisanale

Puisque Laravel est utilisé avec Workererman. pour surveiller MQTT, artisan est naturellement C'est le meilleur choix, vous pouvez utiliser des composants Laravel, et vous pouvez également utiliser la commande artisan pour gérer le processus d'écoute. Créez le fichier de commande approprié :

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

Modifiez ensuite le fichier workerman-mqtt/app/Console/Commands/mqtt.php généré et modifiez le fichier avec le contenu suivant :

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

Ensuite, allez dans .env sous le répertoire racine du projet Ajoutez les éléments suivants au fichier :

MQTT_HOST=mqtt-broker.test
MQTT_PORT=1883
MQTT_USER=username
MQTT_PASSWORD=password
MQTT_DEBUG=true

Parmi eux, subscribe dans onConnect est suivi du sujet qui doit être surveillé Lorsqu'un nouveau message est reçu, topic dans onMessage est le sujet du. message, et data sont les informations spécifiques du message. , avec ces deux-là, nous pouvons écrire notre logique métier dans onMessage. Bien sûr, nous pouvons également introduire certains composants du framework Laravel lui-même, tels que les bases de données, les journaux, etc., ou coopérer. avec d'autres services tels que Redis, la file d'attente de messages MQ, etc. Mise en cache ou utilisation de la file d'attente de messages, etc.

L'exécution de la commande mqtt

est similaire aux autres commandes artisanales. Il suffit de l'exécuter directement depuis la ligne de commande :

➜  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

Veillez à ne pas oublier le start suivant, qui est le paramètre de démarrage requis par Workerman lui-même.

Étant donné que le paramètre Workerman réside en mémoire, il est surveillé en permanence dans des circonstances normales. Même si le programme présente un bug et est terminé, Workerman créera automatiquement un nouveau processus à traiter.

Si l'environnement de production doit surveiller et traiter les données MQTT pendant une longue période, il est recommandé d'utiliser des commandes telles que systemctl pour les gérer.

Défauts

Bien qu'il ait été possible jusqu'à présent de surveiller les messages MQTT sur le serveur en tant que client, il y a une lacune ici. Jusqu'à présent, je n'ai pas trouvé de moyen d'appeler cette bibliothèque seule pour traiter les affaires réelles. logique lors de la publication du message dans le sujet spécifié.

Un autre point est que lorsque vous utilisez cette bibliothèque, vous ne pouvez pas exécuter deux commandes artisanales qui utilisent cette bibliothèque en même temps. L'invite suivante apparaîtra :

➜  php artisan mqtt start
Workerman[artisan] start in DEBUG mode
Workerman[artisan] already running

J'ai recherché ce problème sur tout Internet et je n'ai trouvé aucune solution. Bien que la fonction de synchronisation puisse être ajoutée via la classe Timer et résolue par des méthodes alternatives, ce n'est pas la solution optimale lorsque l'efficacité est requise. S'il existe d'autres solutions, il est recommandé de ne pas choisir PHP comme serveur pour gérer les activités liées à MQTT. .

Pour plus de connaissances liées à la programmation, veuillez visiter : Enseignement de la programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer