smart-home/设备配置冲突修复说明.md
2026-02-26 09:16:34 +08:00

5.8 KiB
Raw Blame History

设备配置冲突问题修复说明

📋 问题描述

症状

APP端出现网络请求失败日志显示同时尝试连接两个不同的ESP32设备IP

  • 192.168.1.98:80 - 连接成功
  • 192.168.1.3:80 - 连接失败旧设备IP

错误日志示例

15:57:08.235 更新ESP32报警已读状态失败: Failed to connect to /192.168.1.3:80
15:57:08.765 🌐 网络请求 [1/3]: POST http://192.168.1.3:80/api/alarm/history/read/7
15:57:10.565 ⚠️ 网络请求失败 [1/3]: Failed to connect to /192.168.1.3:80
15:58:37.039 ✅ 网络请求成功: GET http://192.168.1.98:80/api/alarm/history (200)

根本原因

APP中存在多个设备配置存储位置导致不同页面或组件使用了不同的设备IP

  1. esp32_device - 主设备配置正确的IP
  2. cloud_device_config - 云端设备配置可能包含旧IP
  3. 其他可能的缓存key

解决方案

1. 创建设备配置清理工具

文件: utils/deviceConfigCleaner.js

核心功能:

  • 清除所有设备配置 - clearAllDeviceConfigs()
  • 设置统一配置 - setUnifiedDeviceConfig(ip, port)
  • 检查配置一致性 - checkDeviceConfigConsistency()
  • 自动修复冲突 - autoFixDeviceConfig()
  • 诊断报告 - showDeviceConfigDiagnostics()

2. 集成自动诊断和修复

文件: pages/index/index.vue

修改内容:

// 导入诊断工具
import { 
  checkDeviceConfigConsistency, 
  autoFixDeviceConfig, 
  showDeviceConfigDiagnostics 
} from '@/utils/deviceConfigCleaner.js'

// 在页面加载时自动诊断和修复
async onLoad() {
  // 🔧 自动诊断和修复设备配置冲突
  await this.diagnoseAndFixDeviceConfig()
  
  // 检查是否需要设备发现
  await this.checkDeviceDiscovery()
  
  this.loadData()
  this.startAlarmTimer()
}

3. 诊断和修复流程

页面加载
  ↓
🔍 检查设备配置一致性
  ↓
配置冲突?
  ├─ 是 → 🔧 自动修复
  │        ├─ 成功 → ✅ 提示用户
  │        └─ 失败 → ❌ 引导重新发现设备
  └─ 否 → ✅ 继续正常流程

🔧 使用方法

自动修复(推荐)

APP启动时会自动检测并修复配置冲突用户无需手动操作。

手动诊断

在浏览器控制台执行:

// 显示诊断报告
showDeviceConfigDiagnostics()

// 检查配置一致性
const check = checkDeviceConfigConsistency()
console.log(check)

// 手动修复
autoFixDeviceConfig()

清除所有配置(重置)

clearAllDeviceConfigs()

设置统一配置

setUnifiedDeviceConfig('192.168.1.98', 80)

📊 诊断报告示例

==================================================
📋 设备配置诊断报告
==================================================
✅ 是否有配置: 是
✅ 配置一致性: 不一致
✅ 主设备IP: 192.168.1.98
✅ 配置数量: 2

📦 所有配置详情:
  1. esp32_device
     IP: 192.168.1.98
     URL: http://192.168.1.98:80
  2. cloud_device_config
     IP: 192.168.1.3
     URL: http://192.168.1.3:80

⚠️ 检测到配置冲突!建议执行 autoFixDeviceConfig() 修复
==================================================

🎯 修复效果

修复前

  • 同时请求多个设备IP
  • 部分请求失败404或连接超时
  • 用户体验差,功能不稳定

修复后

  • 统一使用正确的设备IP
  • 所有请求成功
  • 自动检测和修复冲突
  • 用户无感知,体验流畅

🔍 技术细节

检查的存储Key

const possibleKeys = [
  'esp32_device',           // 主设备配置
  'cloud_device_config',    // 云端设备配置
  'device_config',          // 通用设备配置
  'esp32_ip',               // 单独的IP存储
  'esp32_url',              // 单独的URL存储
  'current_device',         // 当前设备
  'selected_device'         // 选中的设备
]

配置一致性检查逻辑

  1. 读取主设备配置获取主IP
  2. 遍历所有可能的配置存储位置
  3. 提取每个配置中的IP地址
  4. 对比所有IP是否一致
  5. 返回检查结果和详细信息

自动修复策略

  1. 使用主设备配置的IP作为标准
  2. 清除所有其他配置
  3. 重新设置统一的设备配置
  4. 验证修复结果

🚀 部署建议

1. 立即生效

修改已集成到APP主页下次启动自动生效。

2. 用户通知

如果检测到配置冲突且自动修复失败,会弹出提示引导用户重新发现设备。

3. 监控日志

关注以下日志输出:

  • 🔍 开始设备配置诊断...
  • ✅ 设备配置一致,无需修复
  • ⚠️ 检测到设备配置冲突,尝试自动修复...
  • ✅ 设备配置已自动修复

📝 相关文件

新增文件

  • utils/deviceConfigCleaner.js - 设备配置清理和诊断工具

修改文件

  • pages/index/index.vue - 集成自动诊断和修复

依赖文件

  • utils/deviceConfig.js - 设备配置管理器
  • utils/deviceConfigStore.js - 设备配置存储

⚠️ 注意事项

  1. 不会丢失数据 - 修复过程只统一配置,不影响报警历史等数据
  2. 自动备份 - 修复前会显示完整诊断报告
  3. 用户可选 - 如果自动修复失败,用户可选择稍后处理
  4. 兼容性 - 与现有设备发现流程完全兼容

🎉 总结

通过引入自动诊断和修复机制彻底解决了设备配置冲突导致的网络请求失败问题。用户无需手动干预APP启动时自动检测并修复确保始终使用正确的设备配置。

关键改进:

  • 自动检测配置冲突
  • 智能修复不一致
  • 用户友好的提示
  • 完整的诊断报告
  • 零配置,开箱即用