194 lines
6.4 KiB
Python
194 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
相机断开连接测试脚本
|
|
测试相机USB拔出时是否能正常检测设备断连并发送socket信息
|
|
"""
|
|
|
|
import time
|
|
import threading
|
|
import logging
|
|
from devices.camera_manager import CameraManager
|
|
from devices.utils.config_manager import ConfigManager
|
|
from unittest.mock import Mock
|
|
|
|
# 配置日志
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class MockSocketIO:
|
|
"""模拟SocketIO用于测试"""
|
|
|
|
def __init__(self):
|
|
self.events = []
|
|
self.lock = threading.Lock()
|
|
|
|
def emit(self, event, data, namespace=None):
|
|
"""记录发送的事件"""
|
|
with self.lock:
|
|
self.events.append({
|
|
'event': event,
|
|
'data': data,
|
|
'namespace': namespace,
|
|
'timestamp': time.time()
|
|
})
|
|
logger.info(f"Socket事件: {event} -> {data} (namespace: {namespace})")
|
|
|
|
def get_events(self):
|
|
"""获取所有事件"""
|
|
with self.lock:
|
|
return self.events.copy()
|
|
|
|
def clear_events(self):
|
|
"""清空事件记录"""
|
|
with self.lock:
|
|
self.events.clear()
|
|
|
|
def test_camera_disconnect_detection():
|
|
"""
|
|
测试相机断开连接检测功能
|
|
"""
|
|
logger.info("="*60)
|
|
logger.info("开始测试相机断开连接检测功能")
|
|
logger.info("="*60)
|
|
|
|
# 创建模拟SocketIO
|
|
mock_socketio = MockSocketIO()
|
|
|
|
# 创建配置管理器
|
|
config_manager = ConfigManager()
|
|
|
|
# 创建相机管理器
|
|
camera_manager = CameraManager(mock_socketio, config_manager)
|
|
|
|
try:
|
|
# 1. 初始化相机
|
|
logger.info("\n步骤1: 初始化相机设备")
|
|
if not camera_manager.initialize():
|
|
logger.error("相机初始化失败,无法进行测试")
|
|
return False
|
|
|
|
logger.info(f"相机初始化成功 - 连接状态: {camera_manager.is_connected}")
|
|
|
|
# 2. 启动数据流
|
|
logger.info("\n步骤2: 启动相机数据流")
|
|
if not camera_manager.start_streaming():
|
|
logger.error("相机数据流启动失败")
|
|
return False
|
|
|
|
logger.info("相机数据流启动成功")
|
|
|
|
# 3. 等待一段时间让系统稳定
|
|
logger.info("\n步骤3: 等待系统稳定 (5秒)")
|
|
time.sleep(5)
|
|
|
|
# 清空之前的事件记录
|
|
mock_socketio.clear_events()
|
|
|
|
# 4. 提示用户拔出USB
|
|
logger.info("\n步骤4: 请拔出相机USB连接线")
|
|
logger.info("等待30秒来检测断开连接...")
|
|
|
|
start_time = time.time()
|
|
disconnect_detected = False
|
|
|
|
# 监控30秒
|
|
while time.time() - start_time < 30:
|
|
# 检查连接状态
|
|
if camera_manager.is_connected:
|
|
logger.debug(f"相机仍然连接中... (已等待 {time.time() - start_time:.1f}秒)")
|
|
else:
|
|
logger.info(f"检测到相机断开连接! (耗时 {time.time() - start_time:.1f}秒)")
|
|
disconnect_detected = True
|
|
break
|
|
|
|
time.sleep(1)
|
|
|
|
# 5. 分析结果
|
|
logger.info("\n步骤5: 分析测试结果")
|
|
|
|
if disconnect_detected:
|
|
logger.info("✓ 相机断开连接检测: 成功")
|
|
else:
|
|
logger.warning("✗ 相机断开连接检测: 失败 (30秒内未检测到断开)")
|
|
|
|
# 检查Socket事件
|
|
events = mock_socketio.get_events()
|
|
disconnect_events = [e for e in events if 'status' in str(e.get('data', {})) and 'disconnect' in str(e.get('data', {})).lower()]
|
|
|
|
if disconnect_events:
|
|
logger.info(f"✓ Socket断开通知: 成功 (发送了 {len(disconnect_events)} 个断开事件)")
|
|
for event in disconnect_events:
|
|
logger.info(f" - 事件: {event['event']}, 数据: {event['data']}")
|
|
else:
|
|
logger.warning("✗ Socket断开通知: 失败 (未发送断开事件)")
|
|
|
|
# 6. 测试重连机制
|
|
if disconnect_detected:
|
|
logger.info("\n步骤6: 测试重连机制")
|
|
logger.info("请重新插入相机USB连接线")
|
|
logger.info("等待30秒来检测重新连接...")
|
|
|
|
start_time = time.time()
|
|
reconnect_detected = False
|
|
|
|
while time.time() - start_time < 30:
|
|
if camera_manager.is_connected:
|
|
logger.info(f"检测到相机重新连接! (耗时 {time.time() - start_time:.1f}秒)")
|
|
reconnect_detected = True
|
|
break
|
|
|
|
time.sleep(1)
|
|
|
|
if reconnect_detected:
|
|
logger.info("✓ 相机重连检测: 成功")
|
|
else:
|
|
logger.warning("✗ 相机重连检测: 失败 (30秒内未检测到重连)")
|
|
|
|
# 7. 显示所有Socket事件
|
|
logger.info("\n步骤7: 所有Socket事件记录")
|
|
all_events = mock_socketio.get_events()
|
|
if all_events:
|
|
for i, event in enumerate(all_events, 1):
|
|
logger.info(f" {i}. 事件: {event['event']}, 数据: {event['data']}, 时间: {time.strftime('%H:%M:%S', time.localtime(event['timestamp']))}")
|
|
else:
|
|
logger.info(" 无Socket事件记录")
|
|
|
|
return disconnect_detected
|
|
|
|
except Exception as e:
|
|
logger.error(f"测试过程中发生异常: {e}")
|
|
return False
|
|
|
|
finally:
|
|
# 清理资源
|
|
try:
|
|
camera_manager.stop_streaming()
|
|
camera_manager.disconnect()
|
|
logger.info("测试资源清理完成")
|
|
except Exception as e:
|
|
logger.error(f"清理资源时发生异常: {e}")
|
|
|
|
def main():
|
|
"""
|
|
主函数
|
|
"""
|
|
logger.info("相机断开连接测试脚本")
|
|
logger.info("此脚本将测试相机USB拔出时的断连检测和Socket通知功能")
|
|
logger.info("")
|
|
|
|
# 运行测试
|
|
success = test_camera_disconnect_detection()
|
|
|
|
logger.info("\n" + "="*60)
|
|
if success:
|
|
logger.info("测试完成: 相机断开连接检测功能正常")
|
|
else:
|
|
logger.info("测试完成: 相机断开连接检测功能存在问题")
|
|
logger.info("="*60)
|
|
|
|
if __name__ == "__main__":
|
|
main() |