- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
6.8 KiB
6.8 KiB
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 版本中可能需要实现:
- 文件存储管理 - 对应
MIoTStorage - 证书管理 - 对应
MIoTCert - 制造商信息缓存 - 对应
DeviceManufacturer
移植建议
第一批任务(核心功能)
-
创建
miot_storage.go文件 (2小时)- 定义
MIoTStorage结构体 - 实现构造函数
- 定义
-
实现文件读写 (4小时)
- 实现
Load和Save方法 - 支持多种数据类型([]byte、string、map、slice)
- 实现哈希检查
- 实现
-
实现异步操作 (3小时)
- 使用 goroutine 实现异步
- 实现操作去重(避免重复执行)
- 实现优雅关闭
-
实现用户配置管理 (2小时)
- 实现
UpdateUserConfig方法 - 实现
LoadUserConfig方法
- 实现
第二批任务(证书管理)
-
创建
miot_cert.go文件 (1小时)- 定义
MIoTCert结构体
- 定义
-
实现证书管理 (4小时)
- 实现 CA 证书验证
- 实现用户证书管理
- 实现证书生成(如果需要)
第三批任务(制造商信息)
-
创建
miot_manufacturer.go文件 (1小时)- 定义
DeviceManufacturer结构体
- 定义
-
实现制造商信息缓存 (2小时)
- 实现初始化
- 实现缓存更新
技术难点
1. 异步操作
问题:Python 使用 asyncio,Go 使用 goroutine
建议:
type MIoTStorage struct {
rootPath string
mu sync.RWMutex
// 操作去重
pendingOps map[string]*PendingOp
}
type PendingOp struct {
done chan struct{}
result interface{}
err error
}
2. 文件完整性检查
问题:需要在文件中嵌入 SHA256 哈希
建议:
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
测试计划
单元测试
-
文件读写测试
- 测试各种数据类型的读写
- 测试哈希检查
- 测试错误处理
-
异步操作测试
- 测试并发读写
- 测试操作去重
- 测试优雅关闭
-
证书管理测试
- 测试证书验证
- 测试证书生成
- 测试证书加载
依赖关系
| 依赖文件 | 关系 | 说明 |
|---|---|---|
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 负责人:待定