smart-home/test_cloud_alarm_integration.py

241 lines
8.5 KiB
Python
Raw Normal View History

2026-02-26 09:16:34 +08:00
#!/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()