workerman/mqtt
MQTT 是一個客戶端服務端架構的發布/訂閱模式的消息傳輸協議,已經成為物聯網的重要組成部分。它的設計思想是輕巧、開放、簡單、規範,易於實現。這些特點使得它對很多場景來說都是很好的選擇,特別是對於受限的環境如機器與機器的通信(M2M)以及物聯網環境(IoT)。
workerman\mqtt 是一個基於 workerman 的異步 mqtt 客戶端庫,可用於接收或者發送 mqtt 協議的消息。支持 QoS 0、QoS 1、QoS 2。支持 MQTT 3.1 3.1.1 5版本。
專案地址
https://github.com/walkor/mqtt
安裝
composer require workerman/mqtt
支持
- MQTT
- MQTT5
- MQTT over websocket
示例
subscribe.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function(){
$mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
$mqtt->onConnect = function($mqtt) {
$mqtt->subscribe('test');
};
$mqtt->onMessage = function($topic, $content){
var_dump($topic, $content);
};
$mqtt->connect();
};
Worker::runAll();
命令行運行 php subscribe.php start 啟動
publish.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function(){
$mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
$mqtt->onConnect = function($mqtt) {
$mqtt->publish('test', 'hello workerman mqtt');
};
$mqtt->connect();
};
Worker::runAll();
命令行運行 php publish.php start 啟動。
workerman\mqtt\Client接口
Client::__construct()Client::connect()Client::publish()Client::subscribe()Client::unsubscribe()Client::disconnect()Client::close()callback onConnectcallback onMessagecallback onErrorcallback onClose
__construct (string $address, [array $options])
創建一個 mqtt 客戶端實例。
-
$addressmqtt 服務端地址,格式類似 'mqtt://test.mosquitto.org:1883'. -
$options客戶端選項數組,可以設置以下選項:keepalive: 客戶端向服務端發送心跳的時間間隔,默認 50 秒,設置成 0 代表不啟用心跳client_id: 客戶端 ID,如果沒設置默認是"workerman-mqtt-client-".mt_rand()protocol_name: 協議名,MQTT(3.1.1 版本)或者MQIsdp(3.1 版本),默認是MQTTprotocol_level: 協議等級,protocol_name是MQTT時值為4,protocol_name是MQIsdp時值是3clean_session: 清理會話,默認為true。設置為false可以接收到QoS 1和QoS 2級別的離線消息reconnect_period: 重連時間間隔,默認1秒,0代表不重連connect_timeout: 連接 mqtt 超時時間,默認30秒username: 使用者名稱,可選password: 密碼,可選will: 遺囑消息,當客戶端斷線後 Broker 會自動發送遺囑消息給其它客戶端。格式為:topic: 主題content: 內容qos:QoS等級retain:retain標記
resubscribe: 當連接異常斷開並重連後,是否重新訂閱之前的主題,默認為 truebindto用來指定本地以哪個 IP 和端口向 Broker 發起連接,默認值為 ''sslssl 選項,默認是false,如果設置為true,則以 ssl 方式連接。同時支持傳入 ssl 上下文數組,用來配置本地證書等,ssl 上下文參考 https://php.net/manual/en/context.ssl.phpdebug是否開啟 debug 模式,debug 模式可以輸出與 Broker 通訊的詳細信息,默認為falseurimqtt over websocket 的 uri 地址,一般為/mqtt
connect()
連接 Broker
publish(String $topic, String $content, [array $options], [callable $callback])
向某個主題發布一條消息
$topic主題$content消息$options選項數組,包括qosQoS等級,默認0retainretain 標記,默認falsedup重發標誌,默認false
$callback-function (\Exception $exception = null),(QoS 為 0 時不支持此設置)當發生錯誤時或者發布成功時觸發,$exception是異常對象,當沒有錯誤發生時$exception為null,下同。
subscribe(mixed $topic, [array $options], [callable $callback])
訂閱一個主題或者多個主題
$topic是一個字符串(訂閱一個主題)或者數組(訂閱多個主題),
當訂閱多個主題時,$topic是主題是 key,QoS為值的數組,例如array('topic1'=> 0, 'topic2'=> 1)$options訂閱選項數組,包含以下設置:qosQoS等級, 默認0
$callback-function (\Exception $exception = null, array $granted = [])
回調函數,當訂閱成功或者發生錯誤時觸發exception異常對象,無錯誤發生時它是null,下同granted訂閱結果數組,類似array('topic' => 'qos', 'topic' => 'qos')其中:topic是訂閱的主題qosBroker 接受的QoS等級
unsubscribe(mixed $topic, [callable $callback])
取消訂閱
$topic是一個字符串或者字符串數組,類似array('topic1', 'topic2')$callback-function (\Exception $e = null), 成功或者失敗時觸發的回調
disconnect()
正常斷開與 Broker 的連接, DISCONNECT 訊息會被發送到 Broker.
close()
強制斷開與 Broker 的連接,不會發送 DISCONNECT 訊息給 Broker.
callback onConnect(Client $mqtt)
當與 Broker 連接建立完畢後觸發。這時候已經收到了 Broker 的 CONNACK 訊息。
callback onMessage(String $topic, String $content, Client $mqtt)
function (topic, message, packet) {}
當客戶端收到 Publish 訊息時觸發
$topic收到的主題$content收到的消息內容$mqttmqtt 客戶端實例。
callback onError(\Exception $exception = null)
當連接發生某種錯誤時觸發
callback onClose()
當連接關閉時觸發,無論是客戶端主動關閉還是服務端關閉都會觸發 onClose