MQTT介紹:http://mqtt.org
服務器端
https://mosquitto.org/download/
PHP客戶端
https://github.com/bluerhinos/phpMQTT
MQTT QOS等級訂閱和發布的關系
https://www.jianshu.com/p/ebe4b2c0461d
qos = 0:僅發一次,不管是否能收到
qos = 1:沒返回一直發,可能有重復接收(接收到消息可能未傳遞給客戶端)
qos = 2:保證必須收到,並且不重復(使用MSG_ID保證不重復接收)
也就是服務器只會按pub和sub兩者qos等級最小的那個qos規則來發送消息。
pub時指定的qos是服務器肯定按此規則接收,但是最終訂閱者不一定。
sub時指定的qos表示訂閱者可以接收的最高消息等級,也就是可能收到更低等級的消息。
遇到的問題
1. qos=2 一直沒有測試成功,mosquitto 已經收到客戶端的消息,但訂閱端就是接收不到。
2. 當有多個訂閱端時,又是后收到的消息居然會不全,前面會有亂碼出現。
3. 沒有HTTP簡單直接;感覺沒有HTTP可靠通用;
消息發布
<?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"; }
消息訂閱
<?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; }