#!/usr/bin/env python3 """ ESP32云端报警上报功能集成测试脚本 验证ESP32能否成功上报报警到云端服务器 """ import requests import time import json from datetime import datetime # 配置 ESP32_IP = "192.168.1.3" ESP32_PORT = 80 CLOUD_SERVER = "http://115.190.167.176:36988" DEVICE_KEY = "39dc753bd0cb19da5050a2f0edf932f851f5b21b90a6d06ecf9a28d81079a0a6" def test_esp32_connection(): """测试ESP32连接""" print("🔍 测试ESP32连接...") try: response = requests.get(f"http://{ESP32_IP}:{ESP32_PORT}/api/status", timeout=5) if response.status_code == 200: print(f"✅ ESP32连接正常: {response.json()}") return True else: print(f"❌ ESP32响应异常: {response.status_code}") return False except Exception as e: print(f"❌ ESP32连接失败: {e}") return False def get_esp32_device_info(): """获取ESP32设备信息""" print("📱 获取ESP32设备信息...") try: response = requests.get(f"http://{ESP32_IP}:{ESP32_PORT}/api/device/info", timeout=5) if response.status_code == 200: device_info = response.json() print(f"✅ 设备信息: {json.dumps(device_info, indent=2)}") return device_info else: print(f"❌ 获取设备信息失败: {response.status_code}") return None except Exception as e: print(f"❌ 获取设备信息异常: {e}") return None def get_esp32_alarm_history(): """获取ESP32报警历史""" print("📋 获取ESP32报警历史...") try: response = requests.get(f"http://{ESP32_IP}:{ESP32_PORT}/api/alarm/history", timeout=5) if response.status_code == 200: history = response.json() print(f"✅ 报警历史: {json.dumps(history, indent=2)}") return history else: print(f"❌ 获取报警历史失败: {response.status_code}") return None except Exception as e: print(f"❌ 获取报警历史异常: {e}") return None def trigger_test_alarm(): """触发测试报警(如果ESP32支持)""" print("🚨 尝试触发测试报警...") try: # 尝试通过API触发测试报警 test_data = { "action": "test_alarm", "type": "burning", "message": "集成测试报警", "temperature": 45.5 } response = requests.post(f"http://{ESP32_IP}:{ESP32_PORT}/api/test/alarm", json=test_data, timeout=5) if response.status_code == 200: print("✅ 测试报警触发成功") return True else: print(f"⚠️ 测试报警API不可用: {response.status_code}") return False except Exception as e: print(f"⚠️ 测试报警触发失败: {e}") return False def check_cloud_server(): """检查云端服务器状态""" print("☁️ 检查云端服务器状态...") try: response = requests.get(f"{CLOUD_SERVER}/health", timeout=10) if response.status_code == 200: print("✅ 云端服务器正常") return True else: print(f"❌ 云端服务器异常: {response.status_code}") return False except Exception as e: print(f"❌ 云端服务器连接失败: {e}") return False def test_cloud_alarm_endpoint(): """测试云端报警接收端点""" print("🧪 测试云端报警接收端点...") try: # 模拟ESP32发送的报警数据 test_alarm = { "physicalUid": "206EF1B3AD74", "sourceEventId": f"206EF1B3AD74:{int(time.time() * 1000)}", "title": "集成测试报警", "level": "warning", "message": "这是一个集成测试报警,用于验证ESP32云端上报功能", "temp": 35.8, "occurredAtMs": int(time.time() * 1000) } headers = { "Content-Type": "application/json", "X-Device-Key": DEVICE_KEY } response = requests.post(f"{CLOUD_SERVER}/device-alarms", json=test_alarm, headers=headers, timeout=10) if response.status_code == 200: result = response.json() print(f"✅ 云端报警接收成功: {result}") return True else: print(f"❌ 云端报警接收失败: {response.status_code}") print(f"响应内容: {response.text}") return False except Exception as e: print(f"❌ 云端报警测试异常: {e}") return False def monitor_esp32_logs(): """监控ESP32日志输出(提示用户手动操作)""" print("📺 ESP32日志监控指导:") print("=" * 50) print("请在另一个终端中运行以下命令监控ESP32日志:") print(f"cd d:\\XinJiaPo\\Firefly_code\\smart-home\\firefly_esp32") print(f"idf.py -p COM7 monitor") print() print("关键日志标识:") print("- 🌐 CloudAlarmReporter: 初始化云端报警上报模块") print("- ✅ CloudAlarmReporter: 云端报警上报模块初始化成功") print("- ☁️ AlarmManager: 报警已加入云端上报队列") print("- 📨 CloudAlarmReporter: 开始上报报警") print("- 📡 CloudAlarmReporter: HTTP响应状态码: 200") print("- ✅ CloudAlarmReporter: 报警上报成功") print("=" * 50) def wait_for_real_alarm(): """等待真实报警触发""" print("⏳ 等待真实报警触发...") print("请通过以下方式触发报警:") print("1. 用手接触热成像传感器(触发高温报警)") print("2. 快速移动热源(触发异常升温报警)") print("3. 等待系统自动检测") print() print("按 Enter 键继续检查报警历史...") input() def main(): """主测试流程""" print("🧪 ESP32云端报警上报功能集成测试") print("=" * 60) print(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print(f"ESP32地址: {ESP32_IP}:{ESP32_PORT}") print(f"云端服务器: {CLOUD_SERVER}") print("=" * 60) # 测试步骤 test_results = {} # 1. 测试ESP32连接 test_results['esp32_connection'] = test_esp32_connection() # 2. 获取设备信息 device_info = get_esp32_device_info() test_results['device_info'] = device_info is not None # 3. 检查云端服务器 test_results['cloud_server'] = check_cloud_server() # 4. 测试云端报警端点 test_results['cloud_endpoint'] = test_cloud_alarm_endpoint() # 5. 获取当前报警历史 print("\n📋 获取当前报警历史作为基准...") initial_history = get_esp32_alarm_history() initial_count = len(initial_history.get('alarms', [])) if initial_history else 0 print(f"当前报警历史数量: {initial_count}") # 6. 尝试触发测试报警 test_results['test_alarm'] = trigger_test_alarm() # 7. 监控指导 monitor_esp32_logs() # 8. 等待真实报警 wait_for_real_alarm() # 9. 检查报警历史变化 print("\n📋 检查报警历史变化...") final_history = get_esp32_alarm_history() final_count = len(final_history.get('alarms', [])) if final_history else 0 if final_count > initial_count: print(f"✅ 检测到新报警! 数量从 {initial_count} 增加到 {final_count}") new_alarms = final_history.get('alarms', [])[:final_count - initial_count] for alarm in new_alarms: print(f" 📨 新报警: {alarm}") else: print(f"⚠️ 未检测到新报警 (当前: {final_count}, 之前: {initial_count})") # 测试结果总结 print("\n🎯 测试结果总结:") print("=" * 40) for test_name, result in test_results.items(): status = "✅ 通过" if result else "❌ 失败" print(f"{test_name}: {status}") success_rate = sum(test_results.values()) / len(test_results) * 100 print(f"\n总体成功率: {success_rate:.1f}%") if success_rate >= 80: print("🎉 集成测试基本通过!") else: print("⚠️ 集成测试需要进一步调试") print("\n💡 下一步验证:") print("1. 检查云端数据库是否有新的alarm_records记录") print("2. 在APP中查看报警历史是否同步") print("3. 验证离线状态下APP是否能显示云端历史") if __name__ == "__main__": main()