2012-03-19 97 views

回答

0

以及我現在創建使用PHP腳本一個解決方法:啓動mosquitto經紀人,讀取輸出,如果有人連接或斷開它將連接的客戶端的xml字符串發送到代理。 (張貼的代碼是有點簡化爲我adiddionally查詢數據庫中有關用戶的詳細信息)來實現這個

<?php 
require('SAM/php_sam.php'); 

if (!$handle = popen('mosquitto 2>&1', 'r')) { 

    die('could not start mosquitto'); 
} 

function usersToXML($users) { 

    $xml = '<?xml version="1.0"?><userlist>'; 
    foreach($users as $user) { 

     $xml .= '<user>' . 
      '<id><![CDATA['. $user->id .']]></id>' . 
      '</user>'; 
    } 

    $xml .= '</userlist>'; 
    return $xml; 
} 

function updateBroadcast($users) { 

    sleep(1); 
    ob_start(); 
    $conn = new SAMConnection(); 
    $conn->Connect(SAM_MQTT, array(
     SAM_HOST => '127.0.0.1', 
     SAM_PORT => 1883 
    )); 

    $conn->Send('topic://broadcast', (object)array('body' => usersToXML($users))); 
    $conn->Disconnect(); 
    ob_end_clean(); 
} 

while($line = fread($handle, 2096)) { 

    echo $line; 
    if (preg_match('/New client connected from .+ as user_(\d+)./', $line, $regs)) { 

     $user = (object)array('id' => $regs[1]); 
     $connectedUsers[$user->id] = $user; 
     updateBroadcast($connectedUsers); 

    } else if (preg_match('/Received DISCONNECT from user_(\d+)/', $line, $regs) || 
     preg_match('/Client user_(\d+) has exceeded timeout, disconnecting./', $line, $regs) || 
     preg_match('/Socket read error on client user_(\d+), disconnecting./', $line, $regs)) { 

     if (isset($connectedUsers[$regs[1]])) { 

      unset($connectedUsers[$regs[1]]); 
      updateBroadcast($connectedUsers); 
     } 
    } 
} 

pclose($handle); 
?> 
+1

與我的非常相似。我用另一個客戶端來管理「status/client-id」主題。 – horacex 2013-03-12 13:01:55

4

一個方法是讓客戶端發佈消息,主題爲「狀態/客戶端ID」和每次連接代理時有效載荷「1」,斷開連接時有效載荷「0」。

然後在服務器(代理)端,設置另一個客戶端訂閱主題「status /#」,當它收到任何類似的消息時,將client-id和payload(連接與否)存儲到數據庫中。

然後你可以讀取數據庫,以確切地知道哪個客戶端在線或離線。

+0

如果你會讀,你會知道我只是在我自己一年之前就明白了這一點;) – 2013-03-12 10:35:44

+0

有用的知識。你找到一個更好/更有效的方法來做到這一點? :)只是想更好地學習 – horacex 2013-03-12 13:00:21

+1

只使用LWT而不是期望客戶端在斷開連接時發佈消息。 – 2015-10-19 20:38:02

1

通過BASH命令netstat的,grep和必要時的awk你大概可以得到這個信息。如果Mosquitto使用的是1883端口,那麼以下將告訴你我想要的東西:

sudo netstat | grep:1883

相關問題