MQTT介紹:http://mqtt.orgphp
服務器端
https://mosquitto.org/download/git
PHP客戶端
https://github.com/bluerhinos/phpMQTTgithub
MQTT QOS等級訂閱和發佈的關係
https://www.jianshu.com/p/ebe4b2c0461d服務器
qos = 0:僅發一次,無論是否能收到
qos = 1:沒返回一直髮,可能有重複接收(接收到消息可能未傳遞給客戶端)
qos = 2:保證必須收到,而且不重複(使用MSG_ID保證不重複接收)函數
也就是服務器只會按pub和sub二者qos等級最小的那個qos規則來發送消息。
pub時指定的qos是服務器確定按此規則接收,可是最終訂閱者不必定。
sub時指定的qos表示訂閱者能夠接收的最高消息等級,也就是可能收到更低等級的消息。測試
遇到的問題ui
1. qos=2 一直沒有測試成功,mosquitto 已經收到客戶端的消息,但訂閱端就是接收不到。
2. 當有多個訂閱端時,又是後收到的消息竟然會不全,前面會有亂碼出現。
3. 沒有HTTP簡單直接;感受沒有HTTP可靠通用;spa
消息發佈debug
<?php require("../phpMQTT.php"); $server = '127.0.0.1'; // 服務器IP $port = 1883; // 服務器端口 $username = ''; // 用戶名 $password = ''; // 密碼 $client_id = 'pub_' . uniqid(); $mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); if ($mqtt->connect(true, NULL, $username, $password)) { for ($i=0; $i<100; $i++) { $topic = 'topic01'; $msg = 'Hello World! at (' . $i . ') ' . date('Y-m-d H:i:s'); echo date('Y-m-d H:i:s') . ' SEND [' . $topic . '] ' . $msg . PHP_EOL; // qos = 0:僅發一次,無論是否能收到 // qos = 1:沒返回一直髮,可能有重複接收 // qos = 2:保證必須收到,而且不重複 $mqtt->publish($topic, $msg, 0); usleep(100000); } $mqtt->close(); } else { echo "Time out!\n"; }
消息訂閱code
<?php require("../phpMQTT.php"); $server = '127.0.0.1'; // 服務器IP $port = 1883; // 服務器端口 $username = ''; // 用戶名 $password = ''; // 密碼 $client_id = 'sub_' . uniqid(); $mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id); $mqtt->debug = true; if(!$mqtt->connect(true, NULL, $username, $password)) { echo "鏈接失敗!\n"; exit(1); } // 訂閱列表 $topics = [ 'topic01' => ['qos' => 0, 'function' => 'procmsg'], ]; $mqtt->subscribe($topics, 0); while ($mqtt->proc()){} $mqtt->close(); // 消息處理函數 function procmsg($topic, $msg) { echo date('Y-m-d H:i:s') . ' [' . $topic . '] ' . $msg . PHP_EOL; }