smart-home/test_mac_api.py
2026-02-26 09:16:34 +08:00

213 lines
8.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ESP32 MAC地址API测试脚本
用于验证cloud-backend-jdk8项目能正确读取MAC地址
"""
import requests
import json
import time
from datetime import datetime
def test_mac_api():
"""测试MAC地址API"""
print("🔍 ESP32 MAC地址API测试")
print("=" * 50)
device_ip = "192.168.1.3"
base_url = f"http://{device_ip}/api/device"
# 测试1: 获取MAC地址
print("\n📋 测试1: 获取MAC地址")
try:
response = requests.get(f"{base_url}/mac", timeout=5)
if response.status_code == 200:
data = response.json()
print("✅ MAC地址API响应成功:")
print(f" MAC地址: {data.get('mac_address')}")
print(f" 设备ID: {data.get('device_id')}")
print(f" 数字ID: {data.get('numeric_id')}")
print(f" 时间戳: {data.get('timestamp')}")
print(f" 状态: {data.get('status')}")
# 验证Java后端兼容性
if all(key in data for key in ['mac_address', 'device_id', 'numeric_id', 'timestamp', 'status']):
print("✅ JSON格式完全兼容cloud-backend-jdk8")
else:
print("❌ JSON格式不完整")
else:
print(f"❌ HTTP请求失败: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"❌ 网络连接失败: {e}")
# 测试2: 获取设备ID
print("\n📋 测试2: 获取设备ID")
try:
response = requests.get(f"{base_url}/id", timeout=5)
if response.status_code == 200:
data = response.json()
print("✅ 设备ID API响应成功:")
print(f" 设备ID: {data.get('device_id')}")
print(f" 数字ID: {data.get('numeric_id')}")
else:
print(f"❌ HTTP请求失败: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"❌ 网络连接失败: {e}")
# 测试3: 获取完整设备信息
print("\n📋 测试3: 获取完整设备信息")
try:
response = requests.get(f"{base_url}/info", timeout=10)
if response.status_code == 200:
data = response.json()
print("✅ 设备信息API响应成功:")
print(f" MAC地址: {data.get('mac_address')}")
print(f" 设备ID: {data.get('device_id')}")
print(f" 芯片型号: {data.get('chip_model')}")
print(f" 固件版本: {data.get('firmware_version')}")
print(f" 运行时间: {data.get('uptime_seconds')}")
print(f" 空闲内存: {data.get('free_heap_bytes', 0) / 1024:.1f} KB")
else:
print(f"❌ HTTP请求失败: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"❌ 网络连接失败: {e}")
# 测试4: 获取设备状态
print("\n📋 测试4: 获取设备状态")
try:
response = requests.get(f"{base_url}/status", timeout=5)
if response.status_code == 200:
data = response.json()
print("✅ 设备状态API响应成功:")
print(f" 设备ID: {data.get('device_id')}")
print(f" 运行时间: {data.get('uptime_seconds')}")
print(f" WiFi连接: {'✅ 已连接' if data.get('wifi_connected') else '❌ 未连接'}")
if data.get('wifi_connected'):
print(f" WiFi SSID: {data.get('wifi_ssid')}")
print(f" 信号强度: {data.get('wifi_rssi')} dBm")
else:
print(f"❌ HTTP请求失败: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"❌ 网络连接失败: {e}")
def simulate_java_backend():
"""模拟Java后端读取MAC地址"""
print("\n🚀 模拟cloud-backend-jdk8读取MAC地址")
print("=" * 50)
device_ip = "192.168.1.3"
mac_api_url = f"http://{device_ip}/api/device/mac"
try:
# 模拟Java RestTemplate请求
headers = {
'Content-Type': 'application/json',
'User-Agent': 'cloud-backend-jdk8/1.0'
}
response = requests.get(mac_api_url, headers=headers, timeout=5)
if response.status_code == 200:
# 模拟Jackson JSON解析
device_data = response.json()
print("✅ Java后端成功获取设备信息:")
print(f" 设备MAC: {device_data['mac_address']}")
print(f" 设备标识: {device_data['device_id']}")
print(f" 数字标识: {device_data['numeric_id']}")
print(f" 获取时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
# 模拟存储到数据库
print("\n💾 模拟存储到MySQL数据库:")
print("INSERT INTO esp32_devices (")
print(" device_id, mac_address, numeric_id, ")
print(" ip_address, status, last_seen")
print(") VALUES (")
print(f" '{device_data['device_id']}',")
print(f" '{device_data['mac_address']}',")
print(f" {device_data['numeric_id']},")
print(f" '{device_ip}',")
print(f" '{device_data['status']}',")
print(f" NOW()")
print(");")
return True
else:
print(f"❌ Java后端请求失败: HTTP {response.status_code}")
return False
except Exception as e:
print(f"❌ Java后端异常: {str(e)}")
return False
def performance_test():
"""性能测试 - 批量请求"""
print("\n⚡ 性能测试 - 批量MAC地址获取")
print("=" * 50)
device_ip = "192.168.1.3"
mac_api_url = f"http://{device_ip}/api/device/mac"
request_count = 10
success_count = 0
total_time = 0
for i in range(request_count):
try:
start_time = time.time()
response = requests.get(mac_api_url, timeout=3)
end_time = time.time()
if response.status_code == 200:
success_count += 1
request_time = (end_time - start_time) * 1000 # 转换为毫秒
total_time += request_time
print(f"请求 {i+1:2d}: ✅ 成功 ({request_time:.1f}ms)")
else:
print(f"请求 {i+1:2d}: ❌ 失败 (HTTP {response.status_code})")
except Exception as e:
print(f"请求 {i+1:2d}: ❌ 异常 ({str(e)})")
if success_count > 0:
avg_time = total_time / success_count
print(f"\n📊 性能统计:")
print(f" 总请求数: {request_count}")
print(f" 成功请求: {success_count}")
print(f" 成功率: {success_count/request_count*100:.1f}%")
print(f" 平均响应时间: {avg_time:.1f}ms")
if avg_time < 100:
print("✅ 响应速度优秀 (<100ms)")
elif avg_time < 500:
print("✅ 响应速度良好 (<500ms)")
else:
print("⚠️ 响应速度较慢 (>500ms)")
if __name__ == "__main__":
print("🔥 ESP32 MAC地址API完整测试套件")
print("适配cloud-backend-jdk8项目")
print("=" * 60)
# 基本功能测试
test_mac_api()
# Java后端兼容性测试
java_success = simulate_java_backend()
# 性能测试
if java_success:
performance_test()
print("\n🎉 测试完成!")
print("=" * 60)
print("✅ ESP32 MAC地址API已成功集成到app_main.cpp")
print("✅ cloud-backend-jdk8项目可以正常读取MAC地址")
print("✅ 支持设备自动注册和管理")
print("\n🔗 API端点:")
print(" GET /api/device/mac - 获取MAC地址")
print(" GET /api/device/id - 获取设备ID")
print(" GET /api/device/info - 获取完整信息")
print(" GET /api/device/status - 获取设备状态")
print(" POST /api/device/register - 设备注册")