一文快速瞭解PHP專案中怎麼使用MQTT

2021-09-03 22:00:06

PHP 是一種被廣泛應用的開放原始碼的多用途指令碼語言,它可嵌入到 HTML 中,尤其適合 Web 開發。

本文主要介紹如何在 PHP 專案中使用 php-mqtt/client 使用者端庫 ,實現 MQTT 使用者端MQTT 伺服器的連線、訂閱、取消訂閱、收發訊息等功能。

MQTT 使用者端庫選擇

本文選擇了 composer 上下載量最高的 php-mqtt/client 這個使用者端庫,更多 PHP-MQTT 使用者端庫可以在 Packagist - Search MQTT 中檢視。

有關 php-mqtt/client 更多使用檔案請參閱 Packagist php-mqtt/client

MQTT 通訊屬於 HTTP 體系之外的網路通訊場景,由於 PHP 特性限制,使用 PHP 體系中的 Swoole/Workerman 等專為網路通訊打造的拓展可以帶來更好的體驗,其使用本文不再贅述,相關的 MQTT 使用者端庫如下:

  • workerman/mqtt:Asynchronous MQTT client for PHP based on workerman.
  • simps/mqtt:MQTT Protocol Analysis and Coroutine Client for PHP.

專案初始化

確認 PHP 版本

本專案使用 7.4.21 進行開發測試,讀者可用如下命令確認 PHP 的版本。

php --version

PHP 7.4.21 (cli) (built: Jul 12 2021 11:52:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.21, Copyright (c), by Zend Technologies

使用 Composer 安裝 php-mqtt/client 使用者端

Composer 是 PHP 的一個依賴管理工具,它能管理你的 PHP 專案所需要的所有依賴關係。

composer require php-mqtt/client

PHP MQTT 使用

連線 MQTT 伺服器

本文將使用 EMQ X 提供的 免費公共 MQTT 伺服器,該服務基於 EMQ X 的 MQTT 物聯網雲平臺 建立。伺服器接入資訊如下:

  • Broker: broker-cn.emqx.io
  • TCP Port: 1883
  • SSL/TLS Port: 8883

匯入 composer autoload 檔案和 php-mqtt/client

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;

設定 MQTT Broker 連線引數

設定 MQTT Broker 連線地址,埠以及 topic,同時我們呼叫 PHP rand 函數隨機生成 MQTT 使用者端 id。

$server   = 'broker-cn.emqx.io';
$port     = 1883;
$clientId = rand(5, 15);
$username = 'emqx_user';
$password = null;
$clean_session = false;

編寫 MQTT 連線函數

使用上述的引數進行連線,通過 ConnectionSettings 設定連線引數,比如

$connectionSettings  = new ConnectionSettings();$connectionSettings
  ->setUsername($username)
  ->setPassword(null)
  ->setKeepAliveInterval(60)  // Last Will 設定
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);複製程式碼

訂閱訊息

編寫程式碼訂閱 emqx/test 主題,併為該訂閱設定回撥函數以處理接收到的訊息,此處我們將訂閱得到的主題和訊息列印出來:

// 訂閱
$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

釋出訊息

構造一個 payload,呼叫 publish 函數向 emqx/test 主題釋出訊息,釋出完成之後使用者端需要進入輪詢狀態,處理傳入的訊息和重發佇列:

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => 'https://github.com/emqx/MQTT-Client-Examples'
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

// 使用者端輪詢以處理傳入訊息和重發佇列
$mqtt->loop(true);

完整程式碼

伺服器連線、訊息釋出與接收程式碼。

<?php

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;
use \PhpMqtt\Client\ConnectionSettings;

$server   = 'broker.emqx.io';
$port     = 1883;
$clientId = rand(5, 15);
$username = 'emqx_user';
$password = null;
$clean_session = false;

$connectionSettings  = new ConnectionSettings();
$connectionSettings
  ->setUsername($username)
  ->setPassword(null)
  ->setKeepAliveInterval(60)
  // Last Will 設定
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);


$mqtt = new MqttClient($server, $port, $clientId);

$mqtt->connect($connectionSettings, $clean_session);
printf("client connected\n");

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => 'https://github.com/emqx/MQTT-Client-Examples'
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

$mqtt->loop(true);

測試

執行 MQTT 訊息釋出程式碼,我們將看到使用者端已經成功連線,且訊息已經逐條釋出並接收成功:

php pubsub_tcp.php

1.png

總結

至此,我們完成了使用 php-mqtt/client 使用者端連線到公共 MQTT 伺服器,並實現了測試使用者端與 MQTT 伺服器的連線、訊息釋出和訂閱。

原文連結:https://www.emqx.com/zh/blog/how-to-use-mqtt-in-php

作者:EMQ

推薦學習:《》

以上就是一文快速瞭解PHP專案中怎麼使用MQTT的詳細內容,更多請關注TW511.COM其它相關文章!