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())
|