add initial AI ball protocol docs

This commit is contained in:
姚章浩
2026-06-18 18:22:20 +08:00
parent 40e184cc6c
commit 753a000eeb
7 changed files with 404 additions and 19 deletions
+72
View File
@@ -0,0 +1,72 @@
# AI球项目架构初稿
本文档描述 AI球项目的初版系统架构,用于后续设备端、PC 上位机、应援脚本、资源包和出厂测试协作对齐。
## 1. 目标
- 支持 AI球设备播放灯效、音效、表情或动作反馈。
- 支持 PC 上位机进行设备管理、内容同步和测试控制。
- 支持演唱会/活动现场通过应援脚本驱动多台设备同步表现。
- 支持资源包分发和版本管理。
- 支持出厂测试流程记录设备是否合格。
## 2. 模块划分
### 2.1 设备端
设备端运行在 AI球硬件上,负责:
- 接收 PC 上位机或同步播放器下发的控制命令。
- 管理本地状态机,例如空闲、连接、同步播放、测试、异常。
- 播放资源包中的灯效、音频、表情或动作资源。
- 执行出厂自检项目并返回结果。
### 2.2 PC 上位机
PC 上位机用于生产、调试和现场运行:
- 扫描并连接 AI球设备。
- 下发设备控制命令和同步播放状态。
- 导入、校验和分发应援脚本及资源包。
- 执行出厂测试并导出测试报告。
### 2.3 应援脚本
应援脚本描述指定时间点的表现动作:
-`content_id` 标识一场内容或曲目。
-`time_ms` 表示相对播放时间。
- 动作类型可包括灯效、音效、表情、震动或组合动作。
- 脚本应能被 PC 上位机校验,并被设备端按时间轴执行。
### 2.4 资源包
资源包用于承载设备端执行所需资源:
- 包含资源清单、版本号、资源路径和校验信息。
- 可被 PC 上位机导入并分发到设备。
- 设备端应校验资源包版本和资源完整性。
### 2.5 出厂测试
出厂测试用于首批设备生产验证:
- 覆盖烧录、自检、屏幕/灯效、喇叭、麦克风、按键、无线充电、通信和应援脚本播放。
- 每台设备应产生唯一测试记录。
- 不合格设备应记录失败项和复测结果。
## 3. 初版数据流
1. 内容制作方生成应援脚本和资源包。
2. PC 上位机导入并校验脚本/资源包。
3. PC 上位机将资源包分发到 AI球设备。
4. 演出或测试时,PC 上位机下发同步状态和播放进度。
5. 设备端根据本地资源和脚本时间轴执行表现动作。
6. 生产阶段 PC 上位机采集出厂测试结果并生成报告。
## 4. 待确认问题
- 设备端通信链路采用 USB、BLE、Wi-Fi 还是组合方案。
- 多设备同步精度目标。
- 资源包压缩格式和签名机制。
- 出厂测试报告的最终存储位置和格式。
+56 -1
View File
@@ -1,3 +1,58 @@
# 演唱会播放同步协议 # 演唱会播放同步协议
用于定义 PC 同步播放器如何向 AI球同步 content_idposition_ms、state、speed。 本文档定义 PC 同步播放器如何向 AI球设备同步 `content_id``position_ms``state``speed`
## 1. 目标
- 支持多台 AI球在演唱会或活动现场按同一时间轴执行应援脚本。
- 支持播放、暂停、停止、跳转和倍速等基础同步控制。
- 允许设备端根据本地资源包和应援脚本独立执行动作。
## 2. 同步消息
```json
{
"content_id": "concert-demo-001",
"state": "playing",
"position_ms": 30000,
"speed": 1.0,
"sent_at_ms": 1710000000000
}
```
## 3. 字段说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `content_id` | string | 当前曲目、节目或应援内容 ID。 |
| `state` | string | `playing``paused``stopped` 之一。 |
| `position_ms` | integer | 当前内容播放进度,单位毫秒。 |
| `speed` | number | 播放速度,默认 `1.0`。 |
| `sent_at_ms` | integer | PC 上位机发送时间戳,用于延迟估计。 |
## 4. 设备端处理流程
1. 校验 `content_id` 是否存在于本地资源包和应援脚本中。
2. 根据 `state` 进入播放、暂停或停止逻辑。
3. 使用 `position_ms` 对齐本地脚本时间轴。
4. 根据 `speed` 调整后续动作触发时间。
5. 若资源缺失或状态冲突,返回错误码并保持安全状态。
## 5. 同步策略初稿
- PC 上位机应周期性发送同步消息,例如每 500ms 一次。
- 设备端可根据最近一次消息校准本地播放进度。
- 当进度跳变超过阈值时,设备端应跳转到新的 `position_ms`
- 当状态变为 `stopped` 时,设备端应停止当前表现并清理临时动作。
## 6. 与应援脚本关系
- 应援脚本定义 `time_ms` 和动作内容。
- 同步协议只负责广播当前播放位置和状态。
- 设备端根据同步位置选择应执行的脚本动作。
## 7. 待确认问题
- 多设备同步精度目标,例如 50ms、100ms 或 200ms。
- 时钟同步方案是否需要 NTP、主机时间戳或设备本地校准。
- 丢包、断连和重连后的补偿策略。
+77 -1
View File
@@ -1,3 +1,79 @@
# AI球设备控制协议 # AI球设备控制协议
用于定义上位机、播放器测试工具如何控制 AI球。 本文档定义 PC 上位机、同步播放器测试工具控制 AI球设备的初版 API 约定
## 1. 设计原则
- 命令结构简单,便于串口、USB、BLE 或网络传输适配。
- 每条请求应包含 `request_id`,便于上位机匹配响应。
- 设备响应应包含 `ok``error_code` 和必要数据。
- 不在协议中传输 token、密码或 API key。
## 2. 通用消息格式
### 请求
```json
{
"request_id": "req-001",
"command": "device.ping",
"params": {}
}
```
### 响应
```json
{
"request_id": "req-001",
"ok": true,
"error_code": null,
"data": {}
}
```
## 3. 初版命令
| 命令 | 方向 | 用途 |
| --- | --- | --- |
| `device.ping` | PC -> 设备 | 检查设备在线状态。 |
| `device.info` | PC -> 设备 | 读取设备型号、固件版本、序列号。 |
| `device.state.get` | PC -> 设备 | 读取当前状态机状态。 |
| `resource.pack.info` | PC -> 设备 | 读取当前资源包信息。 |
| `resource.pack.prepare` | PC -> 设备 | 准备接收或校验资源包。 |
| `play.sync` | PC -> 设备 | 下发同步播放状态。 |
| `play.stop` | PC -> 设备 | 停止当前播放并回到可控状态。 |
| `factory.test.start` | PC -> 设备 | 开始出厂测试。 |
| `factory.test.result` | PC -> 设备 | 读取出厂测试结果。 |
## 4. 示例:同步播放
```json
{
"request_id": "req-100",
"command": "play.sync",
"params": {
"content_id": "concert-demo-001",
"state": "playing",
"position_ms": 12345,
"speed": 1.0
}
}
```
## 5. 错误码初稿
| 错误码 | 说明 |
| --- | --- |
| `INVALID_COMMAND` | 未知命令。 |
| `INVALID_PARAMS` | 参数缺失或格式错误。 |
| `RESOURCE_NOT_READY` | 资源包未准备好。 |
| `STATE_CONFLICT` | 当前状态不允许执行该命令。 |
| `FACTORY_TEST_FAILED` | 出厂测试存在失败项。 |
| `INTERNAL_ERROR` | 设备内部错误。 |
## 6. 待确认问题
- 传输层帧格式和最大消息大小。
- 大资源包传输是否独立于控制协议。
- 设备序列号和生产批次字段格式。
+65 -1
View File
@@ -1,3 +1,67 @@
# AI球出厂测试标准 # AI球出厂测试标准
用于定义首批 100 台设备的烧录、自检、屏幕、喇叭、麦克风、按键、无线充电和应援脚本测试标准 本文档定义 AI球设备出厂测试的初版项目、流程和判定标准,用于首批设备生产验证
## 1. 测试目标
- 确认每台设备完成固件烧录和基础配置。
- 确认核心硬件模块可用。
- 确认设备能与 PC 上位机通信并执行应援脚本。
- 输出可追溯的测试结果,区分合格、失败和待复测。
## 2. 测试环境
- PC 上位机测试工具。
- 标准测试资源包。
- 标准应援脚本。
- 设备序列号或生产批次标识。
## 3. 测试项目
| 项目 | 说明 | 初版判定 |
| --- | --- | --- |
| 固件烧录 | 写入指定版本固件。 | 版本读取一致。 |
| 设备自检 | 启动后执行内部自检。 | 返回 `ok=true`。 |
| 灯效/屏幕 | 显示指定颜色、亮度或图案。 | 观察或传感器检测通过。 |
| 喇叭 | 播放标准提示音。 | 音频输出正常。 |
| 麦克风 | 采集测试音频。 | 音量或频率检测达标。 |
| 按键 | 检测按下和释放事件。 | 事件顺序正确。 |
| 无线充电 | 检测充电状态。 | 能进入充电状态。 |
| 通信 | PC 上位机连接和命令往返。 | ping 和 info 命令正常。 |
| 资源包 | 导入并校验标准资源包。 | 校验成功。 |
| 应援脚本 | 执行标准脚本片段。 | 动作按时间轴触发。 |
## 4. 测试流程
1. 扫描或录入设备序列号。
2. 烧录固件并读取版本。
3. 执行设备自检。
4. 分项测试灯效/屏幕、喇叭、麦克风、按键和无线充电。
5. 连接 PC 上位机并执行通信测试。
6. 下发标准资源包和应援脚本。
7. 执行短时同步播放测试。
8. 生成测试结果并标记合格或失败。
## 5. 测试结果格式初稿
```json
{
"device_sn": "AIBALL-000001",
"firmware_version": "0.1.0",
"result": "pass",
"failed_items": [],
"tested_at": "2026-01-01T00:00:00Z"
}
```
## 6. 失败处理
- 单项失败时记录失败项和错误码。
- 允许维修后复测,并保留复测次数。
- 关键项失败的设备不得进入包装流程。
## 7. 待确认问题
- 自动化检测设备的型号和接口。
- 测试报告最终保存格式:JSON、CSV 或数据库。
- 首批 100 台设备的抽检和全检策略。
+43 -1
View File
@@ -1,3 +1,45 @@
# AI球状态机 # AI球状态机
用于定义 AI球设备端状态、状态切换和默认反馈 本文档定义 AI球设备端的初版状态机,用于统一设备行为、PC 上位机控制和出厂测试流程
## 1. 状态列表
| 状态 | 说明 |
| --- | --- |
| `BOOTING` | 设备启动中,初始化硬件和本地配置。 |
| `IDLE` | 空闲待机,可被发现或等待连接。 |
| `CONNECTED` | 已连接 PC 上位机或同步播放器。 |
| `RESOURCE_READY` | 已完成资源包校验,可执行应援脚本。 |
| `SYNC_PLAYING` | 正在按同步协议执行应援脚本。 |
| `PAUSED` | 播放暂停,保留当前进度。 |
| `FACTORY_TEST` | 正在执行出厂测试。 |
| `ERROR` | 发生错误,需要上报错误码并等待恢复。 |
## 2. 主要状态切换
| 当前状态 | 事件 | 下一状态 | 说明 |
| --- | --- | --- | --- |
| `BOOTING` | 初始化成功 | `IDLE` | 设备完成启动。 |
| `IDLE` | 建立连接 | `CONNECTED` | PC 上位机接入。 |
| `CONNECTED` | 资源包校验成功 | `RESOURCE_READY` | 可进入同步播放。 |
| `RESOURCE_READY` | 收到播放命令 | `SYNC_PLAYING` | 根据 `content_id``position_ms` 开始执行。 |
| `SYNC_PLAYING` | 收到暂停命令 | `PAUSED` | 暂停当前表现。 |
| `PAUSED` | 收到继续命令 | `SYNC_PLAYING` | 从指定进度继续。 |
| 任意状态 | 进入出厂测试 | `FACTORY_TEST` | 生产或维修流程触发。 |
| 任意状态 | 发生严重错误 | `ERROR` | 记录错误码并停止危险动作。 |
| `ERROR` | 重置成功 | `IDLE` | 清理错误后恢复待机。 |
## 3. 设备端默认行为
- 进入 `BOOTING` 时执行硬件初始化和配置加载。
- 进入 `IDLE` 时关闭非必要高功耗模块。
- 进入 `SYNC_PLAYING` 时按应援脚本时间轴触发动作。
- 进入 `FACTORY_TEST` 时禁止普通播放命令干扰测试流程。
- 进入 `ERROR` 时上报错误码,并尽量保持安全可恢复状态。
## 4. 与其他模块关系
- PC 上位机负责触发连接、资源分发、播放控制和出厂测试。
- 应援脚本定义 `SYNC_PLAYING` 状态下的时间轴动作。
- 资源包必须在 `RESOURCE_READY` 前完成完整性校验。
- 出厂测试应覆盖主要状态切换是否可靠。
+52 -10
View File
@@ -1,23 +1,65 @@
{ {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "AI Ball Call Script Schema", "title": "AI Ball Call Script Schema",
"description": "Initial schema for AI球 concert/support call scripts executed by devices according to a playback timeline.",
"type": "object", "type": "object",
"required": ["content_id", "title", "duration_ms", "actions"], "additionalProperties": false,
"required": ["content_id", "title", "version", "duration_ms", "actions"],
"properties": { "properties": {
"content_id": { "type": "string" }, "content_id": {
"title": { "type": "string" }, "type": "string",
"duration_ms": { "type": "integer" }, "minLength": 1,
"description": "Unique content or song identifier."
},
"title": {
"type": "string",
"minLength": 1
},
"version": {
"type": "string",
"minLength": 1
},
"duration_ms": {
"type": "integer",
"minimum": 0
},
"resource_pack_id": {
"type": "string",
"description": "Optional expected resource pack id."
},
"actions": { "actions": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
"additionalProperties": false,
"required": ["time_ms", "type", "value"], "required": ["time_ms", "type", "value"],
"properties": { "properties": {
"time_ms": { "type": "integer" }, "time_ms": {
"type": { "type": "string" }, "type": "integer",
"value": { "type": "string" }, "minimum": 0
"duration_ms": { "type": "integer" }, },
"intensity": { "type": "number" }, "type": {
"silent_alt": { "type": "string" } "type": "string",
"enum": ["light", "sound", "expression", "vibration", "combo"]
},
"value": {
"type": "string",
"minLength": 1,
"description": "Resource id, preset name, or simple command value."
},
"duration_ms": {
"type": "integer",
"minimum": 0
},
"intensity": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"silent_alt": {
"type": "string",
"description": "Fallback behavior when sound output should be muted."
}
} }
} }
} }
+39 -5
View File
@@ -1,19 +1,53 @@
{ {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "AI Ball Resource Pack Schema", "title": "AI Ball Resource Pack Schema",
"description": "Initial schema for AI球 resource packs used by devices and the PC host application.",
"type": "object", "type": "object",
"additionalProperties": false,
"required": ["pack_id", "version", "resources"], "required": ["pack_id", "version", "resources"],
"properties": { "properties": {
"pack_id": { "type": "string" }, "pack_id": {
"version": { "type": "string" }, "type": "string",
"minLength": 1
},
"version": {
"type": "string",
"minLength": 1
},
"target_firmware": {
"type": "string",
"description": "Optional compatible firmware version or range."
},
"description": {
"type": "string"
},
"resources": { "resources": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
"additionalProperties": false,
"required": ["id", "type", "path"], "required": ["id", "type", "path"],
"properties": { "properties": {
"id": { "type": "string" }, "id": {
"type": { "type": "string" }, "type": "string",
"path": { "type": "string" } "minLength": 1
},
"type": {
"type": "string",
"enum": ["audio", "image", "animation", "light_preset", "expression", "other"]
},
"path": {
"type": "string",
"minLength": 1
},
"sha256": {
"type": "string",
"pattern": "^[A-Fa-f0-9]{64}$"
},
"size_bytes": {
"type": "integer",
"minimum": 0
}
} }
} }
} }