mosquitto に接続された mqtt クライアントとして、ブローカーにも接続されているクライアント ID のリストを取得できますか?
6 に答える
これを実装する 1 つの方法は、クライアントがブローカーに接続するたびにトピック "status/client-id" とペイロード "1" を使用して、切断時にペイロード "0" を使用してメッセージを発行することです。
次に、サーバー (ブローカー) 側で、トピック「status/#」にサブスクライブする別のクライアントをセットアップします。このようなメッセージを受け取ったら、クライアント ID とペイロード (接続されているかどうか) をデータベースに保存します。
次に、データベースを読み取って、オンラインまたはオフラインのクライアントを正確に知ることができます。
この情報は、おそらく BASH コマンドの netstat、grep、および必要に応じて awk を介して取得できます。Mosquitto がポート 1883 を使用している場合、次のようにすると、必要なものがわかります。
須藤netstat | grep:1883
いいえ。
これについては、mosquitto メーリング リスト ( https://launchpad.net/~mqtt-users ) で議論したほうがよいかもしれません。
PHPスクリプトを使用して回避策を作成しました。これは、mosquittoブローカーを起動し、出力を読み取り、誰かが接続または切断すると、接続されたクライアントとのxml文字列をブローカーに送信します。(投稿されたコードは、ユーザーに関する詳細情報をデータベースに追加で照会するため、少し単純化されています)
<?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);
?>