### 概述 / Summary 完整实现红外控制与学习模块(`:android:feature:infrared`),支持红外设备按键学习、实体发射、Room 本地持久化,以及空调 (AC) / 电视 (TV) 虚拟遥控器面板。 ### 核心变更 / Key Changes 1. **领域模型与用例 (`:domain`)**: - 实现按键学习流程:`LearnInfraredKey`、`ManageInfraredKey`、`InfraredKeyFactory`; - 增加虚拟遥控器模型与用例:`CreateVirtualRemote`、`LearnVirtualRemoteKey`、`SendVirtualRemoteAction`、`AcCodeGenerator` 与预置码库 `PresetCodeLibrary`。 2. **数据持久化与仓储 (`:android:feature:infrared`)**: - 引入 Room 数据库 `InfraredDatabase` 及 DAO,提供 `RoomInfraredKeyRepository` 与 `RoomVirtualRemoteRepository`; - 支持多配置隔离(`ProviderProfileId`)、按键状态管理(`LEARNING` / `READY` / `FAILED`)。 3. **UI 与 ViewModel (`:android:feature:infrared`)**: - `InfraredControlScreen`:红外学习与按键调试列表; - `RemotePanelScreen` / `AcRemotePanel` / `TvRemotePanel`:空调/电视专属可视化遥控面板; - `InfraredHubScreen`:红外中枢与多遥控器管理入口; - 在认证后导航栈中将 `DeviceListScreen` 的红外入口无缝对接到 `InfraredHubRoute`。 4. **测试与文档**: - 补齐用例、Fakes、Repository、ViewModel 以及 Compose UI 自动化测试; - 补充红外控制设计规范与真机硬件验收清单。 Reviewed-on: #9 Co-authored-by: mxhsnd <2049295946@qq.com> Co-authored-by: KremeCN <3265494849@qq.com>
86 lines
5.6 KiB
Markdown
86 lines
5.6 KiB
Markdown
# 红外控制硬件验证规范与记录 / Infrared Hardware Validation Guide & Records
|
||
|
||
## 1. 硬件环境与已知设备信息 / Hardware Environment
|
||
|
||
本阶段用于真实验证的实体设备信息如下:
|
||
|
||
- **设备名称**: 红外控制器 (例如 `红外控制器` 或厂商平台绑定的 `irDevName`)
|
||
- **IEEE 地址**: `1c1cfd001dba533c` (短地址: `d822`)
|
||
- **信号强度 (LQI/RSSI)**: `-4`
|
||
- **电量**: `100%`
|
||
- **设备类型**: 红外控制器 (Infrared Controller)
|
||
- **网关/主机**: ABox 智能主机
|
||
- **被控实体**: 实体空调 / 电视遥控器及对应电器
|
||
|
||
---
|
||
|
||
## 2. 硬件测试记录表 / Hardware Validation Log
|
||
|
||
| 日期 (Date) | App Commit | 运行模式 (Mode) | Profile ID | 设备名称 (Device Name) | SDK Key | 操作 (Operation) | 耗时 (ms) | ABSDK Code | 脱敏消息 (Message) | 物理响应 (Physical Response) | 结论 (Result) |
|
||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
||
| 2026-08-24 | b27c67f | FAKE | abox:infrared-fake | ir-living | app_ir_power1 | Learn | 120 | 00000 | success | 模拟学习完成并入库 READY | PASS (Fake) |
|
||
| 2026-08-24 | b27c67f | FAKE | abox:infrared-fake | ir-living | app_ir_power1 | Send | 45 | 00000 | success | 模拟发射成功 | PASS (Fake) |
|
||
| 2026-08-24 | 待填 | REAL_ABSDK | abox | 红外控制器 | app_ir_xxxx | Learn | - | - | - | 遥控器对准控制器按下目标按键 | 待真机执行 |
|
||
| 2026-08-24 | 待填 | REAL_ABSDK | abox | 红外控制器 | app_ir_xxxx | Send | - | - | - | 实体电器执行开关/调节响应 | 待真机执行 |
|
||
|
||
---
|
||
|
||
## 3. 标准真机测试流程 (12 项用例) / Standard 12-Step Test Procedure
|
||
|
||
### 用例 1: 真实会话认证前置 (Authenticate Shared Bridge)
|
||
- **前置**: 通过登录模块对进程单例 `AbsdkBridge` 进行登录认证。
|
||
- **步骤**: 检查进入红外控制页面前,会话 Token 是否有效。
|
||
- **预期**: 若未认证,进入 Real 模式操作时返回 `TokenInvalid` 并提示返回登录。
|
||
|
||
### 用例 2: 输入并保存真实设备名 (Enter and Save irDevName)
|
||
- **步骤**: 在“红外设备名称”输入框中输入 `红外控制器` 或后台分配的真实设备名,点击“保存设备名”。
|
||
- **预期**: 本地 Room 保存成功,页面显示“已保存设备:红外控制器”,启用“学习新按键”入口。
|
||
|
||
### 用例 3: 学习全新唯一按键 (Learn Unique Key)
|
||
- **步骤**: 点击“学习新按键”,输入显示名称(如“空调开”),点击“开始学习”;将物理遥控器对准红外控制器按下按键。
|
||
- **预期**: 本地先写入 `LEARNING` 状态,硬件捕获完成后状态自动刷新为 `READY`,记录响应耗时与返回码。
|
||
|
||
### 用例 4: 立即发射已学习按键 (Send Learned Key Immediately)
|
||
- **步骤**: 学习成功后,点击该按键右侧的“发射”按钮。
|
||
- **预期**: ABSDK 返回 `00000`,实体电器执行对应操作,发射期间按钮防重复点击。
|
||
|
||
### 用例 5: 重复发射验证稳定性 (Repeat Send)
|
||
- **步骤**: 间隔 3 秒再次点击同一按键的“发射”按钮。
|
||
- **预期**: 发射稳定成功,电器再次响应,按键保持 `READY` 状态不变。
|
||
|
||
### 用例 6: 重新学习同一 SDK Key (Relearn Same Key)
|
||
- **步骤**: 针对已存在或失败的按键点击“重试”/重新学习。
|
||
- **预期**: 复用相同的 `InfraredKeyId` 和 `sdkKey`,先变更为 `LEARNING`,学习完成后恢复 `READY`,不生成冗余记录。
|
||
|
||
### 用例 7: 控制器断电/离线测试 (Controller Offline)
|
||
- **步骤**: 拔掉红外控制器电源,发起学习或发射。
|
||
- **预期**: ABSDK 返回 `20206`,领域层转换为 `DomainError.DeviceOffline`,学习按键标为 `FAILED`,UI 提示控制器离线。
|
||
|
||
### 用例 8: 遥控器无信号/超时测试 (No Signal / Learning Timeout)
|
||
- **步骤**: 点击“开始学习”,但不按物理遥控器任何按键,等待 SDK 返回。
|
||
- **预期**: 记录实际超时等待时间与错误码(如 `20204`/`20205`),按键转换为 `FAILED` 并允许重试。
|
||
|
||
### 用例 9: 学习过程中离开页面 (Leave Page During Learning)
|
||
- **步骤**: 点击开始学习后,立即点击“返回”离开红外页面;稍后重新进入。
|
||
- **预期**: Application 协程作用域内任务继续执行,学习完成后 Room 数据库正确持久化结果,重新进入显示最新状态。
|
||
|
||
### 用例 10: 进程被杀死后状态恢复 (Process Interruption Recovery)
|
||
- **步骤**: 在 `LEARNING` 状态下强制杀死 App 进程并重启。
|
||
- **预期**: App 启动或重新进入页面时,`RecoverInterruptedInfraredLearning` 将遗留的 `LEARNING` 保守恢复为 `FAILED`,提示用户重新学习。
|
||
|
||
### 用例 11: Token 失效与重新登录 (Token Expiration)
|
||
- **步骤**: 主机端使 Token 失效或超过 2 小时后发起红外操作。
|
||
- **预期**: 返回 `TokenInvalid`,本地会话被清除,页面提示登录失效并导航返回。
|
||
|
||
### 用例 12: 检查未文档化响应字段 (Inspect Undocumented Fields)
|
||
- **步骤**: 在调试构建中检查 `ABRet.getDicDatas()` 是否包含未文档化字段。
|
||
- **安全约束**: 严禁将 Raw Payload、Token、密码或未脱敏数据打印至生产日志。
|
||
|
||
---
|
||
|
||
## 4. 协议与硬件事实确认记录 / Observed Facts
|
||
|
||
- **SDK 阻塞模式**: 同步阻塞 HTTP POST 调用,由 `AbsdkBridge` 调度至 `Dispatchers.IO` 并通过进程级 `Mutex` 串行执行。
|
||
- **数据隔离**: `FAKE` 模式自动使用 `profileId:infrared-fake` 隔离数据,`REAL_ABSDK` 模式使用主会话数据。
|
||
- **安全门禁**: 真实 ABSDK 依赖明文传输,Release 构建中完全禁用硬件接口并由 `InfraredReleaseModule` 安全阻断。
|