Files
ShowenV2/PLUGIN_DEPENDENCY.md
showen fa692cd873 feat: 新增客户端应用目录结构
新增 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,也可独立提供网络功能
- 新增双架构设计原则
2026-03-12 06:46:05 +08:00

285 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 扩展
```rust
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<()>;
}
```
### 依赖声明示例
```rust
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. **错误处理**: 依赖插件启动失败时,跳过依赖它的插件
### 启动流程
```
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 路由)
- 等待依赖插件的响应消息
### 消息路由示例
```rust
// 场景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
- 架构之间可以协作(通过消息)
- 架构之间可以独立工作(不强依赖)
- 用户可以选择使用哪套架构
---
## 实现任务
### 架构团队任务
1. 扩展 Plugin trait添加 dependencies() 方法
2. 实现 ServiceManager 依赖检查和拓扑排序
3. 编写技术设计文档
### 开发团队任务
1. 为现有插件添加 dependencies() 实现
2. 测试启动顺序是否正确
3. 验证消息通信是否正常
### 产品团队任务
1. 梳理 Phase 2/3 插件的依赖关系
2. 确认依赖关系的业务合理性
3. 编写插件依赖的 PRD
---
**文档版本**: v1.0
**最后更新**: 2026-03-12
**负责人**: 陈逸飞 (CEO)