您好,欢迎访问一九零五行业门户网

Laravel怎么配合Workerman命令行监听MQTT

laravel+workerman怎么监听mqtt?下面本篇文章给大家介绍一下laravel配合workerman命令行监听mqtt的方法,希望对大家有所帮助。
公司是做物联网的,经常有服务端通过php与物联网设备通过mqtt协议通信,恰好php框架用的是laravel,刚接触的时候发现没什么比较接近的资料,自己摸索了一阵,已经在几个项目使用上了,这里将相关的步骤贴出来,方便以后自己查阅以及有类似需求的朋友参考。
写在开始众所周知,php是一门专为web设计的语言,绝大部分时间都是与web server通信,再后端一点,也是与别的后端语言配合做“前端”,其底层设计也限制了其本身更适合做web那些事,所以如果想要用来服务端监听mqtt,就需要别的库来配合,这里说的库主要就两个,分别是workerman及swoole,当前(2019.08)就服务端监听mqtt实际使用体验来说,分别如下:
workerman:
安装简单,一行composer命令就能安装好 【相关推荐:《workerman教程》】mqtt库使用的人多,更新日期更近支持mqtt tls/ssl加密文档详细swoole:
安装相比workerman复杂,每个运行环境都要单独安装,可能需要编译环境。mqtt使用的人较少,更新时间比较久远文档少,能查找到的资料也少不支持tls/ssl加密,如果需要加密的环境可能不是很友好综上所述,我最终选择了workerman,本文以workerman作为mqtt库进行配置使用。
安装laravel,已安装可省略现代php开发composer应该是必不可少的了,基本上大点的框架都会推荐使用composer,所以这里以composer来安装laravel,命令如下:
composer create-project --prefer-dist laravel/laravel workerman-mqtt ‘5.5.*’
laravel指定版本为5.5.x,这是目前(2019.08)的唯一lts版本,考虑到企业项目的稳定及安全,还是选择lts。项目名称为workerman-mqtt,专门用这个来测试mqtt。
如果composer太慢,可以考虑使用阿里云等国内composer源加快安装速度。
安装workerman-mqtt上面说了,用composer安装workerman-mqtt很简单,只需要一行命令:
➜  cd workerman-mqtt➜  composer require workerman/mqttusing version ^1.0 for workerman/mqtt./composer.json has been updatedloading composer repositories with package informationupdating 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 cacheworkerman/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 filegenerating optimized autoload filescarbon 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:discoverdiscovered package: fideloper/proxydiscovered package: laravel/tinkerdiscovered package: nesbot/carbonpackage manifest generated successfully.
新建artisan命令既然是使用laravel配合workerman监听mqtt,那artisan自然是不二的选择了,能使用laravel的组件,还能使用artisan命令管理监听进程。创建相关命令文件:
➜  php artisan make:command mqttconsole command created successfully.
然后编辑生成的workerman-mqtt/app/console/commands/mqtt.php文件,将文件改成如下内容:
<?phpnamespace 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();    }}
然后到项目根目录下面的.env文件添加下面几项:
mqtt_host=mqtt-broker.testmqtt_port=1883mqtt_user=usernamemqtt_password=passwordmqtt_debug=true
其中,onconnect里面的subscribe后面是需要监听的topic,当收到新消息的时候,onmessage里面的topic是消息的topic,data就是具体的消息信息了,有了这两个,我们可以在onmessage里面写我们的业务逻辑,当然也可以引入laravel框架本身的一些组件,比如数据库、日志等,也可以与别的服务比如说redis、消息队列mq等配合进行缓存或者使用消息队列等。
执行mqtt命令和别的artisan命令差不多,直接命令行运行就好了:
➜  php artisan mqtt startworkerman[artisan] start in debug mode------------------------------------- workerman --------------------------------------workerman version:3.5.20          php version:7.1.30-------------------------------------- workers ---------------------------------------proto   user            worker          listen          processes    statustcp     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
注意别忘了后面的start,这是workerman本身需要的启动参数。
因为workerman设定是常驻内存,正常情况下是在持续在监听的,即使程序有bug被终止,workerman也会自动新建一个进程进行处理。
如果生产环境需要长期监听处理mqtt数据,建议使用systemctl等命令来管理。
不足之处虽然到上面为止已经可以作为客户端在服务端监听mqtt的消息,但是这里有个不足之处就是,我到目前没找到办法单独调用这个库在处理实际业务逻辑的时候publish消息到指定的topic。
还有一点是,使用这个库,不能同时运行两个使用了这个库的artisan命令,会有如下提示:
➜  php artisan mqtt startworkerman[artisan] start in debug modeworkerman[artisan] already running
这个问题搜遍了全网也没发现有解决的办法。虽然可以通过timer类添加定时功能通过另类办法解决,但是在需要效率的情况下,这并不是最优解,如果有别的方案,建议还是不要选择php作为服务端来处理mqtt相关业务。
更多编程相关知识,请访问:编程教学!!
以上就是laravel怎么配合workerman命令行监听mqtt的详细内容。
其它类似信息

推荐信息