VWED_server/tests/test_mqtt_service.py

124 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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())