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.
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.
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 :
swoole :
En résumé, j'ai finalement choisi Workererman Cet article utilise Workererman comme bibliothèque MQTT pour la configuration et l'utilisation.
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.
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.
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 = '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(); } }
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.
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.
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!