|
|
#!/usr/bin/env python3
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
"""
|
|
|
手机连接功能演示脚本
|
|
|
展示如何使用手机作为移动侦察设备
|
|
|
"""
|
|
|
|
|
|
import time
|
|
|
import json
|
|
|
import base64
|
|
|
import requests
|
|
|
from src import MobileConnector, config
|
|
|
|
|
|
def demo_mobile_functionality():
|
|
|
"""演示手机连接功能"""
|
|
|
print("📱 手机连接功能演示")
|
|
|
print("=" * 60)
|
|
|
|
|
|
print("🎯 演示内容:")
|
|
|
print("1. 启动手机连接服务器")
|
|
|
print("2. 模拟手机客户端连接")
|
|
|
print("3. 发送模拟数据")
|
|
|
print("4. 展示数据处理流程")
|
|
|
print()
|
|
|
|
|
|
# 创建手机连接器
|
|
|
mobile_connector = MobileConnector(port=8080)
|
|
|
|
|
|
print("📱 正在启动手机连接服务器...")
|
|
|
if mobile_connector.start_server():
|
|
|
print("✅ 手机连接服务器启动成功")
|
|
|
print(f"🌐 等待手机客户端连接到端口 8080")
|
|
|
print()
|
|
|
|
|
|
print("📖 使用说明:")
|
|
|
print("1. 确保手机和电脑在同一网络")
|
|
|
print("2. 在手机浏览器中访问:")
|
|
|
print(" http://[电脑IP]:5000/mobile/mobile_client.html")
|
|
|
print("3. 或者直接打开 mobile/mobile_client.html 文件")
|
|
|
print("4. 点击'开始传输'按钮")
|
|
|
print()
|
|
|
|
|
|
print("🔧 获取电脑IP地址的方法:")
|
|
|
print("Windows: ipconfig")
|
|
|
print("Linux/Mac: ifconfig 或 ip addr show")
|
|
|
print()
|
|
|
|
|
|
# 设置回调函数来显示接收的数据
|
|
|
def on_frame_received(device_id, frame, device):
|
|
|
print(f"📷 收到设备 {device_id[:8]} 的图像帧")
|
|
|
print(f" 分辨率: {frame.shape[1]}x{frame.shape[0]}")
|
|
|
print(f" 设备: {device.device_name}")
|
|
|
|
|
|
def on_location_received(device_id, location, device):
|
|
|
lat, lng, accuracy = location
|
|
|
print(f"📍 收到设备 {device_id[:8]} 的位置信息")
|
|
|
print(f" 坐标: ({lat:.6f}, {lng:.6f})")
|
|
|
print(f" 精度: {accuracy}m")
|
|
|
|
|
|
def on_device_event(event_type, device):
|
|
|
if event_type == 'device_connected':
|
|
|
print(f"📱 设备连接: {device.device_name} ({device.device_id[:8]})")
|
|
|
print(f" 电池: {device.battery_level}%")
|
|
|
elif event_type == 'device_disconnected':
|
|
|
print(f"📱 设备断开: {device.device_name} ({device.device_id[:8]})")
|
|
|
|
|
|
# 注册回调函数
|
|
|
mobile_connector.add_frame_callback(on_frame_received)
|
|
|
mobile_connector.add_location_callback(on_location_received)
|
|
|
mobile_connector.add_device_callback(on_device_event)
|
|
|
|
|
|
print("⏳ 等待手机连接... (按 Ctrl+C 退出)")
|
|
|
|
|
|
try:
|
|
|
# 监控连接状态
|
|
|
while True:
|
|
|
time.sleep(5)
|
|
|
|
|
|
# 显示统计信息
|
|
|
stats = mobile_connector.get_statistics()
|
|
|
online_devices = mobile_connector.get_online_devices()
|
|
|
|
|
|
if stats['online_devices'] > 0:
|
|
|
print(f"\n📊 连接统计:")
|
|
|
print(f" 在线设备: {stats['online_devices']}")
|
|
|
print(f" 接收帧数: {stats['frames_received']}")
|
|
|
print(f" 数据量: {stats['data_received_mb']:.2f} MB")
|
|
|
print(f" 平均帧率: {stats['avg_frames_per_second']:.1f} FPS")
|
|
|
|
|
|
print(f"\n📱 在线设备:")
|
|
|
for device in online_devices:
|
|
|
print(f" • {device.device_name} ({device.device_id[:8]})")
|
|
|
print(f" 电池: {device.battery_level}%")
|
|
|
if device.current_location:
|
|
|
lat, lng, acc = device.current_location
|
|
|
print(f" 位置: ({lat:.6f}, {lng:.6f})")
|
|
|
else:
|
|
|
print("⏳ 等待设备连接...")
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
print("\n🔴 用户中断")
|
|
|
|
|
|
finally:
|
|
|
mobile_connector.stop_server()
|
|
|
print("📱 手机连接服务器已停止")
|
|
|
|
|
|
else:
|
|
|
print("❌ 手机连接服务器启动失败")
|
|
|
print("💡 可能的原因:")
|
|
|
print(" - 端口 8080 已被占用")
|
|
|
print(" - 网络权限问题")
|
|
|
print(" - 防火墙阻止连接")
|
|
|
|
|
|
def test_mobile_api():
|
|
|
"""测试手机相关API"""
|
|
|
print("\n🧪 测试手机API接口")
|
|
|
print("=" * 40)
|
|
|
|
|
|
base_url = "http://127.0.0.1:5000"
|
|
|
|
|
|
try:
|
|
|
# 测试ping接口
|
|
|
test_data = {"device_id": "test_device_123"}
|
|
|
response = requests.post(f"{base_url}/mobile/ping",
|
|
|
json=test_data, timeout=5)
|
|
|
|
|
|
if response.status_code == 200:
|
|
|
data = response.json()
|
|
|
print("✅ Ping API测试成功")
|
|
|
print(f" 服务器时间: {data.get('server_time')}")
|
|
|
else:
|
|
|
print(f"❌ Ping API测试失败: HTTP {response.status_code}")
|
|
|
|
|
|
except requests.exceptions.ConnectionError:
|
|
|
print("⚠️ 无法连接到Web服务器")
|
|
|
print("💡 请先启动Web服务器: python main_web.py")
|
|
|
|
|
|
except Exception as e:
|
|
|
print(f"❌ API测试出错: {e}")
|
|
|
|
|
|
def show_mobile_guide():
|
|
|
"""显示手机连接指南"""
|
|
|
print("\n📖 手机连接步骤指南")
|
|
|
print("=" * 40)
|
|
|
|
|
|
print("1️⃣ 启动服务端:")
|
|
|
print(" python main_web.py")
|
|
|
print(" 或 python run.py (选择Web模式)")
|
|
|
print()
|
|
|
|
|
|
print("2️⃣ 获取电脑IP地址:")
|
|
|
print(" Windows: 打开CMD,输入 ipconfig")
|
|
|
print(" Mac/Linux: 打开终端,输入 ifconfig")
|
|
|
print(" 记下IP地址,如: 192.168.1.100")
|
|
|
print()
|
|
|
|
|
|
print("3️⃣ 手机端连接:")
|
|
|
print(" 方法1: 浏览器访问 http://[IP]:5000/mobile/mobile_client.html")
|
|
|
print(" 方法2: 直接打开 mobile/mobile_client.html 文件")
|
|
|
print()
|
|
|
|
|
|
print("4️⃣ 开始传输:")
|
|
|
print(" • 允许摄像头和位置权限")
|
|
|
print(" • 点击'开始传输'按钮")
|
|
|
print(" • 查看连接状态指示灯")
|
|
|
print()
|
|
|
|
|
|
print("5️⃣ 查看结果:")
|
|
|
print(" • 在电脑Web界面查看地图")
|
|
|
print(" • 观察实时检测结果")
|
|
|
print(" • 监控设备状态")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
print("🚁 无人机战场态势感知系统 - 手机连接演示")
|
|
|
print("=" * 60)
|
|
|
|
|
|
while True:
|
|
|
print("\n选择演示内容:")
|
|
|
print("1. 📱 启动手机连接服务器")
|
|
|
print("2. 🧪 测试手机API接口")
|
|
|
print("3. 📖 查看连接指南")
|
|
|
print("0. ❌ 退出")
|
|
|
|
|
|
try:
|
|
|
choice = input("\n请输入选择 (0-3): ").strip()
|
|
|
|
|
|
if choice == "1":
|
|
|
demo_mobile_functionality()
|
|
|
elif choice == "2":
|
|
|
test_mobile_api()
|
|
|
elif choice == "3":
|
|
|
show_mobile_guide()
|
|
|
elif choice == "0":
|
|
|
print("👋 再见!")
|
|
|
break
|
|
|
else:
|
|
|
print("❌ 无效选择,请重新输入")
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
print("\n👋 再见!")
|
|
|
break
|
|
|
except Exception as e:
|
|
|
print(f"❌ 出错: {e}")
|
|
|
|
|
|
input("\n按回车键继续...") |