TRANSSION IoT × a4x · IPC · L1→L3 迁移
Migration Plan · v0.5 · 待评审

L1→L3 迁移:对用户几乎无感,分阶段推进

这份文档只讲两件事:① 从用户视角,把设备从「a4x authority」切到「传音 authority」的过程,在绝大多数情况下完全无感——并用三种请求路径(只读属性 / 写设置 / 媒体)对照切换前后的 authority 归属,看清切换改了什么、没改什么;② 项目怎么分阶段推进,每个阶段交付哪些功能。切换的技术内核(role switch / rollback / 阻挡机制)作为技术附录另述。

切换 换控制权 · 不搬用户数据 视频 永远在原处 · 切换不碰 体验 机主与已更新用户零感知 回滚 随时可回 · 用户侧自动恢复

1用户视角:切换几乎无感

迁移换的是「设备听谁的」(控制权),不是搬用户的东西。视频、录像永远留在原处;切换只是控制面的一次翻转,设备照常工作。对绝大多数用户来说,切换发生了他们也不会察觉。

为什么无感

🎥 媒体永不受影响

直播、回放、云端录像始终在同一处,切换完全不碰媒体。看直播、翻历史录像不会中断、不会丢。

🔄 App 自动跟随

事件与设置在切换点自动迁移,App 自动切到新的数据来源。用户不需要做任何操作,也不用重新绑定。

↩️ 可随时回滚

切换后设有回滚窗口,一旦异常可秒级切回;对用户侧同样是自动恢复,不需要用户介入。

不同用户在切换时看到什么

用户App 版本切换时的体验
机主 已更新(常态) 完全无感 直播 / 事件 / 设置一切照旧,察觉不到切换发生。
被共享成员 已更新 完全无感 与机主一致,无任何变化。
被共享成员 旧版未更新 直播 / 回放照常能看;打开设备状态或改设置时,会看到一次「请升级 App」提示。升级后一切恢复正常。
为什么说「绝大多数无痛」

机主和已更新的用户零感知;唯一会遇到一次提示的,是还在用旧版 App 的被共享用户——而且他仍然能看直播,只是查看设备状态 / 改设置时被引导升级,升级后即恢复。整个过程没有任何用户需要重新绑定设备、也不会丢失任何视频或历史。

切换的前提(保证无感的条件)

一台设备开始切换,需要满足两个前提:① 设备已通过 OTA 升级到支持新模式的固件(升级后先「休眠待命」,仍按老模式运行,用户无感);② 机主的 App 已是新版本。两者就绪后才对该设备执行切换——这正是「机主无感、切换即成功」的保障。

2三种请求路径(按 authority 归属)

这三种请求在 a4x 的架构里落到两套不同的平台:只读属性、写设置属于会参与角色切换的 IoT Platform;媒体(直播/回看/AI)属于永不参与切换的 IPC Capability Platformauthority 归属是每设备独立的——在 L3 迁移窗口内,全量设备里两种 authority 并存,由 Role Manifest 逐设备决定控制面走哪套 IoT Platform。下图用 Authority / Projection Slot 表示:控制面永远发给 Authority Slot,只是哪套平台坐这个槽位随该设备状态翻转;媒体则永远走 a4x。谁切、何时切、怎么回滚见 §3

🧭
路由大脑 · Role Manifest:App 每次打开设备先读云端 Role Manifest(runtimeAuthority / roleEpoch / route),据此把控制面请求路由到该设备当前 authority——同一个 App 里,设备 A 可能走 a4x、设备 B 走传音;媒体请求永远走 a4x IPC Capability Platform,不看 manifest。固件同样按 authority route 连接。
📱 App · 固件 按该设备 Role Manifest 的 runtimeAuthority 路由——每设备可能不同(同一 App 里,设备 A 走 a4x、设备 B 走传音)。
控制面(只读属性 · 写设置) → 永远发给 Authority Slot(=当前 authority)
Authority Slot · 当前 authority · 可读写
未切 / 未达标 坐这里的是 a4x IoT Platform
已切换 坐这里的是 传音 IoT Platform
Device Shadow · 属性/desired 绑定 · device card 事件摘要 command ingress
Projection Bridge
两套平台随该设备
roleEpoch 互换槽位
(可切 / 可回滚)
Projection Slot · 只读镜像
未切 / 未达标 坐这里的是 传音 IoT Platform
已切换 坐这里的是 a4x IoT Platform
只读镜像 + 回滚料 projection 侧的写经 command ingress 回流 authority
媒体(直播 · 回看) → 永远 a4x IPC Capability Platform(不进槽位、从不切换)
a4x IPC Capability Platform 永久独立
WebRTC · 直播 GASS / DEM · 回看·录像·事件 AI · 识别/tags
请求类型命中的功能节点(a4x 设计)authority=a4x
(未切)
authority=传音
(已切)
是否变
只读属性
状态/在线/device card/事件摘要
IoT Platform · Device Shadow(reported) / device card / 事件摘要 a4x IoT
Authority
传音 IoT
Authority
换 Slot
写设置
灵敏度/布防/侦测区域
IoT Platform · Device Shadow(desired);projection 侧改动经 command ingress 回流 authority a4x IoT
Authority
传音 IoT
Authority
换 Slot
媒体
直播/回看/录像/AI
IPC Capability Platform · WebRTC / GASS / DEM / AI(media token + traceId a4x IPC Cap. a4x IPC Cap. 不变
这张对照解释了「为什么无感」

切换只是让控制面(只读属性 + 写设置)在两套 IoT Platform 之间换 Authority Slot——非 authority 的一侧经 Projection Bridge 保留只读镜像;对新版 App 是按 Role Manifest 自动路由的,用户看不到。媒体走的 IPC Capability Platform(WebRTC/GASS/DEM/AI)从不参与切换,直播、回看在切换前后是同一条 a4x 通道,不中断、不丢;事件只用 traceId 引用视频对象。

旧版被共享 App 的例外

唯一会看到差别的情况:切换后,旧版 App 的被共享用户走「只读属性 / 写设置」时仍朝 a4x 的 IoT Platform 发——而 a4x 此时是 projection、不是 authority,会回一个 migrated(请升级)。它的媒体路径(IPC Capability)不受影响,直播照常。升级后 App 按 Role Manifest 走传音,三条路径全部恢复(阻挡机制详见技术附录《老 App 阻挡》)。

3authority 归属与切换过程

authority 归属是每设备决定的,不是「整个 L3 阶段一刀切」。设备默认 authority 在 a4x;只有同时满足准入门、并被 Migration Control Plane 触发,才切到传音。加上灰度分批与可回滚,所以在 L3 迁移窗口内,全量设备是混合态——一部分 authority 仍在 a4x,一部分已在传音。

全量设备(迁移窗口内)· Role Manifest 逐设备判定 → 📷 dev-1 · a4x 📷 dev-2 · 传音 📷 dev-3 · a4x 📷 dev-4 · 传音 📷 dev-5 · a4x 📷 dev-6 · 传音

控制面 authority 两种并存(上图颜色);媒体无论哪台,永远 → a4x IPC Capability。App 打开某台设备时,按该设备的 authority 决定 §2 图里谁坐 Authority Slot。

一台设备怎么从 a4x authority 切到传音 authority

authority=a4x
默认态。未达标或未触发的设备一直停这里。
准入门
① OTA→L3 固件(休眠)
② 机主 App ≥ 基线
③ projection 就绪
就绪 · 待切
能力齐备,但仍 a4x authority、按老模式运行。
触发 · 切分点
a4x 控制通道
下发 switch
roleEpoch +1
authority=传音
控制面改走传音;a4x 转 projection(含回滚料)。
回滚(7–14 天窗口内,同样每设备):传音控制通道下发 rollbackroleEpoch 回退 → authority 切回 a4x、设备与 App 回 L1 route、migrated 提示消失。

谁拍板 · 各方怎么知道

一句话:决定权在 Migration Control Plane,其他人只读、跟随

Migration Control Plane(独立于两套业务平台的编排层)判定准入、决定何时切,并把每设备的 authority 写进 Role ManifestruntimeAuthority + roleEpoch)——这是「谁是 authority」的唯一真相源。设备、App、两朵云都只读它、跟随,谁都不自己拍板、也不互相商量。

用户 / App 手机端 设备 IPC 固件 传音云 IoT · L3 authority a4x·控制面 IoT authority/proj a4x·媒体面 IPC Capability Migration Control Plane ① 拍板 ① 写 Role Manifest authority=传音 · epoch+1(真相源) ② 推给设备 ② 下发 switch(设备X) ③ switch 指令 · 设备被推(a4x 通道) ④ 激活 L3·登录·按新 epoch 上报 ⑤ Projection Bridge 镜像(翻向) ③ App 靠拉 ⑥ 读 Role Manifest(App 靠拉) ⑦ 返回:该设备 authority=传音 · route ⑧ 控制面请求:只读属性 / 写设置 ⑨ 媒体请求:直播/回看 · 永远 a4x(不变) ④ 老App走错 ⑩ 旧版共享 App → 控制请求仍发往 a4x(走错 authority) ⑪ a4x 已是 projection → 拒绝·回 migrated(提示升级) ⑫ 直播/回看仍走 a4x 媒体面 → 照常可用(不受影响) ↩ 回滚(每设备 · 7–14 天窗口内) 传音通道下发 rollback → roleEpoch 回退 → 反向重复 ②,authority 切回 a4x、migrated 消失

关键:设备被「推」、App 靠「拉」,都以 roleEpoch 为唯一依据。设备由 a4x 通道下行命令触发(push);App 每次开设备主动读 manifest 得知 authority(pull)。因为都认同一个 roleEpoch,不会出现「设备以为切了、App 还没切」的错位——谁落后一步就按老 epoch 走,直到读到新 epoch 为止。

为什么有的设备还停在 a4x

三种原因,任一不满足,设备就安全地留在「authority=a4x」、用户照常使用:① 没 OTA 到位——固件还不是 L3 版本;② 机主没升级 App——不满足 APP_FW_READY;③ 还没轮到它——灰度按 SKU / 区域 / 固件批次分批推进,未进入本批次的设备不下发触发。

和请求路径的关系

这张流程决定的,正是 §2 图里每台设备谁坐 Authority Slot:处在「authority=a4x」的设备,Authority Slot 是 a4x IoT Platform;处在「authority=传音」的,Authority Slot 是传音 IoT Platform。媒体两种情况都指向 a4x IPC Capability,切换过程从不触碰。

4分阶段推进计划

项目按下面的阶段推进(不含日期,排期另议;顺序表达依赖关系)。下表逐阶段给出传音侧 / a4x 侧的具体工作内容准出标准;对用户的影响标在阶段名下。

L1 · GA
完整产品上线(a4x authority)
M0 / M1
迁移契约 + L1 迁移钩子
M2a / M2b
L3 固件 + 传音 authority 就绪
M3
角色切换灰度
M4
分批生产迁移
阶段传音 · 工作内容a4x · 工作内容准出标准
L1 · GA
产品上线
用户:拿到可用产品
集成 a4x App SDK + 云端 API;App 扩展 IPC 模块(复用账号 / 家庭 / 共享);上线接入 / 直播 / 事件 / 基础设置;锁定设备身份(sn/deviceSecret→deviceId)稳定映射;合同锁保留期 / 回放 / 回填 / 导出。 提供 IPC 固件与云端能力(IoT Platform 为 authority + IPC Capability Platform);现有 REST / webhook(BIND / PIR / CALL…)可用;承载设备接入 / 直播 / 事件 / 媒体。 产品功能就绪、用户可用;设备身份稳定可映射;L1 合同含保留期 / 回放 / 回填 / 导出条款。
M0 · 迁移契约
纸面
用户:无感
牵头起草迁移契约;定义 Role Manifest / roleEpoch / Migration Ledger / device-id 映射 / rollback delta / 版本矩阵;确认 L1/L3 分级与 SKU 边界。 与传音共同定稿契约;给出现有 API / webhook 的覆盖与缺口清单;确认 OTA authority 归属(ADR)。 App / 云 / 固件 / OTA / 支持五方能按同一状态机与契约实现;唯一 authority 与回滚材料均可定义。
M1 · L1 迁移就绪
内部就绪
用户:无感
App 消费 Role Manifest、内置 L1 / L3 双 route;云端建 Migration Ledger;设备身份映射落库。 固件支持 A/B(或等价)可回滚;保证 L1 checkpoint 完整;事件 eventId / traceId 幂等。 一台 L1 设备可被纳入迁移批次(仍由 a4x authority 服务);旧 App 占比可控、固件可回滚。
M2a · L3 固件试运行
a4x 主导
用户:无感
提供 L3 控制面接入契约(SDK / 物模型)供固件对接;接收遥测 / 诊断。 新硬件跑 L3 目标固件;验证硬件 / 固件连接 / OTA fallback / 诊断日志(=固件改造)。 试运行指标达标;固件能力 / 失败模式 / 诊断证据写入 L3 Ready 准入材料;OTA 回滚可用。
M2b · L3 Ready
平台就绪
用户:无感
IoT Platform 具备 authority 准入(九维对齐:物模型 / 身份 / 权限 / desired-reported / 命令 ACK-错误码 / 幂等-顺序 / 生命周期 / 观测);建 projection 读侧 + command ingress 与传音 projection 互通、搭 Projection Bridge(云对云);物模型 / capability mapping 对齐;媒体 token 验签就绪。 双写投影延迟 / 字段映射 / 权限 / 事件摘要 / 诊断链路达标(阈值内);M2a 证据纳入。
M3 · 角色切换灰度
canary
用户:灰度无感切换
Migration Control Plane 对小批设备写 Role Manifest(authority=传音);App 按 manifest 路由;备好回滚通道(传音下发)与监控 / guardrail。 控制通道下发 switch 指令给设备;projection 态控制面回 migrated;媒体照常;配合回滚演练。 完成 role switch + 双写投影 + IPC 授权 + 回滚演练;guardrail(连接失败 / route 错误 / 投影延迟 / 核心操作失败)未触发。
M4 · 分批生产迁移
全量
用户:全量无感切换
按 SKU / 区域 / 固件批次分批推进;备 runbook / dashboard / oncall / 支持话术;切换点从 a4x 回填历史 各批次固件 / OTA 就绪;保持 projection + 回滚料;媒体入口稳定。 每批进入 L3_ROLE_STABLE;回滚窗口结束后归档材料;错误率 / 回滚率 / support ticket / 媒体入口失败率在 guardrail 内。
读法

L1·GA 是先把产品做出来、让用户用上;M0 / M1 是低成本地把 L1 变得「可被迁移」(M0 纯纸面,用户无感);M2a / M2b 才是造出 L3 能力的主体工作;M3 / M4 是执行切换——用户在这两步经历的,就是 §1 描述的无感体验。

5术语表

本文档架构术语统一用 a4x 英文原词(与 a4x 设计 / 字段零漂移);下表给出中文与说明。code 样式的是 App / 设备实际读写的字段或标记名。

术语中文说明
authority权威设备 runtime 的唯一写权威;同一时刻每设备只有一个。L1=a4x,L3=传音。
projection投影 / 只读镜像非 authority 的一侧,经 Projection Bridge 接收镜像;只读,不接受设备写入。
Authority Slot / Projection Slot权威槽位 / 投影槽位两个角色槽位;迁移=两套 IoT Platform 互换槽位。
role switch角色切换翻转 Authority / Projection 槽位;rollback = 反向 role switch。
roleEpoch角色纪元标识「这一代 authority 归属」的单调递增版本号;拒绝旧纪元写入、防脑裂。
runtimeAuthority运行时权威归属Role Manifest 里标明该设备当前 authority 是谁的字段。
Role Manifest角色清单每设备的 authority 真相源;App / 固件 / 云读它拿 runtimeAuthority / roleEpoch / route。
Migration Control Plane迁移控制面独立于两套业务平台的编排层:判定准入、决定切换 / 回滚、维护 Role Manifest 与 Migration Ledger。
Migration Ledger迁移账本驱动每设备状态机推进;App / 固件只上报、不自行推进。
Projection Bridge投影桥云对云复制流,把 authority 的状态镜像给 projection;角色翻转时方向随之翻转。
command ingress命令回流projection 侧 UI 产生的写意图,回流给当前 authority 裁决(防出现第二条写通道)。
Device Shadow设备影子设备属性 reported / desired 状态;对应「只读属性」与「写设置」。
IoT Platform物联网平台承载绑定 / 属性 / 事件摘要 / 设置 / 命令,参与角色切换;a4x、传音各一套。
IPC Capability Platform媒体能力平台承载直播 / 回看 / 录像 / AI,永不参与切换,永远归 a4x。
WebRTC / GASS / DEM / AIIPC Capability Platform 的组件:WebRTC=直播,GASS / DEM=回看·录像·事件,AI=识别 / tags。
migrated(已迁移标记)设备切换后,a4x(此时是 projection)对控制面读 / 写返回的标记;App 据此提示升级。
traceId视频引用标识事件里指向 a4x 视频对象的引用;切换 / 回滚都不改变,视频永远从 a4x 取。
OTA固件在线升级只把 L3 能力装进固件(休眠),不改变 authority 归属;切分点是角色翻转,不是 OTA。
L3_READY / APP_FW_READY(每设备状态)切换的两个前置:OTA 到 L3 版本(休眠) / 机主 App ≥ 基线且 projection 就绪。