设备上下线订阅
This commit is contained in:
parent
5ef02659e1
commit
eb904c65aa
@ -94,7 +94,7 @@ public class MqttHandler extends ChannelInboundHandlerAdapter {
|
|||||||
processReceivedMessage(topic, content);
|
processReceivedMessage(topic, content);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("处理MQTT消息异常,主题: {}", topic, e);
|
log.error("处理MQTT消息异常,主题: {}", topic, e);
|
||||||
}finally {
|
} finally {
|
||||||
payload.release();
|
payload.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,6 +134,19 @@ public class MqttHandler extends ChannelInboundHandlerAdapter {
|
|||||||
} else if (topic.startsWith("control/")) {
|
} else if (topic.startsWith("control/")) {
|
||||||
handleControlCommand(topic, content);
|
handleControlCommand(topic, content);
|
||||||
}
|
}
|
||||||
|
if (topic.startsWith("$SYS/brokers/")) {
|
||||||
|
boolean isOnline = isConnectedEvent(topic);
|
||||||
|
String clientId = objectMapper.readValue(content, ObjectNode.class).get("clientid").asText();
|
||||||
|
if (isOnline) {
|
||||||
|
log.info("设备上线: {}", clientId);
|
||||||
|
} else {
|
||||||
|
log.info("设备下线: {}", clientId);
|
||||||
|
}
|
||||||
|
ObjectNode jsonNode = objectMapper.createObjectNode();
|
||||||
|
jsonNode.put("deviceId", clientId);
|
||||||
|
jsonNode.put("isOnline", isOnline);
|
||||||
|
kafkaProducer.send("device_online", objectMapper.writeValueAsString(jsonNode));
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("处理MQTT消息业务逻辑异常", e);
|
log.error("处理MQTT消息业务逻辑异常", e);
|
||||||
}
|
}
|
||||||
@ -196,4 +209,23 @@ public class MqttHandler extends ChannelInboundHandlerAdapter {
|
|||||||
throw new RuntimeException("Failed to process JSON", e);
|
throw new RuntimeException("Failed to process JSON", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断MQTT主题是否为上线事件
|
||||||
|
*
|
||||||
|
* @param topic 主题字符串
|
||||||
|
* @return true: 上线事件, false: 下线事件(若主题无法识别则返回false)
|
||||||
|
*/
|
||||||
|
private boolean isConnectedEvent(String topic) {
|
||||||
|
if (topic == null) return false;
|
||||||
|
if (topic.endsWith("/connected")) {
|
||||||
|
return true;
|
||||||
|
} else if (topic.endsWith("/disconnected")) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// 既不是connected也不是disconnected,可根据需要处理(例如抛异常或记录警告)
|
||||||
|
log.warn("未知的上下线主题格式: {}", topic);
|
||||||
|
return false; // 默认返回false(下线)或根据业务决定
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ mqtt:
|
|||||||
port: 1883
|
port: 1883
|
||||||
username: admin
|
username: admin
|
||||||
password: admin970529
|
password: admin970529
|
||||||
auto-subscribe-topics: ecu/rpt/#,ecu/rsp/#
|
auto-subscribe-topics: ecu/rpt/#,ecu/rsp/#,$SYS/brokers/+/clients/+/connected,$SYS/brokers/+/clients/+/disconnected
|
||||||
timeout: 10 # 减少超时时间以便更快失败
|
timeout: 10 # 减少超时时间以便更快失败
|
||||||
clean-session: true
|
clean-session: true
|
||||||
keep-alive: 60
|
keep-alive: 60
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user