Laravel如何整合Workerman命令行监听MQTT


这篇文章主要介绍“Laravel如何整合Workerman命令行监听MQTT”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel如何整合Workerman命令行监听MQTT”文章能帮助大家解决问题。现代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源加快安装速度。上面说了,用composer安装workerman-mqtt很简单,只需要一行命令:

➜cdworkerman-mqtt
➜composerrequireworkerman/mqtt
Usingversion^1.0forworkerman/mqtt
./composer.jsonhasbeenupdated
Loadingcomposerrepositorieswithpackageinformation
Updatingdependencies(includingrequire-dev)
Packageoperations:2installs,0updates,0removals
-Installingworkerman/workerman(v3.5.20):Loadingfromcache
-Installingworkerman/mqtt(v1.0):Loadingfromcache
workerman/workermansuggestsinstallingext-event(Forbetterperformance.)
Packagephpunit/phpunit-mock-objectsisabandoned,youshouldavoidusingit.Noreplacementwassuggested.
Writinglockfile
Generatingoptimizedautoloadfiles
Carbon1isdeprecated,seehowtomigratetoCarbon2.
https://carbon.nesbot.com/docs/#api-carbon-2
Youcanrun'./vendor/bin/upgrade-carbon'togethelpinupdatingcarbonandotherframeworksandlibrariesthatdependonit.
>IlluminateFoundationComposerScripts::postAutoloadDump
>@phpartisanpackage:discover
DiscoveredPackage:fideloper/proxy
DiscoveredPackage:laravel/tinker
DiscoveredPackage:nesbot/carbon
Packagemanifestgeneratedsuccessfully.

既然是使用Laravel配合workerman监听MQTT,那artisan自然是不二的选择了,能使用Laravel的组件,还能使用artisan命令管理监听进程。创建相关命令文件:

➜phpartisanmake:commandmqtt
Consoleco免费云主机域名mmandcreatedsuccessfully.

然后编辑生成的workerman-mqtt/app/Console/Commands/mqtt.php文件,将文件改成如下内容:

argument('action');
$argv[1]=$arg;

$worker=newWorker();
$worker->count=1;
$worker->onWorkerStart=function(){
$mqtt=newWorkermanMqttClient("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','helloworkermanmqtt');
};
$mqtt->connect();
};
Worker::runAll();
}
}

然后到项目根目录下面的.env文件添加下面几项:

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

其中,onConnect里面的subscribe后面是需要监听的topic,当收到新消息的时候,onMessage里面的topic是消息的topic,data就是具体的消息信息了,有了这两个,我们可以在onMessage里面写我们的业务逻辑,当然也可以引入Laravel框架本身的一些组件,比如数据库、日志等,也可以与别的服务比如说Redis、消息队列MQ等配合进行缓存或者使用消息队列等。和别的artisan命令差不多,直接命令行运行就好了:

➜phpartisanmqttstart
Workerman[artisan]startinDEBUGmode
-------------------------------------WORKERMAN--------------------------------------
Workermanversion:3.5.20PHPversion:7.1.30
--------------------------------------WORKERS---------------------------------------
protouserworkerlistenprocessesstatus
tcpzocononenone1[OK]
--------------------------------------------------------------------------------------
PressCtrl+Ctostop.Startsuccess.
->Trytoconnecttomqtt://mqtt-broker.test:1883
--Tcpconnectionestablished
->SendCONNECTpackageclient_id:php-server-superuser-subscribe95username:usernamepassword:passwordclean_session:1protocol_name:MQTTprotocol_level:4
SendSUBSCRIBEpackage,topic:/iot/#message_id:1

注意别忘了后面的start,这是workerman本身需要的启动参数。因为workerman设定是常驻内存,正常情况下是在持续在监听的,即使程序有bug被终止,workerman也会自动新建一个进程进行处理。如果生产环境需要长期监听处理MQTT数据,建议使用systemctl等命令来管理。虽然到上面为止已经可以作为客户端在服务端监听MQTT的消息,但是这里有个不足之处就是,我到目前没找到办法单独调用这个库在处理实际业务逻辑的时候publish消息到指定的topic。还有一点是,使用这个库,不能同时运行两个使用了这个库的artisan命令,会有如下提示:

➜phpartisanmqttstart
Workerman[artisan]startinDEBUGmode
Workerman[artisan]alreadyrunning

这个问题搜遍了全网也没发现有解决的办法。虽然可以通过Timer类添加定时功能通过另类办法解决,但是在需要效率的情况下,这并不是最优解,如果有别的方案,建议还是不要选择PHP作为服务端来处理MQTT相关业务。关于“Laravel如何整合Workerman命令行监听MQTT”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: Flask如何使用全局变量传递数据

这篇“Flask如何使用全局变量传递数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“免费云主机域名Flask如何使用全局变量传递数据”文章吧。…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/27 16:22
下一篇 02/27 16:43

相关推荐