smart-home/final_diagnosis.py

176 lines
6.8 KiB
Python
Raw Normal View History

2026-02-26 09:16:34 +08:00
#!/usr/bin/env python3
"""
ESP32云端报警上报功能最终诊断
"""
import requests
import json
import time
import threading
from datetime import datetime
def test_esp32_basic_functions():
"""测试ESP32基本功能"""
print("🔍 测试ESP32基本功能...")
try:
# 测试状态API
response = requests.get("http://192.168.1.3:80/api/status", timeout=5)
if response.status_code == 200:
print("✅ ESP32状态API正常")
status = response.json()
print(f" 设备: {status.get('data', {}).get('device', 'Unknown')}")
print(f" 运行时间: {status.get('data', {}).get('uptime', 0)}")
else:
print(f"❌ ESP32状态API异常: {response.status_code}")
return False
# 测试设备信息API
response = requests.get("http://192.168.1.3:80/api/device/info", timeout=5)
if response.status_code == 200:
print("✅ ESP32设备信息API正常")
info = response.json()
print(f" MAC地址: {info.get('mac_address', 'Unknown')}")
print(f" 设备ID: {info.get('device_id', 'Unknown')}")
else:
print(f"❌ ESP32设备信息API异常: {response.status_code}")
# 测试报警历史API
response = requests.get("http://192.168.1.3:80/api/alarm/history", timeout=5)
if response.status_code == 200:
print("✅ ESP32报警历史API正常")
history = response.json()
alarm_count = len(history.get('alarms', []))
print(f" 当前报警数量: {alarm_count}")
return True
else:
print(f"❌ ESP32报警历史API异常: {response.status_code}")
return False
except Exception as e:
print(f"❌ ESP32连接失败: {e}")
return False
def monitor_esp32_for_cloud_logs():
"""监控ESP32等待云端上报相关日志"""
print("\n📺 ESP32日志监控指导:")
print("=" * 50)
print("请手动执行以下步骤:")
print("1. 打开新的命令行窗口")
print("2. 执行: cd d:\\XinJiaPo\\Firefly_code\\smart-home\\firefly_esp32")
print("3. 执行: idf.py -p COM7 monitor")
print("4. 重启ESP32按RESET按钮")
print("5. 观察启动日志中是否有以下内容:")
print()
print("✅ 应该看到的初始化日志:")
print(" I CloudAlarmReporter: 🌐 开始初始化云端报警上报模块")
print(" I CloudAlarmReporter: 🔗 目标服务器: http://192.168.1.57:36988/device-alarms")
print(" I CloudAlarmReporter: 🔑 设备密钥: 39dc753bd0cb19da...")
print(" I CloudAlarmReporter: ✅ 云端报警上报模块初始化成功")
print()
print("🚨 触发报警时应该看到:")
print(" I AlarmManager: 🌐 准备上报报警到云端: [燃烧] 检测到燃烧...")
print(" I AlarmManager: ☁️ 报警已成功加入云端上报队列")
print(" I CloudAlarmReporter: 📨 开始上报报警...")
print(" I CloudAlarmReporter: 📡 HTTP响应状态码: 200")
print(" I CloudAlarmReporter: ✅ 报警上报成功")
print()
print("❌ 如果看到错误:")
print(" E CloudAlarmReporter: ❌ 创建报警上报队列失败")
print(" E CloudAlarmReporter: ❌ 创建云端上报任务失败")
print(" E CloudAlarmReporter: ❌ HTTP请求失败")
print(" E CloudAlarmReporter: ❌ 连接超时")
print("=" * 50)
def create_simple_test_server():
"""创建简单的测试服务器"""
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHandler(BaseHTTPRequestHandler):
def do_POST(self):
if self.path == '/device-alarms':
content_length = int(self.headers.get('Content-Length', 0))
post_data = self.rfile.read(content_length)
print(f"\n🎉 收到ESP32报警上报!")
print(f"时间: {datetime.now().strftime('%H:%M:%S')}")
print(f"数据: {post_data.decode('utf-8')}")
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
response = {"code": 200, "message": "success"}
self.wfile.write(json.dumps(response).encode('utf-8'))
else:
self.send_response(404)
self.end_headers()
def do_GET(self):
if self.path == '/health':
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
response = {"status": "ok"}
self.wfile.write(json.dumps(response).encode('utf-8'))
else:
self.send_response(404)
self.end_headers()
def log_message(self, format, *args):
pass # 禁用默认日志
try:
server = HTTPServer(('0.0.0.0', 36988), SimpleHandler)
print("🌐 简单测试服务器启动成功 (http://0.0.0.0:36988)")
server.serve_forever()
except Exception as e:
print(f"❌ 启动测试服务器失败: {e}")
def main():
"""主函数"""
print("🔧 ESP32云端报警上报功能最终诊断")
print("=" * 60)
print(f"诊断时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# 1. 测试ESP32基本功能
esp32_ok = test_esp32_basic_functions()
if not esp32_ok:
print("\n❌ ESP32基本功能测试失败请检查:")
print("1. ESP32是否正常启动")
print("2. WiFi连接是否正常")
print("3. HTTP服务器是否运行")
return
# 2. 启动简单测试服务器
print(f"\n🌐 启动简单测试服务器...")
server_thread = threading.Thread(target=create_simple_test_server, daemon=True)
server_thread.start()
time.sleep(2)
# 3. 显示监控指导
monitor_esp32_for_cloud_logs()
# 4. 等待用户操作
print(f"\n⏳ 等待ESP32报警上报...")
print("请按以下步骤操作:")
print("1. 重启ESP32并观察串口日志")
print("2. 用手接触热成像传感器触发报警")
print("3. 观察此窗口是否收到上报数据")
print("4. 按 Ctrl+C 结束测试")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print(f"\n\n🎯 诊断结束")
print("如果没有收到上报数据,可能的原因:")
print("1. CloudAlarmReporter模块未正确初始化")
print("2. ESP32无法访问192.168.1.57:36988")
print("3. 报警触发但上报队列有问题")
print("4. HTTP客户端配置错误")
if __name__ == "__main__":
main()