JAvaはMQTTクライアントの状態(オンライン、オフライン)をどのように傍受するか
1280 ワード
一、業務シーン
多くの友人がMQTTクライアントの状態(オンライン、オフライン)をどのように知るか、あるいは収集器の状態を監視するかを相談しています.
実はこれはMQTTプロトコルの中ですでにシステムのテーマを提供して、MQTTサービス側はクライアントのいかなる情況を知ることができて、例えば:いつオンラインとオフラインです.
二、解決策
$SYS/brokers/${node}/clients/${clientid}/connected:オンラインイベント.クライアントがオンラインになると、そのトピック(Topic)にメッセージが発行されます.
$SYS/brokers/${node}/clients/${clientid}/disconnected:オフラインイベント.クライアントがオフラインになると、そのトピック(Topic)にメッセージが発行されます.
もちろん開発時に2つのトピックを購読するのは面倒ですが、ここではトピックワイルドカードモードで1つのトピックを直接購読することができます:$SYS/brokers/+/clients/#
これは便利ですが、コールバック関数でTopicトピックの区別を行う必要があります.たとえば、次のようにします.
多くの友人がMQTTクライアントの状態(オンライン、オフライン)をどのように知るか、あるいは収集器の状態を監視するかを相談しています.
実はこれはMQTTプロトコルの中ですでにシステムのテーマを提供して、MQTTサービス側はクライアントのいかなる情況を知ることができて、例えば:いつオンラインとオフラインです.
二、解決策
$SYS/brokers/${node}/clients/${clientid}/connected:オンラインイベント.クライアントがオンラインになると、そのトピック(Topic)にメッセージが発行されます.
$SYS/brokers/${node}/clients/${clientid}/disconnected:オフラインイベント.クライアントがオフラインになると、そのトピック(Topic)にメッセージが発行されます.
もちろん開発時に2つのトピックを購読するのは面倒ですが、ここではトピックワイルドカードモードで1つのトピックを直接購読することができます:$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);
}
}