溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

適用于協(xié)程客戶端和PHP協(xié)議解析的是什么

發(fā)布時間:2021-06-28 16:15:52 來源:億速云 閱讀:132 作者:chen 欄目:編程語言

這篇文章主要介紹“適用于協(xié)程客戶端和PHP協(xié)議解析的是什么”,在日常操作中,相信很多人在適用于協(xié)程客戶端和PHP協(xié)議解析的是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”適用于協(xié)程客戶端和PHP協(xié)議解析的是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

MQTT是一種基于發(fā)布/訂閱模式的“輕量級”通訊協(xié)議,作為一種低開銷、低帶寬占用的即時通訊協(xié)議,已經(jīng)成為物聯(lián)網(wǎng)的重要組成部分,今天小編就帶大家了解一下simps/mqtt。

MQTT 是一種基于發(fā)布/訂閱(publish/subscribe)模式的"輕量級"通訊協(xié)議,作為一種低開銷、低帶寬占用的即時通訊協(xié)議,已經(jīng)成為物聯(lián)網(wǎng)的重要組成部分

Swoole 也給 PHP 提供了開發(fā)物聯(lián)網(wǎng)項目的能力,只需要設(shè)置一個 open_mqtt_protocol 選項,啟用后就會解析 MQTT 包頭,在 Worker 進程的 onReceive 事件每次都會返回一個完整的 MQTT 數(shù)據(jù)包

當然其他的也有,例如 Workerman 之前提供的 異步 mqtt 客戶端庫 ,還有其他的開源庫,這里就不一一介紹了

Simps 的第一個版本 MQTT 庫 就是參考了 Workerman 的實現(xiàn),使其能夠使用 Swoole 的協(xié)程能力,同時也修復了一些問題

在此也要感謝 @walkor 對 PHP 生態(tài)作出的貢獻

第一個版本的實現(xiàn)是放在了框架當中,限制了一些用戶的使用。于是又開始了重構(gòu),將 MQTT 獨立為一個 library ,方便用戶使用的同時也豐富了 PHP 生態(tài),讓 PHP 程序員不再局限于 Web 開發(fā)

在第一個版本發(fā)布之后,Simps 的交流群中也有不少用戶詢問 MQTT 的問題,Swoole 也修復了一些相關(guān)的 Bug,現(xiàn)在使用 PHP + Swoole 去開發(fā)物聯(lián)網(wǎng)相關(guān)的項目應(yīng)該是如虎添翼

同時第一個版本的 MQTT 庫,只支持 MQTT 3.x,不支持 MQTT 5.0,在 GitHub 上也沒有找到相關(guān)支持的類庫,所以在重構(gòu)了 3.x 版本之后,也支持了一下 MQTT 5.0

也許這是第一個支持 MQTT v5.0 協(xié)議的 PHP library...

支持 MQTT 協(xié)議 3.1、3.1.1 和 5.0 版本,支持 QoS 0、QoS 1、QoS 2,那么它來了,使用 composer 來安裝

composer require simps/mqtt

安裝成功之后我們來看一下訂閱和發(fā)布的使用,以 MQTT5.0 為例

訂閱

首先應(yīng)該是訂閱,訂閱成功之后才能收到對應(yīng)主題的發(fā)布消息,創(chuàng)建一個subscribe.php寫入以下內(nèi)容

include __DIR__ . '/vendor/autoload.php';

use Simps\MQTT\Hex\ReasonCode;
use Swoole\Coroutine;
use Simps\MQTT\Client;
use Simps\MQTT\Types;

$config = [
    'host' => 'broker.emqx.io',
    'port' => 1883,
    'time_out' => 5,
    'user_name' => 'user001',
    'password' => 'hLXQ9ubnZGzkzf',
    'client_id' => Client::genClientID(),
    'keep_alive' => 10,
    'properties' => [
        'session_expiry_interval' => 60,
        'receive_maximum' => 200,
        'topic_alias_maximum' => 200,
    ],
    'protocol_level' => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]);
    while (!$data = $client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    $topics['simps-mqtt/user001/get'] = [
        'qos' => 1,
        'no_local' => true,
        'retain_as_published' => true,
        'retain_handling' => 2,
    ];
    $timeSincePing = time();
    $res = $client->subscribe($topics);
    // 訂閱的結(jié)果
    var_dump($res);
    while (true) {
        $buffer = $client->recv();
        if ($buffer && $buffer !== true) {
            $timeSincePing = time();
            // 收到的數(shù)據(jù)包
            var_dump($buffer);
        }
        if (isset($config['keep_alive']) && $timeSincePing < (time() - $config['keep_alive'])) {
            $buffer = $client->ping();
            if ($buffer) {
                echo 'send ping success' . PHP_EOL;
                $timeSincePing = time();
            } else {
                $client->close();
                break;
            }
        }
        // QoS1 發(fā)布回復
        if ($buffer['type'] === Types::PUBLISH && $buffer['qos'] === 1) {
            $client->send(
                [
                    'type' => Types::PUBACK,
                    'message_id' => $buffer['message_id'],
                    'code' => ReasonCode::SUCCESS
                ]
            );
        }
    }
});

執(zhí)行php subscribe.php,就會得到這樣的輸出

array(3) {
  ["type"]=>
  int(9)
  ["message_id"]=>
  int(1)
  ["codes"]=>
  array(1) {
    [0]=>
    int(1)
  }
}

表示訂閱成功,codes 對應(yīng)的是對應(yīng)訂閱主題的 QoS 等級

發(fā)布

訂閱成功之后,創(chuàng)建一個publish.php來測試發(fā)布

include __DIR__ . '/vendor/autoload.php';

use Swoole\Coroutine;
use Simps\MQTT\Client;

$config = [
    'host' => 'broker.emqx.io',
    'port' => 1883,
    'time_out' => 5,
    'user_name' => 'user002',
    'password' => 'adIJS1D482sd',
    'client_id' => Client::genClientID(),
    'keep_alive' => 20,
    'properties' => [
        'session_expiry_interval' => 60,
        'receive_maximum' => 200,
        'topic_alias_maximum' => 200,
    ],
    'protocol_level' => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]);
    while (!$client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    while (true) {
        $response = $client->publish(
            'simps-mqtt/user001/get',
            '{"time":' . time() . '}',
            1,
            0,
            0,
            ['topic_alias' => 1]
        );
        var_dump($response);
        Coroutine::sleep(3);
    }
});

代碼的意思是每隔 3 秒給訂閱的主題simps-mqtt/user001/get發(fā)布一次消息

打開一個新的終端窗口,執(zhí)行php publish.php就會得到輸出:

array(4) {
  ["type"]=>
  int(4)
  ["message_id"]=>
  int(1)
  ["code"]=>
  int(0)
  ["message"]=>
  string(7) "Success"
}

這里增加了 message,為了用戶可讀,不需要去查找對應(yīng)的 code 含義是什么

返回到訂閱的窗口,就會看到所打印的發(fā)布信息

array(8) {
  ["type"]=>
  int(3)
  ["topic"]=>
  string(0) ""
  ["message"]=>
  string(19) "{"time":1608017156}"
  ["dup"]=>
  int(1)
  ["qos"]=>
  int(1)
  ["retain"]=>
  int(0)
  ["message_id"]=>
  int(4)
  ["properties"]=>
  array(1) {
    ["topic_alias"]=>
    int(1)
  }
}

這樣一個簡單的發(fā)布訂閱功能就實現(xiàn)了

在這個庫中還有一些值得優(yōu)化和還未完成的部分,如還沒有支持 MQTT5 的Auth type,以及部分的properties還未支持

想?yún)⑴c的同學可以提交 PR,如果有問題也可以提交 Issue,讓我們共同去建設(shè) PHP 的生態(tài)

到此,關(guān)于“適用于協(xié)程客戶端和PHP協(xié)議解析的是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI