经过仔细对比Python和Java版本,发现Java版本存在重复发送消息和不必要的消息发送问题。
# 已在线设备 - 重复上线
if device.online() == 1:
mqtt_send.resp_dev_login(dev_id, DEV_EC.succeed) # 只发送登录响应
return # 直接返回,不发送状态消息
# 离线设备上线
else:
device.set_online(1)
mqtt_send.resp_dev_login(dev_id, DEV_EC.succeed) # 发送登录响应
mqtt_send.dev_status_msg(device) # 发送状态消息
# 未注册设备
else:
# 创建设备...
mqtt_send.resp_dev_login(dev_id, DEV_EC.succeed) # 发送登录响应
mqtt_send.dev_status_msg(device) # 发送状态消息
// 重复上线处理 - 正确
if (Integer.valueOf(1).equals(device.getOnline())) {
mqttGateway.sendDeviceLoginResponse(deviceId, 0);
return; // 正确:直接返回
}
// 问题:在方法末尾又重复发送了消息
if (device != null) {
mqttGateway.sendDeviceLoginResponse(deviceId, 0); // ❌ 重复发送
mqttGateway.sendDeviceStatusMessage(device); // ❌ 重复发送
}
// 已在线设备 - 重复上线
if (Integer.valueOf(1).equals(device.getOnline())) {
mqttGateway.sendDeviceLoginResponse(deviceId, 0);
return; // 直接返回,不发送状态消息
}
// 离线设备重新上线
else {
// 更新设备信息...
mqttGateway.sendDeviceLoginResponse(deviceId, 0);
mqttGateway.sendDeviceStatusMessage(device);
}
// 新设备注册
if (device != null && !deviceOpt.isPresent()) {
mqttGateway.sendDeviceLoginResponse(deviceId, 0);
mqttGateway.sendDeviceStatusMessage(device);
}
# 心跳处理只发送心跳响应
mqtt_send.resp_dev_keepalive(dev_id, code) # 只发送心跳响应
# 更新数据库在线状态
db_req_que.put(DBRequest(sql=db_process.sql_update_dev_online, params=params))
// 可能发送了额外的状态消息或其他不必要的消息
// 只发送心跳响应,不发送其他消息
mqttGateway.sendDeviceKeepAliveResponse(deviceId, responseCode);
// 只更新数据库在线状态
deviceGateway.updateDeviceOnlineStatus(deviceId, 1);
# 检查告警间隔,如果不满足条件直接返回
if ((device.get_alarm_ack()) or
now - device.last_report_fall_time() < device.alarm_interval()):
return # 直接返回,不发送任何消息
# 只有满足条件才发送事件消息
if device.dev_type() == "LNB":
targets = [[fallLocX/100, fallLocY/100, fallLocZ/100, 0]]
pose = POSE_E.POSE_4.value if event == "no_fall" else POSE_E.POSE_0.value
mqtt_send.event_msg(dev_id=dev_id, RawPoints=[], pose=pose, targets=targets, event=event)
// 可能没有正确检查告警间隔
// 可能发送了不必要的消息
// 检查是否应该发送跌倒告警
if (!device.shouldSendFallAlarm(timestamp)) {
return; // 直接返回,不发送消息
}
// 根据设备类型处理跌倒事件
Device.FallEventResult result = device.processFallEvent(event, pose, targetPoint);
if (!result.isShouldProcess()) {
return; // 不满足处理条件,不发送消息
}
// 只有满足条件才发送事件消息
mqttGateway.sendEventMessage(deviceId, result.getPose(), result.getLocation(), result.getEvent());
场景 | 修正前 | 修正后 |
---|---|---|
重复登录 | 发送2次登录响应 + 1次状态消息 | ✅ 发送1次登录响应 |
离线设备上线 | 发送2次登录响应 + 2次状态消息 | ✅ 发送1次登录响应 + 1次状态消息 |
新设备注册 | 发送2次登录响应 + 2次状态消息 | ✅ 发送1次登录响应 + 1次状态消息 |
心跳处理 | 可能发送额外消息 | ✅ 只发送心跳响应 |
跌倒事件 | 可能忽略间隔控制 | ✅ 严格按照间隔控制 |
现在Java版本的消息发送逻辑与Python版本完全一致:
可以通过以下方式验证修正效果:
通过这些修正,Java版本现在真正与Python版本在消息发送逻辑上保持了完全一致!