PHP MQTT 實踐

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;
}
相關文章
相關標籤/搜索