方式 B:作为节点
节点接入 backend、设备发现、云设备创建
节点会:发现本机设备 → 以 /ws/node 注册(上报设备清单)→ 接收并执行派发的 Flow、响应设备操作 RPC(DeviceOp)、推送运行事件与心跳;开启 webrtc 时为每台设备起媒体会话。
设备发现
节点始终枚举本机所有 adb 可见设备(USB 真机 + 虚拟/模拟器),不区分、无需指定 android。每台 adb 设备 meta 带 platform:"android"(驱动选择器)+ transport:"usb"|"virtual"。best-effort——缺 adb 只告警不致命。Desktop / iOS 为 opt-in,经 AIXAUTOSDK_NODE_PLATFORMS 显式开启。
1. 在 backend 签发 node token
节点归属注册它的调用方:必须带身份(项目 key/secret → 解析为该项目的代表用户,或用户 JWT bearer)。匿名注册返回 401。该节点上报的设备即归该用户。
curl -sX POST http://<backend>/api/nodes \
-H 'Content-Type: application/json' \
-H 'X-Project-Key: <PROJECT_KEY>' -H 'X-Project-Secret: <PROJECT_SECRET>' \
-d '{"name":"lab-node-1"}'
# → {"id":"...","token":"<NODE_TOKEN>"} token 仅此一次返回,妥善保存2. 运行节点
AIXAUTOSDK_BACKEND_WS=ws://<backend>:3000 \
AIXAUTOSDK_NODE_TOKEN=<NODE_TOKEN> \
AIXAUTOSDK_NODE_NAME=lab-node-1 \
./aixautobot node| 变量 | 必填 | 默认 / 说明 |
|---|---|---|
AIXAUTOSDK_NODE_TOKEN | ✅ | backend 签发的节点 token |
AIXAUTOSDK_BACKEND_WS | ws://localhost:3000 | |
AIXAUTOSDK_NODE_NAME | 默认取 $HOSTNAME | |
AIXAUTOSDK_NODE_PLATFORMS | 可选。adb 设备始终自动枚举;仅当要额外接入 desktop / ios 时填逗号列表 | |
AIXAUTOSDK_IOS_WDA_URL | ios opt-in 时 | 启用 ios 后端需设置 WDA 地址 |
AIXAUTOSDK_MAX_VIEWERS | WebRTC 单设备最大查看端,默认 4 |
3. 嵌入自己的二进制(可选)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
aixautosdk::node::run().await // 读取上述 env,自带退避重连
}iOS 与虚拟 iOS(vphone)
两条 lane 均默认关闭、与 redroid 平行。iOS 一律按真机对待——无论物理机还是 vphone 云手机,上线后都经 usbmuxd/WDA 走统一的设备操作路径。
| Feature | 作用 | 设备 | 宿主 |
|---|---|---|---|
ios | 真机 iOS(go-ios 驱动) | USB 连接的 iPhone/iPad | 装有 go-ios(ios 二进制)的主机 |
vphone | 虚拟 iOS 云手机(外部 vphone-cli) | iOS VM | Apple Silicon + macOS 15+、关闭 SIP/AMFI |
- 路由:
provision按spec.platform="ios"/kind="vphone"走 vphone 创建(真机 iOS 只发现、不创建);power/device_control按设备 id 命名空间路由——ios-<udid>→ 真机 iOS,已注册的 vphone 实例 → vphone,其余 → redroid。功能未启用时返回明确的 “not enabled” 错误。 - 开启
iosfeature 时 helper 为唯一权威源:按udid枚举、为每台设备把 WDA 转发到各自独立的本地端口,设备 id =ios-<udid>。相关 env:AIXAUTOSDK_IOS_PYTHON、AIXAUTOSDK_IOS_USBMUXD、AIXAUTOSDK_IOS_WDA_LOCAL_PORT/_DEVICE_PORT。 - vphone 相关 env:
AIXAUTOSDK_VPHONE_CLI(预编译且签名的绝对路径)、AIXAUTOSDK_VPHONE_INSTANCES_DIR、AIXAUTOSDK_VPHONE_IPSW等。 - 能力上报:
Hello.capabilities含ios_capable/vphone_capable/redroid_capable,供后端按节点能力调度。
云设备创建:代理与安装包
创建云设备(POST /api/devices/provision)的 spec 支持两个平台无关的可选输入,设备上线后由节点自动应用:
| 字段 | 形态 | 说明 |
|---|---|---|
proxy | string(URL) | 代理地址。redroid 走原生 settings put global http_proxy;vphone/iOS 安装一份全局 HTTP 代理描述文件 |
packages | [{software, version?}] | 按 software + version 安装的包数组。version 省略时由平台管理员默认版本补齐 |
{
"platform": "ios", "name": "vm-01",
"proxy": "http://10.0.0.1:7890",
"packages": [
{ "software": "com.foo.app", "version": "1.2.3" },
{ "software": "com.bar.app" }
]
}- 解析器:节点按
(platform, software, version)向AIXAUTOSDK_PKG_RESOLVER指向的解析服务取包,下载并校验 sha256 后安装。 - 应用时机:provision 创建并
ensure_online后逐包安装 + 应用代理,best-effort——单项失败只告警、不致 provision 失败。
Mac 环境底座(aixautobot mac-env)
macOS 上把“装 lima → 建 Ubuntu VM → 加载 binder → 装 docker”这套环境底座固化为一键命令,使现有 redroid 创建路径开箱即用。只做底座,不创建设备、不注册节点。
aixautobot mac-env setup --json # 一键配置,逐行输出进度
aixautobot mac-env status --json # 只探测,报每步 ok|missing
aixautobot mac-env teardown [--purge]# 停 VM;--purge 连磁盘一起删setup 成功后产出 AIXAUTOSDK_DOCKER_SOCKET 与 AIXAUTOSDK_INSTANCES_DIR 两个变量;让本机 node 进程带上它们,之后走现有 POST /api/devices/provision 即可在该 VM 内创建 redroid 云手机。