由於連接到mosquitto的mqtt客戶端可以檢索也連接到代理的客戶端ID列表嗎?從MQTT客戶端獲取已連接客戶端ID的列表
回答
以及我現在創建使用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);
?>
號
它可能會在mosquitto郵件列表上可以更好地討論這個:https://launchpad.net/~mqtt-users
一個方法是讓客戶端發佈消息,主題爲「狀態/客戶端ID」和每次連接代理時有效載荷「1」,斷開連接時有效載荷「0」。
然後在服務器(代理)端,設置另一個客戶端訂閱主題「status /#」,當它收到任何類似的消息時,將client-id和payload(連接與否)存儲到數據庫中。
然後你可以讀取數據庫,以確切地知道哪個客戶端在線或離線。
如果你會讀,你會知道我只是在我自己一年之前就明白了這一點;) – 2013-03-12 10:35:44
有用的知識。你找到一個更好/更有效的方法來做到這一點? :)只是想更好地學習 – horacex 2013-03-12 13:00:21
只使用LWT而不是期望客戶端在斷開連接時發佈消息。 – 2015-10-19 20:38:02
一個很好的解決方法是讓客戶(如果可能的話)定義一個最後的遺囑(LWT)。您的服務器將訂閱LWT將發佈到的一個特殊主題,並將所有客戶端視爲在線,除非他們發佈到該主題。
通過BASH命令netstat的,grep和必要時的awk你大概可以得到這個信息。如果Mosquitto使用的是1883端口,那麼以下將告訴你我想要的東西:
sudo netstat | grep:1883
- 1. 客戶端到客戶端的連接?
- 2. 如何獲取SignalR上已連接客戶端的列表
- 3. Paho(MQTT)客戶端無法連接
- 4. 獲取客戶端IP的客戶端
- 5. [Socket.io/Node.js]獲取連接用戶到客戶端的列表
- 6. 獲取連接的客戶端數
- 7. 從MVC中的Controller類獲取客戶端的連接Id
- 8. 連接客戶端
- 9. 具有相同客戶端ID的MQTT連接
- 10. j2ME的MQTT客戶端
- 11. Mqtt客戶端如何知道另一個客戶端是否連接
- 12. 如何從Url客戶端獲取Id?
- 13. C#從Google Analytics獲取客戶端ID
- 14. ZeroMQ獲取客戶端連接信息
- 15. 問題與mqtt客戶端
- 16. Android mqtt(mosquitto)somtime客戶端(客戶端ID)上的套接字錯誤,斷開連接
- 17. 連接Arduino MQTT客戶端和Node JS MQTT服務器
- 18. 從客戶端獲取ASP下拉列表中的ID
- 19. 從更改列表中取消鏈接p4客戶端並刪除客戶端
- 20. 如何獲取連接的客戶端列表/ sails/socket?
- 21. 獲取wcf服務的連接客戶端列表
- 22. 發送更新的客戶端列表到所有連接的客戶端
- 23. 獲取接入令牌從客戶端
- 24. 使用連接到客戶端的ObjectInputStream和ObjectOutputStream從客戶端讀取數據
- 25. 獲取連接的客戶端IP連接包的連接
- 26. 從Sharepoint客戶端獲取weburl客戶端對象模型
- 27. 如何在OAuth2中從MVC5獲取客戶端ID和客戶端密鑰?
- 28. 使用WebSockets獲取客戶端列表
- 29. 連接到Apache Zookeeper的Apache Kafka客戶端客戶端:EndOfStreamException
- 30. WinSock客戶端連接
與我的非常相似。我用另一個客戶端來管理「status/client-id」主題。 – horacex 2013-03-12 13:01:55