目錄
寫在開始
安裝Laravel,已安裝可省略
安裝workerman-mqtt
#新建artisan指令
執行mqtt命令
不足
首頁 php框架 Workerman Laravel怎麼配合Workerman命令列監聽MQTT

Laravel怎麼配合Workerman命令列監聽MQTT

Dec 13, 2022 pm 08:28 PM
php laravel workerman

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/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.
登入後複製

#新建artisan指令

既然是使用Laravel配合workerman監聽MQTT,那artisan自然是不二的選擇了,能使用Laravel的元件,還能使用artisan指令管理監聽流程。建立相關指令檔:

➜  php artisan make:command mqtt
Console command created successfully.
登入後複製

然後編輯產生的workerman-mqtt/app/Console/Commands/mqtt.php文件,將文件改成如下內容:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Workerman\Worker;

class mqtt extends Command
{
    protected $signature = &#39;mqtt {action}&#39;;

    protected $description = &#39;PHP Server MQTT Client&#39;;

    protected $client_id = &#39;php-server&#39;;

    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.test
MQTT_PORT=1883
MQTT_USER=username
MQTT_PASSWORD=password
MQTT_DEBUG=true
登入後複製

其中,onConnect裡面的subscribe後面是需要監聽的topic,當收到新消息的時候,onMessage裡面的topic是訊息的topic,data就是具體的訊息資訊了,有了這兩個,我們可以在onMessage裡面寫我們的業務邏輯,當然也可以引入Laravel框架本身的一些元件,像是資料庫、日誌等,也可以與別的服務比如說Redis、訊息佇列MQ等配合進行快取或使用訊息佇列等。

執行mqtt命令

和別的artisan命令差不多,直接命令列運行就好了:

➜  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
登入後複製

注意別忘了後面的start,這是workerman本身所需的啟動參數。

因為workerman設定是常駐內存,正常情況下是在持續在監聽的,即使程式有bug被終止,workerman也會自動新建一個進程進行處理。

如果生產環境需要長期監聽處理MQTT數據,建議使用systemctl等指令來管理。

不足

雖然到上面為止已經可以作為客戶端在服務端監聽MQTT的消息,但是這裡有個不足之處就是,我到目前沒找到辦法單獨呼叫這個函式庫在處理實際業務邏輯的時候publish訊息到指定的topic。

還有一點是,使用這個函式庫,不能同時執行兩個使用了這個函式庫的artisan指令,會有以下提示:

➜  php artisan mqtt start
Workerman[artisan] start in DEBUG mode
Workerman[artisan] already running
登入後複製

這個問題搜遍了全網也沒發現有解決的辦法。雖然可以透過Timer類別添加定時功能透過另類辦法解決,但是在需要效率的情況下,這並不是最優解,如果有別的方案,建議還是不要選擇PHP作為服務端來處理MQTT相關業務。

更多程式相關知識,請造訪:程式設計教學! !

以上是Laravel怎麼配合Workerman命令列監聽MQTT的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP的目的:構建動態網站 PHP的目的:構建動態網站 Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

為什麼要使用PHP?解釋的優點和好處 為什麼要使用PHP?解釋的優點和好處 Apr 16, 2025 am 12:16 AM

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP:服務器端腳本語言的簡介 PHP:服務器端腳本語言的簡介 Apr 16, 2025 am 12:18 AM

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP和網絡:探索其長期影響 PHP和網絡:探索其長期影響 Apr 16, 2025 am 12:17 AM

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

See all articles