返回顶部
首页 > 资讯 > 精选 >Laravel如何整合Workerman命令行监听MQTT
  • 362
分享到

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

2023-07-04 18:07:48 362人浏览 独家记忆
摘要

这篇文章主要介绍“Laravel如何整合Workerman命令行监听MQTT”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel如何整合Workerman命令行监听MQtT”文章能帮助大家解

这篇文章主要介绍“Laravel如何整合Workerman命令行监听MQTT”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel如何整合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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Laravel如何整合Workerman命令行监听MQTT

本文链接: https://lsjlt.com/news/346988.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Laravel如何整合Workerman命令行监听MQTT
    这篇文章主要介绍“Laravel如何整合Workerman命令行监听MQTT”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel如何整合Workerman命令行监听MQTT”文章能帮助大家解...
    99+
    2023-07-04
  • 在Laravel中如何执行Shell命令
    这篇文章主要介绍在Laravel中如何执行Shell命令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!shell_exec() 和 exec() 都可以执行 shell 命令。如果你的命令不知道因为什么原因而崩溃,你...
    99+
    2023-06-21
  • ​laravel如何用命令来执行脚本
    这篇文章主要介绍“laravel如何用命令来执行脚本”,在日常操作中,相信很多人在laravel如何用命令来执行脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel如何用命令来执行脚本”的疑惑有所...
    99+
    2023-06-21
  • 如何进行Oracle 运维命令整理
    本篇文章为大家展示了如何进行Oracle 运维命令整理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、oracle建库与删库命令(1)oracle11g建库(一般习惯配置gdbname与sid名一...
    99+
    2023-06-28
  • 如何在 PHP 中使用 Laravel 框架来运行 Shell 命令?
    Laravel 是一个流行的 PHP 框架,它提供了许多功能和工具来简化开发过程。其中一个非常有用的功能是运行 Shell 命令。在本文中,我们将讨论如何在 Laravel 中运行 Shell 命令。 首先,我们需要了解如何在 PHP 中...
    99+
    2023-07-02
    laravel shell http
  • 如何使用 Linux 命令行工具优化 Laravel 接口运行效率?
    Laravel 是一个流行的 PHP 开发框架,它提供了一套丰富的工具和功能来快速构建 Web 应用程序。然而,当我们面对大量访问和数据处理时,我们需要优化我们的代码和服务器环境以提高应用程序的性能。本文将介绍如何使用 Linux 命令行工...
    99+
    2023-08-17
    laravel linux 接口
  • Python API 与 UNIX 命令行:如何优雅地结合使用?
    Python是一种高级编程语言,可用于开发各种类型的应用程序。而UNIX命令行是一种基于文本的用户界面,用于操作UNIX系统。Python API和UNIX命令行都是非常强大的工具,如果能够将它们结合使用,将会是一种非常优雅的方式来处理各...
    99+
    2023-06-26
    api unix npm
  • 如何使用Linux中监控CPU与虚拟内存运行信息的命令
    本篇内容介绍了“如何使用Linux中监控CPU与虚拟内存运行信息的命令”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mpstatmpstat...
    99+
    2023-06-12
  • Python的HTTP库和Unix命令行中的数组操作如何相互配合?
    Python的HTTP库和Unix命令行中的数组操作是两个非常强大的工具。它们可以相互配合,使得我们可以更快更有效地处理数据。在本文中,我们将介绍如何使用Python的HTTP库和Unix命令行中的数组操作来处理数据。 Python的HT...
    99+
    2023-09-16
    unix http 数组
  • 如何将用于执行 MySQL 语句的内置命令(g 和 G)相互组合?
    众所周知,内置命令(\G 和 \g)将命令发送到 MySQL 服务器执行,两者的结果集格式不同。为了将它们组合起来并获得没有错误的结果,我们需要在一条语句中编写两个查询,一个查询以 \G 结尾,另一个查询以 \g 结尾。示例 H2>mysq...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作