66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
小智设备连接测试客户端
|
||
连接到 xiaozhi-server,模拟设备握手,触发 MCP 工具初始化
|
||
"""
|
||
|
||
import asyncio
|
||
import json
|
||
import uuid
|
||
import websockets
|
||
import sys
|
||
|
||
XIAOZHI_WS = "ws://localhost:8000/xiaozhi/v1/"
|
||
DEVICE_ID = str(uuid.uuid4())
|
||
TOPIC = str(uuid.uuid4())
|
||
|
||
|
||
async def main():
|
||
print(f"连接 xiaozhi-server: {XIAOZHI_WS}")
|
||
print(f"Device ID: {DEVICE_ID}")
|
||
|
||
async with websockets.connect(XIAOZHI_WS, ping_interval=None) as ws:
|
||
# 发送设备 hello
|
||
hello = {
|
||
"type": "hello",
|
||
"deviceId": DEVICE_ID,
|
||
"deviceName": "测试设备",
|
||
"clientType": "py-websocket-test",
|
||
"protocolVersion": "1.0.0",
|
||
"featureSet": {"mcp": True},
|
||
}
|
||
await ws.send(json.dumps(hello))
|
||
print(f"发送 hello: {hello}")
|
||
|
||
# 接收消息(最多等 30 秒)
|
||
for i in range(20):
|
||
try:
|
||
msg = await asyncio.wait_for(ws.recv(), timeout=5.0)
|
||
data = json.loads(msg)
|
||
msg_type = data.get("type", "unknown")
|
||
print(f"收到 [{msg_type}]: {json.dumps(data, ensure_ascii=False)[:200]}")
|
||
|
||
if msg_type == "welcome":
|
||
print("\n✅ 连接成功!")
|
||
if "tools" in data:
|
||
print(f"MCP 工具列表: {[t.get('name') for t in data.get('tools', [])]}")
|
||
if "mcpTools" in data:
|
||
print(f"MCP 工具: {data.get('mcpTools')}")
|
||
break
|
||
except asyncio.TimeoutError:
|
||
print(f" ... 等待中 ({i+1}/20)")
|
||
continue
|
||
|
||
print("\n测试完成,5秒后关闭...")
|
||
await asyncio.sleep(5)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
asyncio.run(main())
|
||
except KeyboardInterrupt:
|
||
print("\n已退出")
|
||
except Exception as e:
|
||
print(f"错误: {e}")
|
||
sys.exit(1)
|