Solución:
una forma de implementar esto es dejar que el cliente publique un mensaje con el tema “status / client-id” y la carga útil “1” cada vez que se conecta al corredor, y con la carga útil “0” cuando se desconecta.
Luego, en el lado del servidor (corredor), configure otro cliente, suscríbase al tema “estado / #”, cuando reciba un mensaje como este, almacene la identificación del cliente y la carga útil (conectada o no) en la base de datos.
luego puede leer la base de datos para saber exactamente qué cliente está conectado o desconectado.
método I: manejar en la lógica del cliente
como dice @ user1048839, use el cliente LWT
& publicar mensajes en línea, mantener el estado del cliente en un tema personalizado. subíndice este tema y mantenga la lista de clientes.
si pub retain
msg, una vez sub obtendrá la lista de clientes.
método II: cambiar el código del corredor mosquitto
el código oficial no es compatible con online_list,
así que parcheé mosquitto 1.5.4, agregué 2 temas de sistema personalizados:
1. lista en línea
mosquitto_sub -i DDD -v -t '$SYS/broker/chen_list'
$SYS/broker/chen_list
0 - CLOUD0_19108
1 - EEE
2 - DDD
2. evento en línea / fuera de línea
mosquitto_sub -i DDD -v -t '$SYS/broker/chen_state/#'
$SYS/broker/chen_state/DDD 1
$SYS/broker/chen_state/EEE 1
$SYS/broker/chen_state/CLOUD0_19108 1
$SYS/broker/chen_state/EEE 0
$SYS/broker/chen_state/EEE 1
// si pub retain
msg, sub este tema puede obtener el estado en línea de todos los clientes (en carga útil).
probar el código fuente en github:
4-lista-en-línea
5-evento-online
No.
Sería mejor discutir esto en la lista de correo de mosquitto: https://launchpad.net/~mqtt-users