# 05 - miot_storage.py 移植计划 ## 概览 | 项目 | 内容 | |------|------| | **Python 文件** | `py-miot/miot_storage.py` (789行) | | **Go 文件** | ❌ 缺失 | | **状态** | ❌ 完全缺失 | | **优先级** | 🔴 P0 | | **预计工作量** | 12-16 小时 | ## Python 版本分析 ### 核心类 #### MIoTStorage **位置**:第 90-538 行 **主要职责**: - 文件管理(同步和异步) - 支持多种数据类型(bytes、str、dict、list) - 文件完整性检查(SHA256 哈希) - 异步操作支持(使用 `asyncio`) **核心方法**: | 方法名 | 行号 | 功能 | 说明 | |--------|------|------|------| | `__init__` | 100 | 初始化存储 | 设置根路径和事件循环 | | `load` | 168 | 加载文件(同步) | 支持多种数据类型 | | `load_async` | 175 | 加载文件(异步) | 使用 `run_in_executor` | | `save` | 232 | 保存文件(同步) | 支持多种数据类型 | | `save_async` | 239 | 保存文件(异步) | 使用 `run_in_executor` | | `remove` | 260 | 删除文件(同步) | | | `remove_async` | 265 | 删除文件(异步) | | | `remove_domain` | 288 | 删除域目录(同步) | 递归删除 | | `remove_domain_async` | 292 | 删除域目录(异步) | | | `get_names` | 312 | 获取文件名列表 | 按类型过滤 | | `file_exists` | 322 | 检查文件是否存在 | | | `save_file` | 326 | 保存二进制文件(同步) | 不添加哈希 | | `load_file` | 352 | 加载二进制文件(同步) | | | `clear` | 397 | 清空存储(同步) | | | `clear_async` | 406 | 清空存储(异步) | | | `update_user_config` | 421 | 更新用户配置 | 支持部分更新 | | `load_user_config` | 481 | 加载用户配置 | 支持键过滤 | **关键特性**: - 文件完整性检查(SHA256 哈希) - 异步操作支持 - 操作去重(避免重复执行相同操作) - 用户配置管理 #### MIoTCert **位置**:第 540-727 行 **主要职责**: - 证书管理(CA 证书、用户证书、私钥) - 证书验证 - 证书生成(CSR) **核心方法**: | 方法名 | 行号 | 功能 | |--------|------|------| | `verify_ca_cert_async` | 583 | 验证 CA 证书 | | `user_cert_remaining_time_async` | 605 | 获取用户证书剩余有效期 | | `gen_user_key` | 655 | 生成用户私钥(Ed25519) | | `gen_user_csr` | 664 | 生成 CSR | | `load_user_key_async` | 682 | 加载用户私钥 | | `update_user_key_async` | 688 | 更新用户私钥 | | `load_user_cert_async` | 695 | 加载用户证书 | | `update_user_cert_async` | 701 | 更新用户证书 | #### DeviceManufacturer **位置**:第 729-789 行 **主要职责**: - 设备制造商信息缓存 - 从云端获取制造商信息 - 本地缓存管理 **核心方法**: | 方法名 | 行号 | 功能 | |--------|------|------| | `init_async` | 744 | 初始化(加载缓存或从云端获取) | | `deinit_async` | 782 | 清理 | | `get_name` | 785 | 根据缩写获取完整名称 | ## Go 版本现状 ### 缺失的功能 整个 `miot_storage.py` 模块在 Go 版本中完全缺失。 Go 版本中可能需要实现: 1. **文件存储管理** - 对应 `MIoTStorage` 2. **证书管理** - 对应 `MIoTCert` 3. **制造商信息缓存** - 对应 `DeviceManufacturer` ## 移植建议 ### 第一批任务(核心功能) 1. **创建 `miot_storage.go` 文件** (2小时) - 定义 `MIoTStorage` 结构体 - 实现构造函数 2. **实现文件读写** (4小时) - 实现 `Load` 和 `Save` 方法 - 支持多种数据类型([]byte、string、map、slice) - 实现哈希检查 3. **实现异步操作** (3小时) - 使用 goroutine 实现异步 - 实现操作去重(避免重复执行) - 实现优雅关闭 4. **实现用户配置管理** (2小时) - 实现 `UpdateUserConfig` 方法 - 实现 `LoadUserConfig` 方法 ### 第二批任务(证书管理) 5. **创建 `miot_cert.go` 文件** (1小时) - 定义 `MIoTCert` 结构体 6. **实现证书管理** (4小时) - 实现 CA 证书验证 - 实现用户证书管理 - 实现证书生成(如果需要) ### 第三批任务(制造商信息) 7. **创建 `miot_manufacturer.go` 文件** (1小时) - 定义 `DeviceManufacturer` 结构体 8. **实现制造商信息缓存** (2小时) - 实现初始化 - 实现缓存更新 ## 技术难点 ### 1. 异步操作 **问题**:Python 使用 `asyncio`,Go 使用 goroutine **建议**: ```go type MIoTStorage struct { rootPath string mu sync.RWMutex // 操作去重 pendingOps map[string]*PendingOp } type PendingOp struct { done chan struct{} result interface{} err error } ``` ### 2. 文件完整性检查 **问题**:需要在文件中嵌入 SHA256 哈希 **建议**: ```go func (s *MIoTStorage) Save(domain, name string, data interface{}) error { var bytes []byte switch v := data.(type) { case []byte: bytes = v case string: bytes = []byte(v) case map[string]interface{}, []interface{}: bytes, _ = json.Marshal(v) } // 添加哈希 hash := sha256.Sum256(bytes) bytesWithHash := append(bytes, hash[:]...) // 写入文件 return ioutil.WriteFile(s.getFullPath(domain, name, data), bytesWithHash, 0644) } ``` ### 3. 证书管理 **问题**:需要使用加密库 **建议**: - 使用 Go 标准库 `crypto` - 使用第三方库 `golang.org/x/crypto/ed25519` ## 测试计划 ### 单元测试 1. **文件读写测试** - 测试各种数据类型的读写 - 测试哈希检查 - 测试错误处理 2. **异步操作测试** - 测试并发读写 - 测试操作去重 - 测试优雅关闭 3. **证书管理测试** - 测试证书验证 - 测试证书生成 - 测试证书加载 ## 依赖关系 | 依赖文件 | 关系 | 说明 | |---------|------|------| | `miot_error.py` | 强依赖 | 错误定义 | | `const.py` | 强依赖 | 常量定义 | | `crypto` 库 | 强依赖 | 证书管理 | ## 移植优先级 | 任务 | 优先级 | 理由 | |------|--------|------| | 创建基础结构 | 🔴 高 | 基础框架 | | 实现文件读写 | 🔴 高 | 核心功能 | | 实现异步操作 | 🔴 高 | 核心功能 | | 实现用户配置 | 🔴 高 | 核心功能 | | 实现证书管理 | 🟡 中 | 重要功能 | | 实现制造商信息 | 🟢 低 | 辅助功能 | ## 进度跟踪 - [ ] 创建 `miot_storage.go` 文件 (预计 2小时) - [ ] 实现文件读写 (预计 4小时) - [ ] 实现异步操作 (预计 3小时) - [ ] 实现用户配置管理 (预计 2小时) - [ ] 创建 `miot_cert.go` 文件 (预计 1小时) - [ ] 实现证书管理 (预计 4小时) - [ ] 创建 `miot_manufacturer.go` 文件 (预计 1小时) - [ ] 实现制造商信息缓存 (预计 2小时) - [ ] 单元测试 (预计 4小时) **总计**:23小时 --- **创建时间**:2026-06-28 **最后更新**:2026-06-28 **负责人**:待定