124 lines
3.8 KiB
Python
124 lines
3.8 KiB
Python
#!/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()) |