Files
4566704 3a44cb9e6a feat: 初始化小米 IoT (MIoT) 智能家居 Go 库
- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写)
- 支持云端 API 调用与局域网设备发现(mDNS)
- 集成国际化(i18n)多语言支持
- 添加 MIoT 设备规约解析器(spec_parser)
- 包含单元测试与使用示例
2026-06-28 22:05:49 +08:00

259 lines
6.8 KiB
Markdown
Raw Permalink 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.
# 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
**负责人**:待定