laravel和mqtt的对接

1.安装对应的扩展

sudo -u dap /opt/dap/php/bin/php composer.phar require php-mqtt/client
sudo -u dap /opt/dap/php/bin/php composer.phar require workerman/mqtt
启动mqtt: sudo -u dap /opt/dap/php/bin/php artisan mqtt start
启动提示 Error: Class ‘Workerman\Timer’ not found in ****\vendor\workerman\mqtt\src\Client
解决方案:版本问题,修改2行代码即可:找到****\vendor\workerman\mqtt\src\Client.php文件修改:
use \Workerman\Timer;
修改后为
use \Workerman\Lib\Timer;

2.mqtt文件的添加,调用subscribe方法

<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Workerman\Worker; class mqtt extends Command { protected $signature = 'mqtt {action} {--daemon}'; 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; $argv[2] = $this->option('daemon') ? '-d' : ''; $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('*****'); }; $mqtt->onMessage = function ($topic, $data, $mqtt) { }; $mqtt->connect(); }; $backtrace = \debug_backtrace(); $staticPath = $backtrace[\count($backtrace) - 1]['file']; $uniquePrefix = \str_replace('/', '_', $staticPath); Worker::$pidFile = __DIR__ . '/../../../vendor/workerman/' . $uniquePrefix . '_mqtt.pid'; Worker::runAll(); } }

3.publish方法的调用

$server = env('MQTT_HOST'); $port = env('MQTT_PORT'); $clientId = 'mqtt_' . mt_rand(0, 999);//客户端ID,可随意填写,也可使用rand函数生成随机的 $mqtt = new \PhpMqtt\Client\MQTTClient($server, $port, $clientId); $mqtt->connect(); $mqtt->publish('*****','***');