# ShowenV2 插件依赖模型 ## 插件分类 ### 独立插件(Independent Plugins) **定义**: 只依赖 core,不依赖其他插件,可以独立运行 **特点**: - 自包含,功能完整 - 只通过 core 的消息机制与其他插件通信 - 可以单独测试和部署 - 启动顺序无要求 **示例**: - screen - 屏幕管理(唤醒锁、光标控制) - wifi - WiFi 管理(扫描、连接、热点) - video - 视频播放(状态机、渲染) - ble - 蓝牙服务(GATT、配网,**双架构**:既可配置 WiFi,也可独立提供网络功能) ### 依赖插件(Dependent Plugins) **定义**: 依赖其他插件的功能,需要特定插件先启动 **特点**: - 功能依赖其他插件 - 需要声明依赖关系 - 启动顺序有要求 - 通过消息机制与依赖插件通信 **示例**: - http - 依赖 video(通过 HTTP API 控制视频播放) --- ## 依赖关系图 ``` 独立插件层(多架构并存): ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ screen │ │ wifi │ │ video │ │ ble │ │ future │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ ↑ ↑ ↑ ↑ ↑ │ │ │ │ │ │ └────────────┼────────────┼────────────┘ │ ↕ │ ↕ │ (多架构协作) │ (可扩展) │ │ └─────────────────────────┘ core 依赖插件层: ┌─────────┐ │ http │ │ (依赖 │ │ video) │ └─────────┘ ↑ │ core ``` **多架构说明**: - **WiFi 架构**:通过 WiFi 连接网络 - **BLE 架构**:通过蓝牙连接网络 - **未来架构**:可扩展任何通讯方式(Zigbee、LoRa、NFC、红外、串口等) - **架构协作**:各架构可以互相配置和协作(通过消息) - **架构独立**:每个架构都可以独立工作 - **用户选择**:用户可以选择使用任何一种或多种架构 --- ## 插件依赖声明 ### 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 语音合成(独立) - **zigbee** - Zigbee 通讯(独立,智能家居) - **lora** - LoRa 远程通讯(独立,物联网) - **nfc** - NFC 近场通讯(独立,快速配对) - **infrared** - 红外遥控(独立,传统家电控制) - **serial** - 串口通讯(独立,硬件扩展) - **mqtt** - MQTT 协议(独立,物联网标准) ### 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) ### 通讯插件扩展性 ShowenV2 支持任何通讯方式作为独立插件: - **有线通讯**: 以太网、USB、串口、CAN 总线 - **无线通讯**: WiFi、BLE、Zigbee、LoRa、NFC、红外 - **网络协议**: HTTP、WebSocket、MQTT、CoAP、gRPC - **专有协议**: 自定义协议插件 所有通讯插件都是独立的,可以: - 独立工作(提供通讯能力) - 互相配置(通过消息协作) - 并存使用(多种通讯方式同时工作) --- ## 设计原则 ### 1. 最小依赖原则 - 尽量设计独立插件 - 依赖关系要有明确的业务理由 - 避免过度依赖 ### 2. 单向依赖原则 - 依赖关系必须是单向的 - 禁止循环依赖 - 依赖层级不超过 3层 ### 3. 松耦合原则 - 通过消息通信,不直接调用 - 依赖插件可以缺失(降级运行) - 依赖插件可以替换(接口兼容) ### 4. 可测试原则 - 依赖插件可以 mock - 独立插件可以单独测试 - 依赖插件可以集成测试 ### 5. 双架构原则(新增) - 支持多套独立架构并存(如 WiFi + BLE + Zigbee + ...) - 架构之间可以协作(通过消息) - 架构之间可以独立工作(不强依赖) - 用户可以选择使用哪套架构 ### 6. 动态扩展原则(新增) - **插件动态注册**: 插件可以在运行时注册和卸载 - **插件动态安装**: 支持从插件市场下载安装新插件 - **热插拔**: 插件可以在不重启系统的情况下加载/卸载 - **版本管理**: 支持插件版本更新和回滚 - **依赖检查**: 动态安装时自动检查依赖关系 --- ## 实现任务 ### 架构团队任务 1. 扩展 Plugin trait,添加 dependencies() 方法 2. 实现 ServiceManager 依赖检查和拓扑排序 3. **设计插件动态注册机制** 4. **设计插件热加载/卸载机制** 5. **设计插件版本管理系统** 6. 编写技术设计文档 ### 开发团队任务 1. 为现有插件添加 dependencies() 实现 2. 测试启动顺序是否正确 3. 验证消息通信是否正常 4. **实现插件动态注册 API** 5. **实现插件加载/卸载功能** ### 产品团队任务 1. 梳理 Phase 2/3 插件的依赖关系 2. 确认依赖关系的业务合理性 3. 编写插件依赖的 PRD 4. **设计插件市场功能** 5. **设计插件安装/更新流程** --- ## 插件动态管理 ### 插件生命周期 ``` 未安装 → 下载 → 安装 → 注册 → 初始化 → 启动 → 运行 ↓ 停止 → 卸载 → 删除 ``` ### 动态注册 API ```rust // ServiceManager 新增方法 impl ServiceManager { // 动态注册插件 pub fn register_plugin(&mut self, plugin: Box) -> Result<()>; // 动态卸载插件 pub fn unregister_plugin(&mut self, name: &str) -> Result<()>; // 重新加载插件 pub fn reload_plugin(&mut self, name: &str) -> Result<()>; // 获取已注册插件列表 pub fn list_plugins(&self) -> Vec; // 检查插件依赖 pub fn check_dependencies(&self, plugin: &dyn Plugin) -> Result<()>; } ``` ### 插件安装流程 ``` 1. 用户从插件市场选择插件 2. 下载插件包(.so / .dll / .dylib) 3. 验证插件签名和版本 4. 检查依赖关系 5. 安装到 plugins/ 目录 6. 动态加载插件 7. 注册到 ServiceManager 8. 初始化并启动插件 ``` ### 插件卸载流程 ``` 1. 检查是否有其他插件依赖 2. 停止插件运行 3. 从 ServiceManager 注销 4. 卸载插件模块 5. 删除插件文件(可选) ``` ### 插件更新流程 ``` 1. 检查新版本 2. 下载新版本插件 3. 停止旧版本插件 4. 备份旧版本 5. 安装新版本 6. 启动新版本 7. 验证运行正常 8. 删除旧版本备份 ``` ### 插件市场 ``` 功能: - 浏览插件列表 - 搜索插件 - 查看插件详情(功能、依赖、评分、评论) - 下载/安装插件 - 更新插件 - 卸载插件 - 插件评分和评论 技术实现: - HTTP API 获取插件列表 - 插件包托管在云端 - 版本管理和更新检查 - 插件签名验证 ``` ### 安全机制 ``` 1. 插件签名验证(防止恶意插件) 2. 沙箱隔离(限制插件权限) 3. 依赖检查(防止依赖冲突) 4. 版本兼容性检查 5. 插件审核机制(官方市场) ``` --- **文档版本**: v1.0 **最后更新**: 2026-03-12 **负责人**: 陈逸飞 (CEO)