|
| 1 | +# v1.0.0 设备注册与激活 |
| 2 | + |
| 3 | +## 1. 目标 |
| 4 | + |
| 5 | +本章节说明 `apps/xiaozhi` 如何完成以下工作: |
| 6 | + |
| 7 | +- 生成或读取设备身份 |
| 8 | +- 向 OTA 服务发起配置检查 |
| 9 | +- 根据服务端返回内容执行激活 |
| 10 | +- 将返回的 WebSocket 或 MQTT 配置落地到本地设置 |
| 11 | + |
| 12 | +## 2. 设备注册所需身份字段 |
| 13 | + |
| 14 | +代码位置:`apps/xiaozhi/src/xiaozhi_ota.c`、`apps/xiaozhi/src/cli_cmd.c` |
| 15 | + |
| 16 | +主要字段如下: |
| 17 | + |
| 18 | +- `Device-Id` |
| 19 | + - 设备标识 |
| 20 | + - 会放在 OTA 请求头中 |
| 21 | + - 也可通过 `xz_sys device_id <value>` 手动写入 |
| 22 | +- `Client-Id` |
| 23 | + - 客户端实例标识 |
| 24 | + - 会放在 OTA 请求头中 |
| 25 | + - 也可通过 `xz_sys client_id <value>` 手动写入 |
| 26 | +- `Serial-Number` |
| 27 | + - 可选 |
| 28 | + - 用于切换到激活 v2 逻辑 |
| 29 | + - 可通过 `xz_sys serial_number <value>` 写入 |
| 30 | +- `activation_secret` |
| 31 | + - 可选 |
| 32 | + - 在服务端下发 `challenge` 时用来计算 HMAC |
| 33 | + - 可通过 `xz_sys activation_secret <value>` 写入 |
| 34 | + |
| 35 | +查看当前身份配置: |
| 36 | + |
| 37 | +```bash |
| 38 | +xz_sys show |
| 39 | +``` |
| 40 | + |
| 41 | +## 3. OTA 配置检查流程 |
| 42 | + |
| 43 | +代码位置:`apps/xiaozhi/src/xiaozhi_ota.c` |
| 44 | + |
| 45 | +默认 OTA 地址: |
| 46 | + |
| 47 | +```text |
| 48 | +https://api.tenclass.net/xiaozhi/ota/ |
| 49 | +``` |
| 50 | + |
| 51 | +也可以通过以下方式覆盖: |
| 52 | + |
| 53 | +```bash |
| 54 | +xz_ota url https://your.server/xiaozhi/ota/ |
| 55 | +``` |
| 56 | + |
| 57 | +或使用环境变量: |
| 58 | + |
| 59 | +```bash |
| 60 | +XZ_OTA_URL=https://your.server/xiaozhi/ota/ |
| 61 | +``` |
| 62 | + |
| 63 | +触发配置检查: |
| 64 | + |
| 65 | +```bash |
| 66 | +xz_ota check |
| 67 | +``` |
| 68 | + |
| 69 | +## 4. OTA check 请求内容 |
| 70 | + |
| 71 | +### 4.1 HTTP 头 |
| 72 | + |
| 73 | +当前实现会发送以下关键请求头: |
| 74 | + |
| 75 | +- `Activation-Version` |
| 76 | +- `Device-Id` |
| 77 | +- `Client-Id` |
| 78 | +- `Serial-Number` |
| 79 | +- `User-Agent` |
| 80 | +- `Accept-Language` |
| 81 | +- `Content-Type` |
| 82 | + |
| 83 | +其中 `Activation-Version` 的判断规则是: |
| 84 | + |
| 85 | +- 有 `serial_number` 时,使用 `2` |
| 86 | +- 没有 `serial_number` 时,使用 `1` |
| 87 | + |
| 88 | +### 4.2 请求体 |
| 89 | + |
| 90 | +请求体为 JSON,主要包含: |
| 91 | + |
| 92 | +- 顶层基础字段: |
| 93 | + - `version` |
| 94 | + - `language` |
| 95 | + - `flash_size` |
| 96 | + - `minimum_free_heap_size` |
| 97 | + - `mac_address` |
| 98 | + - `uuid` |
| 99 | + - `chip_model_name` |
| 100 | +- 子对象: |
| 101 | + - `chip_info` |
| 102 | + - `application` |
| 103 | + - `partition_table` |
| 104 | + - `ota` |
| 105 | + - `display` |
| 106 | + - `board` |
| 107 | + |
| 108 | +这些字段用于让 OTA 服务判断: |
| 109 | + |
| 110 | +- 设备型号和板型 |
| 111 | +- 当前运行版本 |
| 112 | +- 是否需要升级 |
| 113 | +- 是否应该下发 MQTT 或 WebSocket 配置 |
| 114 | +- 是否需要激活 |
| 115 | + |
| 116 | +## 5. OTA 返回内容与本地落地 |
| 117 | + |
| 118 | +服务端可能返回以下对象: |
| 119 | + |
| 120 | +- `mqtt` |
| 121 | +- `websocket` |
| 122 | +- `activation` |
| 123 | +- `firmware` |
| 124 | + |
| 125 | +应用会根据返回内容写入本地设置空间: |
| 126 | + |
| 127 | +- `mqtt` 写入 `XZ_NS_MQTT` |
| 128 | +- `websocket` 写入 `XZ_NS_WS` |
| 129 | +- 选中的协议写入协议设置 |
| 130 | + |
| 131 | +协议选择规则: |
| 132 | + |
| 133 | +- 如果返回 `mqtt`,优先使用 `mqtt-udp` |
| 134 | +- 否则如果返回 `websocket`,使用 `websocket` |
| 135 | + |
| 136 | +## 6. 激活流程 |
| 137 | + |
| 138 | +### 6.1 两种激活模式 |
| 139 | + |
| 140 | +服务端可返回 `activation` 对象,其中可能包括: |
| 141 | + |
| 142 | +- `message` |
| 143 | +- `code` |
| 144 | +- `challenge` |
| 145 | +- `timeout_ms` |
| 146 | + |
| 147 | +当前支持两种激活方式: |
| 148 | + |
| 149 | +1. 激活码展示 |
| 150 | + - 服务端下发 `code` |
| 151 | + - 设备向用户展示激活码 |
| 152 | + - 用户在配套平台完成绑定 |
| 153 | + |
| 154 | +2. challenge 应答激活 |
| 155 | + - 服务端下发 `challenge` |
| 156 | + - 设备使用 `activation_secret` 计算 HMAC |
| 157 | + - 再向 OTA 服务发起 activate 请求 |
| 158 | + |
| 159 | +### 6.2 激活 v1 与 v2 |
| 160 | + |
| 161 | +- v1:没有 `serial_number` |
| 162 | + - 激活请求体通常为空对象 `{}` |
| 163 | +- v2:有 `serial_number` |
| 164 | + - 激活请求体包含: |
| 165 | + - `algorithm` |
| 166 | + - `serial_number` |
| 167 | + - `challenge` |
| 168 | + - `hmac` |
| 169 | + |
| 170 | +## 7. 典型注册与激活操作步骤 |
| 171 | + |
| 172 | +### 7.1 手动注入身份并发起检查 |
| 173 | + |
| 174 | +```bash |
| 175 | +xz_sys device_id your_device_id |
| 176 | +xz_sys client_id your_client_id |
| 177 | +xz_sys serial_number your_serial |
| 178 | +xz_sys activation_secret your_secret |
| 179 | +xz_ota check |
| 180 | +``` |
| 181 | + |
| 182 | +### 7.2 仅依赖 OTA 自动下发协议配置 |
| 183 | + |
| 184 | +```bash |
| 185 | +xz_ota check |
| 186 | +xz_status |
| 187 | +``` |
| 188 | + |
| 189 | +如果 OTA 已返回 MQTT 或 WebSocket 配置,本地就会得到对应参数。 |
| 190 | + |
| 191 | +## 8. 注册成功后会发生什么 |
| 192 | + |
| 193 | +完成 OTA 检查和激活后,应用进入可连接状态,后续通常会: |
| 194 | + |
| 195 | +1. 依据协议设置选择 `websocket` 或 `mqtt-udp` |
| 196 | +2. 创建控制通道 |
| 197 | +3. 发起 `hello` |
| 198 | +4. 收到服务端 `hello` |
| 199 | +5. 进入 listen / tts / mcp 正常交互 |
| 200 | + |
| 201 | +## 9. 常见注意事项 |
| 202 | + |
| 203 | +- 没有 `serial_number` 时,不会走激活 v2。 |
| 204 | +- 没有 `activation_secret` 时,challenge 激活无法完成。 |
| 205 | +- OTA 只负责下发配置和升级信息,不等于语音会话已建立。 |
| 206 | +- OTA 成功后仍需执行协议连接流程。 |
0 commit comments