新增 clients/ 目录: - 外部控制应用的统一目录 - 支持多种客户端类型: - 移动端:iOS, Android, Flutter - 小程序:微信、支付宝、抖音 - Web:响应式 Web 应用、桌面应用 - 智能设备:手表、音箱、智能家居 目录结构: - shared/ - 共享代码(API 客户端、数据模型) - web/ - Web 应用 - flutter/ - Flutter 跨平台应用 - ios/ - iOS 原生应用 - android/ - Android 原生应用 - wechat-miniapp/ - 微信小程序 - desktop/ - Electron 桌面应用 - docs/ - 客户端开发文档 文档: - clients/README.md - 客户端总览和开发计划 - clients/docs/API.md - HTTP API 完整文档 - clients/docs/DESIGN.md - 设计规范和组件库 更新 PLUGIN_DEPENDENCY.md: - 明确 WiFi + BLE 双架构模型 - BLE 既可配置 WiFi,也可独立提供网络功能 - 新增双架构设计原则
7.9 KiB
7.9 KiB
ShowenV2 插件依赖模型
插件分类
独立插件(Independent Plugins)
定义: 只依赖 core,不依赖其他插件,可以独立运行
特点:
- 自包含,功能完整
- 只通过 core 的消息机制与其他插件通信
- 可以单独测试和部署
- 启动顺序无要求
示例:
- screen - 屏幕管理(唤醒锁、光标控制)
- wifi - WiFi 管理(扫描、连接、热点)
- video - 视频播放(状态机、渲染)
- ble - 蓝牙服务(GATT、配网,双架构:既可配置 WiFi,也可独立提供网络功能)
依赖插件(Dependent Plugins)
定义: 依赖其他插件的功能,需要特定插件先启动
特点:
- 功能依赖其他插件
- 需要声明依赖关系
- 启动顺序有要求
- 通过消息机制与依赖插件通信
示例:
- http - 依赖 video(通过 HTTP API 控制视频播放)
依赖关系图
独立插件层(双架构):
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ screen │ │ wifi │ │ video │ │ ble │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
↑ ↑ ↑ ↑
│ │ │ │
│ └────────────┼────────────┘
│ ↕ │
│ (双架构通信) │
│ │
└─────────────────────────┘
core
依赖插件层:
┌─────────┐
│ http │
│ (依赖 │
│ video) │
└─────────┘
↑
│
core
双架构说明:
- WiFi 和 BLE 是两套独立的网络架构
- BLE 可以配置 WiFi(通过消息通信)
- BLE 也可以独立提供网络功能(不依赖 WiFi)
- 用户可以选择使用 WiFi 或 BLE 进行网络连接
插件依赖声明
Plugin Trait 扩展
pub trait Plugin: Send {
fn info(&self) -> PluginInfo;
// 新增:声明依赖的插件
fn dependencies(&self) -> Vec<&'static str> {
vec![] // 默认无依赖
}
fn init(&mut self, ctx: PluginContext) -> Result<()>;
fn start(&mut self) -> Result<()>;
fn handle_message(&mut self, msg: Message) -> Result<()>;
fn stop(&mut self) -> Result<()>;
}
依赖声明示例
impl Plugin for HttpPlugin {
fn dependencies(&self) -> Vec<&'static str> {
vec!["video"] // HTTP 依赖 Video 插件
}
}
impl Plugin for BlePlugin {
fn dependencies(&self) -> Vec<&'static str> {
vec![] // BLE 是独立插件,通过消息与 WiFi 通信
}
}
impl Plugin for WifiPlugin {
fn dependencies(&self) -> Vec<&'static str> {
vec![] // WiFi 是独立插件
}
}
impl Plugin for VideoPlugin {
fn dependencies(&self) -> Vec<&'static str> {
vec![] // Video 是独立插件
}
}
启动顺序管理
ServiceManager 职责
- 依赖检查: 启动前检查所有依赖是否满足
- 拓扑排序: 根据依赖关系计算启动顺序
- 顺序启动: 按照拓扑排序结果依次启动插件
- 错误处理: 依赖插件启动失败时,跳过依赖它的插件
启动流程
1. 注册所有插件
2. 构建依赖图
3. 检查循环依赖(报错)
4. 拓扑排序
5. 按顺序 init() 所有插件
6. 按顺序 start() 所有插件
示例启动顺序
Phase 1: 独立插件(并行启动)
- screen.init() → screen.start()
- wifi.init() → wifi.start()
- video.init() → video.start()
- ble.init() → ble.start()
Phase 2: 依赖插件
- http.init() → http.start() (依赖 video)
消息通信模式
独立插件
- 接收 Broadcast 消息
- 发送消息给 core
- 不直接与其他插件通信
依赖插件
- 接收 Broadcast 消息
- 发送消息给特定插件(通过 core 路由)
- 等待依赖插件的响应消息
消息路由示例
// 场景1: BLE 配置 WiFi(双架构协作)
ble_plugin.send(Message::WifiCommand(WifiCommand::Connect { ssid, password }));
wifi_plugin.handle_message(Message::WifiCommand(...));
wifi_plugin.send(Message::WifiResult(result)); // Broadcast
ble_plugin.handle_message(Message::WifiResult(result));
// 场景2: BLE 独立提供网络功能(不依赖 WiFi)
// 用户通过 BLE 直接与设备通信,不需要 WiFi
ble_plugin.handle_gatt_request(request);
ble_plugin.send_gatt_response(response);
// 场景3: HTTP 控制 Video(强依赖)
http_plugin.send(Message::PlayerCommand(PlayerCommand::Play));
video_plugin.handle_message(Message::PlayerCommand(...));
video_plugin.send(Message::PlayerStatus(status)); // Broadcast
关键区别:
- 双架构(WiFi + BLE):两套独立的网络方案,可以互相配置,也可以独立工作
- BLE 可以配置 WiFi(松耦合,通过消息)
- BLE 可以独立提供网络功能(不依赖 WiFi)
- WiFi 可以独立工作(不依赖 BLE)
- 强依赖(HTTP → Video):HTTP 必须在 Video 启动后才能工作
当前插件分类
独立插件
| 插件 | 功能 | 依赖 | 状态 |
|---|---|---|---|
| screen | 屏幕管理 | core | ✅ 完成 |
| wifi | WiFi 网络 | core | ✅ 完成 |
| video | 视频播放 | core | ✅ 完成 |
| ble | 蓝牙网络 | core | ✅ 完成 |
双架构说明:
- WiFi 架构:通过 WiFi 连接网络,支持扫描、连接、热点
- BLE 架构:通过蓝牙连接网络,支持 GATT 服务、配网
- 协作模式:BLE 可以配置 WiFi(通过消息通信)
- 独立模式:BLE 和 WiFi 都可以独立提供网络功能
依赖插件
| 插件 | 功能 | 依赖 | 状态 |
|---|---|---|---|
| http | HTTP API | core + video | ✅ 完成 |
说明:HTTP 必须依赖 Video,因为 HTTP API 的核心功能是控制视频播放。
未来插件规划
Phase 2 独立插件
- render - 3D 渲染引擎(独立)
- ai_voice - AI 语音识别(独立)
- ai_tts - AI 语音合成(独立)
Phase 2 依赖插件
- vr - VR 输出(依赖 render 或 video)
- ar - AR 输出(依赖 render 或 video)
- ai_assistant - AI 助手(依赖 ai_voice + ai_tts + video)
Phase 3 依赖插件
- cloud_sync - 云端同步(依赖 http)
- social - 社交分享(依赖 http + cloud_sync)
- editor - 内容编辑器(依赖 video + render)
设计原则
1. 最小依赖原则
- 尽量设计独立插件
- 依赖关系要有明确的业务理由
- 避免过度依赖
2. 单向依赖原则
- 依赖关系必须是单向的
- 禁止循环依赖
- 依赖层级不超过 3层
3. 松耦合原则
- 通过消息通信,不直接调用
- 依赖插件可以缺失(降级运行)
- 依赖插件可以替换(接口兼容)
4. 可测试原则
- 依赖插件可以 mock
- 独立插件可以单独测试
- 依赖插件可以集成测试
5. 双架构原则(新增)
- 支持多套独立架构并存(如 WiFi + BLE)
- 架构之间可以协作(通过消息)
- 架构之间可以独立工作(不强依赖)
- 用户可以选择使用哪套架构
实现任务
架构团队任务
- 扩展 Plugin trait,添加 dependencies() 方法
- 实现 ServiceManager 依赖检查和拓扑排序
- 编写技术设计文档
开发团队任务
- 为现有插件添加 dependencies() 实现
- 测试启动顺序是否正确
- 验证消息通信是否正常
产品团队任务
- 梳理 Phase 2/3 插件的依赖关系
- 确认依赖关系的业务合理性
- 编写插件依赖的 PRD
文档版本: v1.0
最后更新: 2026-03-12
负责人: 陈逸飞 (CEO)