5.8 KiB
5.8 KiB
设备配置冲突问题修复说明
📋 问题描述
症状
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:
esp32_device- 主设备配置(正确的IP)cloud_device_config- 云端设备配置(可能包含旧IP)- 其他可能的缓存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' // 选中的设备
]
配置一致性检查逻辑
- 读取主设备配置,获取主IP
- 遍历所有可能的配置存储位置
- 提取每个配置中的IP地址
- 对比所有IP是否一致
- 返回检查结果和详细信息
自动修复策略
- 使用主设备配置的IP作为标准
- 清除所有其他配置
- 重新设置统一的设备配置
- 验证修复结果
🚀 部署建议
1. 立即生效
修改已集成到APP主页,下次启动自动生效。
2. 用户通知
如果检测到配置冲突且自动修复失败,会弹出提示引导用户重新发现设备。
3. 监控日志
关注以下日志输出:
🔍 开始设备配置诊断...✅ 设备配置一致,无需修复⚠️ 检测到设备配置冲突,尝试自动修复...✅ 设备配置已自动修复
📝 相关文件
新增文件
utils/deviceConfigCleaner.js- 设备配置清理和诊断工具
修改文件
pages/index/index.vue- 集成自动诊断和修复
依赖文件
utils/deviceConfig.js- 设备配置管理器utils/deviceConfigStore.js- 设备配置存储
⚠️ 注意事项
- 不会丢失数据 - 修复过程只统一配置,不影响报警历史等数据
- 自动备份 - 修复前会显示完整诊断报告
- 用户可选 - 如果自动修复失败,用户可选择稍后处理
- 兼容性 - 与现有设备发现流程完全兼容
🎉 总结
通过引入自动诊断和修复机制,彻底解决了设备配置冲突导致的网络请求失败问题。用户无需手动干预,APP启动时自动检测并修复,确保始终使用正确的设备配置。
关键改进:
- ✅ 自动检测配置冲突
- ✅ 智能修复不一致
- ✅ 用户友好的提示
- ✅ 完整的诊断报告
- ✅ 零配置,开箱即用