一、業務場景
好多朋友在諮詢如何得知(監測)MQTT客戶端狀態(在線、離線),或者可以說是監測採集器狀態。
其實這個在MQTT協議中已經給出系統主題,MQTT服務端可以知道客戶端的任何情況,比如:什麼時候上線和下線。
二、解決方案
$SYS/brokers/${node}/clients/${clientid}/connected:上線事件。當某客戶端上線時,會向該主題(Topic)發佈消息
$SYS/brokers/${node}/clients/${clientid}/disconnected:掉線事件。當某客戶端掉線時,會向該主題(Topic)發佈消息
當然在開發的時候我們訂閱兩個主題比較麻煩,在這裏我們可以採用主題通配符模式直接訂閱一個主題即可:$SYS/brokers/+/clients/#
這樣比較方便,只不過需要我們在回調函數中進行Topic主題的區分就可以了,例如:
/**
* subscribe後得到的消息會執行到這裏面
*/
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
String msg = new String(message.getPayload());
try {
JSONObject jsonObject = JSON.parseObject(msg);
String clientId = String.valueOf(jsonObject.get("clientid"));
if (topic.endsWith("disconnected")) {
log.info("客戶端已掉線:{}",clientId);
} else {
log.info("客戶端已上線:{}",clientId);
}
} catch (JSONException e) {
log.error("JSON Format Parsing Exception : {}", msg);
}
}