|
@@ -1,13 +1,13 @@
|
|
package com.hfln.device.infrastructure.mqtt.subscriber;
|
|
package com.hfln.device.infrastructure.mqtt.subscriber;
|
|
|
|
|
|
import com.hfln.device.domain.port.DeviceEventPort;
|
|
import com.hfln.device.domain.port.DeviceEventPort;
|
|
-import cn.hfln.framework.mqtt.annotation.MqttSubscriber;
|
|
|
|
-import com.hfln.device.common.constant.mqtt.topic.MqttTopics;
|
|
|
|
|
|
+// import cn.hfln.framework.mqtt.annotation.MqttSubscriber; - 已禁�?import com.hfln.device.common.constant.mqtt.topic.MqttTopics;
|
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
import com.hfln.device.common.util.JsonUtil;
|
|
import com.hfln.device.common.util.JsonUtil;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.messaging.Message;
|
|
import org.springframework.messaging.Message;
|
|
-import org.springframework.stereotype.Component;
|
|
|
|
|
|
+// import org.springframework.stereotype.Component; - 已禁用
|
|
|
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
@@ -17,37 +17,34 @@ import java.util.regex.Pattern;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 设备消息订阅处理器
|
|
|
|
|
|
+ * 设备消息订阅处理�?- 已替换为Spring Integration MQTT方式
|
|
* 处理设备相关的MQTT消息
|
|
* 处理设备相关的MQTT消息
|
|
* 严格按照Python版本mqtt_recv.py中的deal_dev_xxx方法实现
|
|
* 严格按照Python版本mqtt_recv.py中的deal_dev_xxx方法实现
|
|
|
|
+ *
|
|
|
|
+ * @deprecated 已被 DeviceMessageHandler 替代,使用Spring Integration MQTT
|
|
*/
|
|
*/
|
|
-@Component
|
|
|
|
|
|
+// @Component - 禁用此组件,使用新的DeviceMessageHandler
|
|
@Slf4j
|
|
@Slf4j
|
|
public class DeviceMessageSubscriber {
|
|
public class DeviceMessageSubscriber {
|
|
|
|
|
|
private static final Pattern DEV_ID_PATTERN = Pattern.compile("^/dev/([^/]+)/.*$");
|
|
private static final Pattern DEV_ID_PATTERN = Pattern.compile("^/dev/([^/]+)/.*$");
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
|
+ @Qualifier("deviceEventServiceImpl")
|
|
protected DeviceEventPort deviceEventPort;
|
|
protected DeviceEventPort deviceEventPort;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 处理设备登录消息
|
|
* 处理设备登录消息
|
|
* 对应Python版本的deal_dev_login方法
|
|
* 对应Python版本的deal_dev_login方法
|
|
- * 主题:/dev/{dev_id}/login
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/login
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析payload获取device_info、ext_region、sensor_location
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析payload获取device_info、ext_region、sensor_location
|
|
* 2. 提取设备基本信息:deviceid、firmware、blu_ver、device_type、device_ip
|
|
* 2. 提取设备基本信息:deviceid、firmware、blu_ver、device_type、device_ip
|
|
* 3. 从ext_region.base提取跟踪区域坐标:x1,x2,y1,y2,z1,z2
|
|
* 3. 从ext_region.base提取跟踪区域坐标:x1,x2,y1,y2,z1,z2
|
|
* 4. 从sensor_location提取安装高度:z_cm
|
|
* 4. 从sensor_location提取安装高度:z_cm
|
|
- * 5. 检查设备是否已注册:
|
|
|
|
- * - 已注册且在线:直接发送登录响应,不发送状态消息(避免重复上线)
|
|
|
|
- * - 已注册但离线:设置在线状态,更新保活时间,发送登录响应和状态消息
|
|
|
|
- * - 未注册:创建新设备,入库,发送登录响应和状态消息
|
|
|
|
- * 6. 数据库操作:更新在线状态到数据库
|
|
|
|
- * 7. MQTT消息:发送登录响应 + 状态变更消息(仅新设备或重新上线)
|
|
|
|
|
|
+ * 5. 检查设备是否已注册�? * - 已注册且在线:直接发送登录响应,不发送状态消息(避免重复上线�? * - 已注册但离线:设置在线状态,更新保活时间,发送登录响应和状态消�? * - 未注册:创建新设备,入库,发送登录响应和状态消�? * 6. 数据库操作:更新在线状态到数据�? * 7. MQTT消息:发送登录响�?+ 状态变更消息(仅新设备或重新上线)
|
|
*/
|
|
*/
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_LOGIN, qos = 1, desc = "设备登录")
|
|
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_LOGIN, qos = 1, desc = "设备登录")
|
|
public void handleDeviceLogin(String topic, Message<?> message) {
|
|
public void handleDeviceLogin(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
log.info("Received device login message: {}", topic);
|
|
log.info("Received device login message: {}", topic);
|
|
@@ -74,26 +71,18 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设备上报设备信息
|
|
* 处理设备上报设备信息
|
|
* 对应Python版本的deal_report_device_info方法
|
|
* 对应Python版本的deal_report_device_info方法
|
|
- * 主题:/dev/{dev_id}/report_device_info
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/report_device_info
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析设备信息payload,验证必要字段:
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析设备信息payload,验证必要字段:
|
|
* - deviceid:设备ID
|
|
* - deviceid:设备ID
|
|
- * - device_type:设备类型
|
|
|
|
- * - firmware:固件版本
|
|
|
|
- * - device_ip:设备IP地址
|
|
|
|
- * 2. 检查设备是否已注册:
|
|
|
|
- * - 已注册设备:更新设备信息,如果设备离线则重新上线
|
|
|
|
|
|
+ * - device_type:设备类�? * - firmware:固件版�? * - device_ip:设备IP地址
|
|
|
|
+ * 2. 检查设备是否已注册�? * - 已注册设备:更新设备信息,如果设备离线则重新上线
|
|
* - 未注册设备:创建新设备并注册上线
|
|
* - 未注册设备:创建新设备并注册上线
|
|
* 3. 更新设备信息到缓存和数据库:
|
|
* 3. 更新设备信息到缓存和数据库:
|
|
- * - 设备类型、软件版本、IP地址等
|
|
|
|
- * 4. 发送设备状态和信息更新消息:
|
|
|
|
- * - 登录响应消息
|
|
|
|
- * - 设备状态变更消息
|
|
|
|
- * - 设备信息更新消息
|
|
|
|
- * 5. 此方法主要用于设备信息同步和状态管理
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_REP_DEV_INFO, qos = 1, desc = "设备上报设备信息")
|
|
|
|
|
|
+ * - 设备类型、软件版本、IP地址�? * 4. 发送设备状态和信息更新消息�? * - 登录响应消息
|
|
|
|
+ * - 设备状态变更消�? * - 设备信息更新消息
|
|
|
|
+ * 5. 此方法主要用于设备信息同步和状态管�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_REP_DEV_INFO, qos = 1, desc = "设备上报设备信息")
|
|
public void handleDeviceReportDeviceInfo(String topic, Message<?> message) {
|
|
public void handleDeviceReportDeviceInfo(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -110,8 +99,7 @@ public class DeviceMessageSubscriber {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- // 委托给应用层服务处理(可以复用登录逻辑或创建专门的设备信息处理方法)
|
|
|
|
- deviceEventPort.handleDeviceLogin(deviceId, messageData, messageData);
|
|
|
|
|
|
+ // 委托给应用层服务处理(可以复用登录逻辑或创建专门的设备信息处理方法�? deviceEventPort.handleDeviceLogin(deviceId, messageData, messageData);
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
log.error("Error handling device info report: {}", e.getMessage(), e);
|
|
log.error("Error handling device info report: {}", e.getMessage(), e);
|
|
@@ -121,23 +109,13 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设备保活消息
|
|
* 处理设备保活消息
|
|
* 对应Python版本的deal_dev_keepalive方法
|
|
* 对应Python版本的deal_dev_keepalive方法
|
|
- * 主题:/dev/{dev_id}/keepalive
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/keepalive
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 检查设备是否已注册和在线状态
|
|
|
|
- * 2. 检查调试参数是否拒绝心跳(调试模式下可禁用保活)
|
|
|
|
- * 3. 更新设备的最后保活时间戳(last_keepalive_time)
|
|
|
|
- * 4. 如果设备当前离线状态,则:
|
|
|
|
- * - 设置设备为在线状态
|
|
|
|
- * - 更新数据库状态
|
|
|
|
- * - 发送设备状态变更消息到MQTT
|
|
|
|
|
|
+ * Python处理流程�? * 1. 检查设备是否已注册和在线状�? * 2. 检查调试参数是否拒绝心跳(调试模式下可禁用保活�? * 3. 更新设备的最后保活时间戳(last_keepalive_time�? * 4. 如果设备当前离线状态,则:
|
|
|
|
+ * - 设置设备为在线状�? * - 更新数据库状�? * - 发送设备状态变更消息到MQTT
|
|
* 5. 根据设备状态发送不同的响应码:
|
|
* 5. 根据设备状态发送不同的响应码:
|
|
- * - 在线设备:返回成功码(0)
|
|
|
|
- * - 离线设备:返回禁止码(2)
|
|
|
|
- * - 未注册设备:返回未授权码(1)
|
|
|
|
- * 6. 只发送心跳响应,不发送其他业务消息
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_KEEPALIVE, qos = 1, desc = "设备保活")
|
|
|
|
|
|
+ * - 在线设备:返回成功码�?�? * - 离线设备:返回禁止码�?�? * - 未注册设备:返回未授权码�?�? * 6. 只发送心跳响应,不发送其他业务消�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_KEEPALIVE, qos = 1, desc = "设备保活")
|
|
public void handleDeviceKeepAlive(String topic, Message<?> message) {
|
|
public void handleDeviceKeepAlive(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -155,21 +133,15 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设备上报设备参数
|
|
* 处理设备上报设备参数
|
|
* 对应Python版本的deal_report_device_param方法
|
|
* 对应Python版本的deal_report_device_param方法
|
|
- * 主题:/dev/{dev_id}/report_device_param
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/report_device_param
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析消息数据,获取设备参数信息
|
|
|
|
- * 2. 验证参数格式和合法性(参数名、数据类型、取值范围)
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析消息数据,获取设备参数信�? * 2. 验证参数格式和合法性(参数名、数据类型、取值范围)
|
|
* 3. 更新设备参数配置到数据库(device_params表)
|
|
* 3. 更新设备参数配置到数据库(device_params表)
|
|
- * 4. 记录参数变更历史到日志系统
|
|
|
|
- * 5. 发送参数更新确认消息到设备
|
|
|
|
- * 6. 如果是关键参数变更(如检测区域、灵敏度),触发相关业务逻辑:
|
|
|
|
- * - 更新告警配置
|
|
|
|
- * - 重新计算检测阈值
|
|
|
|
- * - 通知其他子系统参数变更
|
|
|
|
- * 7. 缓存参数到Redis以提高查询性能
|
|
|
|
|
|
+ * 4. 记录参数变更历史到日志系�? * 5. 发送参数更新确认消息到设备
|
|
|
|
+ * 6. 如果是关键参数变更(如检测区域、灵敏度),触发相关业务逻辑�? * - 更新告警配置
|
|
|
|
+ * - 重新计算检测阈�? * - 通知其他子系统参数变�? * 7. 缓存参数到Redis以提高查询性能
|
|
*/
|
|
*/
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_REP_DEV_PARAM, qos = 1, desc = "设备上报设备参数")
|
|
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_REP_DEV_PARAM, qos = 1, desc = "设备上报设备参数")
|
|
public void handleDeviceReportDeviceParam(String topic, Message<?> message) {
|
|
public void handleDeviceReportDeviceParam(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -190,25 +162,14 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设备实时数据
|
|
* 处理设备实时数据
|
|
* 对应Python版本的deal_dsp_data方法
|
|
* 对应Python版本的deal_dsp_data方法
|
|
- * 主题:/dev/{dev_id}/dsp_data
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/dsp_data
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析DSP(数字信号处理)实时数据包
|
|
|
|
- * 2. 提取目标位置、姿态、生命体征等关键信息:
|
|
|
|
- * - pose:姿态信息(站立、坐着、躺下等)
|
|
|
|
- * - targets:目标位置坐标列表
|
|
|
|
- * - vital_signs:生命体征数据(心率、呼吸等)
|
|
|
|
- * 3. 执行数据质量检查和异常值过滤
|
|
|
|
- * 4. 更新设备实时状态缓存(Redis)
|
|
|
|
- * 5. 触发实时告警检测逻辑:
|
|
|
|
- * - 跌倒检测算法
|
|
|
|
- * - 异常行为识别
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析DSP(数字信号处理)实时数据�? * 2. 提取目标位置、姿态、生命体征等关键信息�? * - pose:姿态信息(站立、坐着、躺下等�? * - targets:目标位置坐标列�? * - vital_signs:生命体征数据(心率、呼吸等�? * 3. 执行数据质量检查和异常值过�? * 4. 更新设备实时状态缓存(Redis�? * 5. 触发实时告警检测逻辑�? * - 跌倒检测算�? * - 异常行为识别
|
|
* - 生命体征异常告警
|
|
* - 生命体征异常告警
|
|
* 6. 发送实时位置姿态消息到指定MQTT主题
|
|
* 6. 发送实时位置姿态消息到指定MQTT主题
|
|
* 7. 记录关键数据到时序数据库(InfluxDB,如有配置)
|
|
* 7. 记录关键数据到时序数据库(InfluxDB,如有配置)
|
|
- * 8. QoS设置为0,允许部分数据丢失以保证实时性
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = "/dev/+/dsp_data", qos = 0, desc = "设备实时数据")
|
|
|
|
|
|
+ * 8. QoS设置�?,允许部分数据丢失以保证实时�? */
|
|
|
|
+ // @MqttSubscriber(topic = "/dev/+/dsp_data", qos = 0, desc = "设备实时数据")
|
|
public void handleDeviceDspData(String topic, Message<?> message) {
|
|
public void handleDeviceDspData(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -229,26 +190,18 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设备点云数据
|
|
* 处理设备点云数据
|
|
* 对应Python版本的deal_cloudpoint方法
|
|
* 对应Python版本的deal_cloudpoint方法
|
|
- * 主题:/dev/{dev_id}/cloudpoint
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/cloudpoint
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析点云数据(cloud_points)和目标跟踪数据(tracker_targets)
|
|
|
|
- * 2. 对点云数据进行格式验证和异常值过滤:
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析点云数据(cloud_points)和目标跟踪数据(tracker_targets�? * 2. 对点云数据进行格式验证和异常值过滤:
|
|
* - 检查坐标范围是否在传感器检测区域内
|
|
* - 检查坐标范围是否在传感器检测区域内
|
|
* - 过滤噪点和无效数据点
|
|
* - 过滤噪点和无效数据点
|
|
- * 3. 计算目标在跟踪区域内的精确位置坐标
|
|
|
|
- * 4. 执行目标识别和分类算法:
|
|
|
|
- * - 区分人体目标和环境物体
|
|
|
|
- * - 计算目标尺寸和形状特征
|
|
|
|
- * 5. 更新目标跟踪状态和轨迹数据:
|
|
|
|
- * - 关联历史轨迹
|
|
|
|
|
|
+ * 3. 计算目标在跟踪区域内的精确位置坐�? * 4. 执行目标识别和分类算法:
|
|
|
|
+ * - 区分人体目标和环境物�? * - 计算目标尺寸和形状特�? * 5. 更新目标跟踪状态和轨迹数据�? * - 关联历史轨迹
|
|
* - 预测目标运动趋势
|
|
* - 预测目标运动趋势
|
|
* 6. 检测目标的进入/离开区域事件
|
|
* 6. 检测目标的进入/离开区域事件
|
|
* 7. 发送实时位置姿态消息到MQTT主题
|
|
* 7. 发送实时位置姿态消息到MQTT主题
|
|
- * 8. 记录轨迹数据到数据库(可选,用于行为分析)
|
|
|
|
- * 9. QoS设置为0,优先保证数据传输的实时性
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_CLOUDPOINT, qos = 0, desc = "设备点云数据")
|
|
|
|
|
|
+ * 8. 记录轨迹数据到数据库(可选,用于行为分析�? * 9. QoS设置�?,优先保证数据传输的实时�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_CLOUDPOINT, qos = 0, desc = "设备点云数据")
|
|
public void handleDeviceCloudPoint(String topic, Message<?> message) {
|
|
public void handleDeviceCloudPoint(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -290,33 +243,20 @@ public class DeviceMessageSubscriber {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 处理设备上报跌倒事件
|
|
|
|
- * 对应Python版本的deal_report_falling_event方法
|
|
|
|
- * 主题:/dev/{dev_id}/report_falling_event
|
|
|
|
|
|
+ * 处理设备上报跌倒事�? * 对应Python版本的deal_report_falling_event方法
|
|
|
|
+ * 主题�?dev/{dev_id}/report_falling_event
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析跌倒事件数据,验证必要字段:
|
|
|
|
- * - timestamp:事件发生时间戳
|
|
|
|
- * - type:事件类型标识
|
|
|
|
- * - event:具体事件描述
|
|
|
|
- * - fallLocX/Y/Z:跌倒位置坐标(厘米单位)
|
|
|
|
- * - tarHeightEst:目标高度估计值
|
|
|
|
- * 2. 坐标单位转换:厘米转换为米(除以100)
|
|
|
|
- * 3. 验证跌倒位置是否在设备检测区域内
|
|
|
|
- * 4. 检查告警间隔限制,防止重复告警:
|
|
|
|
- * - 检查最近告警时间
|
|
|
|
- * - 应用告警间隔配置
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析跌倒事件数据,验证必要字段�? * - timestamp:事件发生时间戳
|
|
|
|
+ * - type:事件类型标�? * - event:具体事件描�? * - fallLocX/Y/Z:跌倒位置坐标(厘米单位�? * - tarHeightEst:目标高度估计�? * 2. 坐标单位转换:厘米转换为米(除以100�? * 3. 验证跌倒位置是否在设备检测区域内
|
|
|
|
+ * 4. 检查告警间隔限制,防止重复告警�? * - 检查最近告警时�? * - 应用告警间隔配置
|
|
* 5. 创建跌倒告警记录:
|
|
* 5. 创建跌倒告警记录:
|
|
* - 记录到数据库
|
|
* - 记录到数据库
|
|
- * - 设置告警级别和状态
|
|
|
|
- * 6. 发送告警通知:
|
|
|
|
- * - MQTT告警消息
|
|
|
|
|
|
+ * - 设置告警级别和状�? * 6. 发送告警通知�? * - MQTT告警消息
|
|
* - 短信/邮件通知(根据配置)
|
|
* - 短信/邮件通知(根据配置)
|
|
* - 推送到监控中心
|
|
* - 推送到监控中心
|
|
* 7. 更新设备状态和统计信息
|
|
* 7. 更新设备状态和统计信息
|
|
- * 8. QoS设置为1,确保重要告警消息可靠传输
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_REP_FALL_EVENT, qos = 1, desc = "设备上报跌倒事件")
|
|
|
|
|
|
+ * 8. QoS设置�?,确保重要告警消息可靠传�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_REP_FALL_EVENT, qos = 1, desc = "设备上报跌倒事�?)
|
|
public void handleDeviceReportFallEvent(String topic, Message<?> message) {
|
|
public void handleDeviceReportFallEvent(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -338,7 +278,7 @@ public class DeviceMessageSubscriber {
|
|
Long timestamp = ((Number) messageData.get("timestamp")).longValue();
|
|
Long timestamp = ((Number) messageData.get("timestamp")).longValue();
|
|
String type = (String) messageData.get("type");
|
|
String type = (String) messageData.get("type");
|
|
String event = (String) messageData.get("event");
|
|
String event = (String) messageData.get("event");
|
|
- // 注意:Python版本中坐标单位是厘米,需要除以100转换为米
|
|
|
|
|
|
+ // 注意:Python版本中坐标单位是厘米,需要除�?00转换为米
|
|
Float fallLocX = ((Number) messageData.get("fallLocX")).floatValue() / 100.0f;
|
|
Float fallLocX = ((Number) messageData.get("fallLocX")).floatValue() / 100.0f;
|
|
Float fallLocY = ((Number) messageData.get("fallLocY")).floatValue() / 100.0f;
|
|
Float fallLocY = ((Number) messageData.get("fallLocY")).floatValue() / 100.0f;
|
|
Float fallLocZ = ((Number) messageData.get("fallLocZ")).floatValue() / 100.0f;
|
|
Float fallLocZ = ((Number) messageData.get("fallLocZ")).floatValue() / 100.0f;
|
|
@@ -356,32 +296,19 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设备上报存在事件
|
|
* 处理设备上报存在事件
|
|
* 对应Python版本的deal_report_presence_event方法
|
|
* 对应Python版本的deal_report_presence_event方法
|
|
- * 主题:/dev/{dev_id}/report_presence_event
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/report_presence_event
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析存在事件数据,验证必要字段:
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析存在事件数据,验证必要字段:
|
|
* - timestamp:事件发生时间戳
|
|
* - timestamp:事件发生时间戳
|
|
* - type:事件类型(进入/离开/持续存在等)
|
|
* - type:事件类型(进入/离开/持续存在等)
|
|
- * - event:具体事件描述
|
|
|
|
- * 2. 根据事件类型执行不同的业务逻辑:
|
|
|
|
- * - "enter":目标进入检测区域
|
|
|
|
- * - "leave":目标离开检测区域
|
|
|
|
- * - "stay":目标持续停留
|
|
|
|
- * 3. 更新目标存在状态和停留时间:
|
|
|
|
- * - 计算停留持续时间
|
|
|
|
- * - 更新区域占用状态
|
|
|
|
- * 4. 触发相关业务规则:
|
|
|
|
- * - 长时间停留告警
|
|
|
|
- * - 异常进出记录
|
|
|
|
|
|
+ * - event:具体事件描�? * 2. 根据事件类型执行不同的业务逻辑�? * - "enter":目标进入检测区�? * - "leave":目标离开检测区�? * - "stay":目标持续停�? * 3. 更新目标存在状态和停留时间�? * - 计算停留持续时间
|
|
|
|
+ * - 更新区域占用状�? * 4. 触发相关业务规则�? * - 长时间停留告�? * - 异常进出记录
|
|
* - 区域活动统计
|
|
* - 区域活动统计
|
|
- * 5. 发送事件消息到相关系统:
|
|
|
|
- * - 实时监控面板
|
|
|
|
|
|
+ * 5. 发送事件消息到相关系统�? * - 实时监控面板
|
|
* - 行为分析模块
|
|
* - 行为分析模块
|
|
* - 统计分析系统
|
|
* - 统计分析系统
|
|
- * 6. 记录事件到数据库供后续分析
|
|
|
|
- * 7. QoS设置为1,确保重要事件消息可靠传输
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_REP_PRES_EVENT, qos = 1, desc = "设备上报存在事件")
|
|
|
|
|
|
+ * 6. 记录事件到数据库供后续分�? * 7. QoS设置�?,确保重要事件消息可靠传�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_REP_PRES_EVENT, qos = 1, desc = "设备上报存在事件")
|
|
public void handleDeviceReportPresenceEvent(String topic, Message<?> message) {
|
|
public void handleDeviceReportPresenceEvent(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -413,30 +340,17 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理设置调试参数
|
|
* 处理设置调试参数
|
|
* 对应Python版本的deal_set_debug_param方法
|
|
* 对应Python版本的deal_set_debug_param方法
|
|
- * 主题:/dev/{dev_id}/set_debug_param
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/set_debug_param
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析调试参数设置请求,验证参数合法性
|
|
|
|
- * 2. 支持的调试参数类型:
|
|
|
|
- * - reject_keepalive:拒绝心跳保活
|
|
|
|
- * - log_level:日志级别设置
|
|
|
|
- * - detection_sensitivity:检测灵敏度
|
|
|
|
- * - filter_params:数据过滤参数
|
|
|
|
- * 3. 验证参数权限和安全性:
|
|
|
|
- * - 检查操作权限
|
|
|
|
- * - 验证参数值范围
|
|
|
|
- * 4. 更新设备调试配置:
|
|
|
|
- * - 更新内存中的调试状态
|
|
|
|
- * - 同步到Redis缓存
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析调试参数设置请求,验证参数合法�? * 2. 支持的调试参数类型:
|
|
|
|
+ * - reject_keepalive:拒绝心跳保�? * - log_level:日志级别设�? * - detection_sensitivity:检测灵敏度
|
|
|
|
+ * - filter_params:数据过滤参�? * 3. 验证参数权限和安全性:
|
|
|
|
+ * - 检查操作权�? * - 验证参数值范�? * 4. 更新设备调试配置�? * - 更新内存中的调试状�? * - 同步到Redis缓存
|
|
* - 记录到数据库(debug_configs表)
|
|
* - 记录到数据库(debug_configs表)
|
|
- * 5. 应用调试参数:
|
|
|
|
- * - 动态调整设备行为
|
|
|
|
- * - 修改数据处理逻辑
|
|
|
|
|
|
+ * 5. 应用调试参数�? * - 动态调整设备行�? * - 修改数据处理逻辑
|
|
* 6. 发送设置结果响应给设备
|
|
* 6. 发送设置结果响应给设备
|
|
- * 7. 记录调试操作日志,便于问题追踪
|
|
|
|
- * 8. QoS设置为1,确保调试指令可靠传达
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_SET_DEBUG, qos = 1, desc = "设置调试参数")
|
|
|
|
|
|
+ * 7. 记录调试操作日志,便于问题追�? * 8. QoS设置�?,确保调试指令可靠传�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_SET_DEBUG, qos = 1, desc = "设置调试参数")
|
|
public void handleSetDebugParam(String topic, Message<?> message) {
|
|
public void handleSetDebugParam(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -457,27 +371,18 @@ public class DeviceMessageSubscriber {
|
|
/**
|
|
/**
|
|
* 处理获取调试参数
|
|
* 处理获取调试参数
|
|
* 对应Python版本的deal_get_debug_param方法
|
|
* 对应Python版本的deal_get_debug_param方法
|
|
- * 主题:/dev/{dev_id}/get_debug_param
|
|
|
|
|
|
+ * 主题�?dev/{dev_id}/get_debug_param
|
|
*
|
|
*
|
|
- * Python处理流程:
|
|
|
|
- * 1. 解析调试参数查询请求
|
|
|
|
- * 2. 验证查询权限和设备状态
|
|
|
|
- * 3. 从多个数据源获取调试参数:
|
|
|
|
- * - 内存中的实时调试状态
|
|
|
|
- * - Redis缓存中的配置
|
|
|
|
|
|
+ * Python处理流程�? * 1. 解析调试参数查询请求
|
|
|
|
+ * 2. 验证查询权限和设备状�? * 3. 从多个数据源获取调试参数�? * - 内存中的实时调试状�? * - Redis缓存中的配置
|
|
* - 数据库中的持久化配置
|
|
* - 数据库中的持久化配置
|
|
* 4. 组装完整的调试参数响应:
|
|
* 4. 组装完整的调试参数响应:
|
|
- * - 当前生效的调试参数
|
|
|
|
- * - 参数来源和优先级
|
|
|
|
- * - 参数设置时间和操作者
|
|
|
|
- * 5. 格式化响应数据:
|
|
|
|
- * - 标准化参数格式
|
|
|
|
- * - 添加参数说明和约束
|
|
|
|
- * 6. 发送调试参数响应到设备
|
|
|
|
|
|
+ * - 当前生效的调试参�? * - 参数来源和优先级
|
|
|
|
+ * - 参数设置时间和操作�? * 5. 格式化响应数据:
|
|
|
|
+ * - 标准化参数格�? * - 添加参数说明和约�? * 6. 发送调试参数响应到设备
|
|
* 7. 记录查询操作日志
|
|
* 7. 记录查询操作日志
|
|
- * 8. QoS设置为1,确保查询响应可靠传输
|
|
|
|
- */
|
|
|
|
- @MqttSubscriber(topic = MqttTopics.DEV_GET_DEBUG, qos = 1, desc = "获取调试参数")
|
|
|
|
|
|
+ * 8. QoS设置�?,确保查询响应可靠传�? */
|
|
|
|
+ // @MqttSubscriber(topic = MqttTopics.DEV_GET_DEBUG, qos = 1, desc = "获取调试参数")
|
|
public void handleGetDebugParam(String topic, Message<?> message) {
|
|
public void handleGetDebugParam(String topic, Message<?> message) {
|
|
try {
|
|
try {
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
String deviceId = extractDeviceIdFromTopic(topic);
|
|
@@ -497,7 +402,7 @@ public class DeviceMessageSubscriber {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 从主题中提取设备ID
|
|
* 从主题中提取设备ID
|
|
- * 格式:/dev/{device_id}/xxx
|
|
|
|
|
|
+ * 格式�?dev/{device_id}/xxx
|
|
*/
|
|
*/
|
|
protected String extractDeviceIdFromTopic(String topic) {
|
|
protected String extractDeviceIdFromTopic(String topic) {
|
|
Matcher matcher = DEV_ID_PATTERN.matcher(topic);
|
|
Matcher matcher = DEV_ID_PATTERN.matcher(topic);
|
|
@@ -506,4 +411,4 @@ public class DeviceMessageSubscriber {
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
-}
|
|
|
|
|
|
+}
|