VWED_server/tests/test_mqtt_service.py

124 lines
3.8 KiB
Python
Raw Normal View History

2025-09-20 16:50:45 +08:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MQTT设备处理服务测试
测试集成的MQTT服务功能
"""
import asyncio
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from services.online_script.device_handler_service import get_device_service, DeviceType
from services.online_script.mqtt_service import MQTTService
from datetime import datetime
import json
import time
def test_device_handler(message):
"""测试设备消息处理器"""
print(f"[设备处理器] 收到消息:")
print(f" 设备ID: {message.device_id}")
print(f" 设备类型: {message.device_type.value}")
print(f" 主题: {message.topic}")
print(f" 载荷: {json.dumps(message.payload, ensure_ascii=False, indent=2)}")
print(f" 时间戳: {datetime.fromtimestamp(message.timestamp).strftime('%Y-%m-%d %H:%M:%S')}")
print("-" * 50)
# 返回转发配置
return {
"forward": True,
"payload": {
"processed_by": "vwed_device_handler",
"original_data": message.payload,
"processed_time": datetime.now().isoformat()
}
}
async def test_mqtt_device_service():
"""测试MQTT设备处理服务"""
print("=== MQTT设备处理服务测试 ===")
# 获取设备服务实例
device_service = get_device_service()
try:
# 启动服务
print("启动设备处理服务...")
await device_service.start_service()
# 等待服务启动
await asyncio.sleep(2)
# 注册设备处理器
print("注册设备处理器...")
device_service.register_and_run(
device_id="test_robot_001",
device_type=DeviceType.ROBOT,
listen_topics=["vwed/device/test_robot_001/data", "vwed/task/status"],
forward_topics=["vwed/processed/test_robot_001"],
handler=test_device_handler,
script_id="test_script_001",
description="测试机器人设备处理器"
)
# 等待注册完成
await asyncio.sleep(1)
# 发送测试消息
print("发送测试消息...")
test_messages = [
{
"topic": "vwed/device/test_robot_001/data",
"payload": {
"robot_id": "test_robot_001",
"status": "running",
"battery": 75,
"position": {"x": 150, "y": 300},
"timestamp": datetime.now().isoformat()
}
},
{
"topic": "vwed/task/status",
"payload": {
"task_id": "task_001",
"status": "in_progress",
"progress": 60,
"timestamp": datetime.now().isoformat()
}
}
]
for msg in test_messages:
await device_service.publish_message(msg["topic"], msg["payload"])
print(f"已发布消息到主题: {msg['topic']}")
await asyncio.sleep(1)
# 保持运行一段时间以接收消息
print("保持服务运行30秒等待消息处理...")
await asyncio.sleep(30)
# 查看统计信息
print("\n=== 设备处理统计 ===")
stats = device_service.get_running_handlers()
print(json.dumps(stats, ensure_ascii=False, indent=2))
except Exception as e:
print(f"测试过程中出错: {e}")
import traceback
traceback.print_exc()
finally:
# 停止服务
print("\n停止设备处理服务...")
await device_service.stop_service()
print("测试完成")
if __name__ == "__main__":
# 运行测试
asyncio.run(test_mqtt_device_service())