架构与节点协议
SDK=节点 / 网关 三层与 /ws/node
┌────────────┐ /ws/node (注册/派发/设备操作RPC) ┌──────────────────┐
│ backend │◄─────────────────────────────────────│ aixautobot (SDK) │
│ (网关) │ /ws/signal · /api/ice (WebRTC) │ 设备发现/驱动/执行 │
│ 无 sdk 依赖 │─────────────────────────────────────►│ aixautosdk::core 驱动 │
└─────┬──────┘ └────────┬─────────┘
│ HTTP /api/* │ adb/WDA/sidecar
▼ ▼
前端 / 其它应用 Android / iOS / Desktop- aixautobot SDK(crate
aixautosdk)= 节点:负责真实设备发现、驱动构建、Flow 执行、屏幕镜像。 - backend = 瘦网关:持久化 + 排队 + 把运行/设备操作转发给拥有该设备的节点;不依赖 SDK。
- 其它应用(含桌面端):像普通客户端一样接入——要么嵌入
aixautosdkcrate 直接驱动设备,要么运行aixautobot node并通过 backend 操作设备。
节点协议(/ws/node)
节点与网关通过单条 WebSocket 双向通信。
节点 → backend:
Hello{token,node_name,devices}、Heartbeat、RunEvent{run_id,device_id,event}、DeviceOpResult{req_id,ok,result,error}、CmdResult{req_id,ok,result,error}、FridaEvent{run_id,device_id,name,data}、DeviceTunnelData{stream_id,b64}、DeviceTunnelClose{stream_id}、MacEnvEvent{req_id,event}(mac-env 流式进度,event 与 RunEvent 同构:started/step/log/finished)。
backend → 节点:
Welcome{node_id}、Dispatch{run_id,device_id,flow}、DeviceOp{req_id,device_id,op}、Cancel{run_id}、Error,以及设备控制通道消息:AdbExec、WdaReq、FridaRun、FridaCall、FridaCancel、DeviceTunnelOpen/Data/Close,以及 Mac 环境底座消息:MacEnvSetup{req_id}、MacEnvStatus{req_id}、MacEnvTeardown{req_id,purge}(仅 macOS 节点执行,其余返回干净的 “not supported on this host”)。
⚠️ 两份
protocol.rs(backend/src/node/protocol.rs与sdk/aixautosdk/src/node/protocol.rs)无共享 contract crate,靠各自的 round-trip 测试锁形:新增/改动任一消息务必两处一起改。AdbExec/WdaReq默认随节点nodefeature 生效;Frida*仅在节点以--features frida构建时真正执行,否则返回CmdResult{ok:false,error:"frida not enabled…"}。
WebRTC 屏幕镜像
节点发起 offer,浏览器作为 viewer 收画面;信令走 /ws/signal,ICE 走 /api/ice。单设备最大查看端由 AIXAUTOSDK_MAX_VIEWERS 控制(默认 4)。详见 设备 / 账号 / 任务 API。