- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
5.9 KiB
5.9 KiB
02 - miot_device.py 移植计划
概览
| 项目 | 内容 |
|---|---|
| Python 文件 | py-miot/miot_device.py (469行) |
| Go 文件 | go-miot/miot_device.go |
| 状态 | ⚠️ 部分实现 |
| 优先级 | 🔴 P0 |
| 预计工作量 | 6-10 小时 |
Python 版本分析
核心类
MIoTDevice
位置:第 18-469 行
主要职责:
- 表示单个小米 IoT 设备
- 管理设备的属性、方法、事件
- 提供设备控制和查询接口
核心方法:
| 方法名 | 行号 | 功能 | Go 状态 |
|---|---|---|---|
__init__ |
18 | 初始化设备对象 | ✅ 已完成 |
from_dict |
45 | 从字典创建设备对象 | ✅ 已完成 |
to_dict |
78 | 转换为字典 | ✅ 已完成 |
get_property |
112 | 获取属性值 | ✅ 已完成 |
set_property |
139 | 设置属性值(本地缓存) | ✅ 已完成 |
call_action |
167 | 调用设备动作 | ⚠️ 部分实现 |
get_service |
223 | 获取服务定义 | ❌ 缺失 |
get_property_def |
251 | 获取属性定义 | ❌ 缺失 |
get_action_def |
279 | 获取动作定义 | ❌ 缺失 |
refresh |
307 | 从云端刷新属性 | ⚠️ 部分实现 |
to_string |
365 | 转换为可读字符串 | ✅ 已完成 |
to_json |
401 | 转换为 JSON | ✅ 已完成 |
辅助类
DeviceProperty
位置:第 415-450 行
功能:表示设备属性的元数据
Go 状态:✅ 已完成(对应 Property 结构体)
DeviceService
位置:第 451-469 行
功能:表示设备服务的元数据
Go 状态:❌ 缺失
Go 版本现状
已实现的结构体
type MIoTDevice struct {
DID string
Name string
Model string
Token string
IPAddress string
Port int
Properties map[string]interface{}
PropertyDefs map[string]*Property
// ...
}
缺失的功能
1. 服务定义查询 (get_service, get_property_def, get_action_def)
Python 实现:
def get_service(self, service_id: str) -> dict:
"""获取服务定义"""
spec = self._get_spec()
return spec.get_service(service_id)
def get_property_def(self, siid: int, piid: int) -> dict:
"""获取属性定义"""
spec = self._get_spec()
return spec.get_property(siid, piid)
Go 缺失:
- ❌ 服务定义查询
- ❌ 属性定义查询
- ❌ 动作定义查询
- ❌ SPEC 集成
2. 完整的 call_action 实现
Python 实现:
- 支持同步和异步调用
- 支持参数验证
- 支持结果解析
Go 缺失:
- ⚠️ 参数验证
- ⚠️ 结果解析
- ❌ 异步调用支持
3. DeviceService 类
Python 实现:
class DeviceService:
"""设备服务元数据"""
def __init__(self, siid: int, type: str):
self.siid = siid
self.type = type
Go 缺失:
- ❌
DeviceService结构体 - ❌ 服务元数据管理
移植建议
第一批任务(核心功能)
-
集成 SPEC 查询 (3小时)
- 实现
GetService方法 - 实现
GetPropertyDef方法 - 实现
GetActionDef方法 - 集成
spec_parser.go
- 实现
-
补全
CallAction(2小时)- 实现参数验证
- 实现结果解析
- 实现异步调用支持(可选)
第二批任务(辅助功能)
-
实现
DeviceService结构体 (1小时)- 定义结构体
- 实现构造函数
- 实现查询方法
-
优化属性管理 (2小时)
- 改进属性缓存机制
- 实现属性变更通知
- 实现属性历史记录(可选)
技术难点
1. SPEC 集成
问题:需要从 SPEC 文件查询服务和属性定义
建议:
type MIoTDevice struct {
// ...
specParser *SpecParser
}
func (d *MIoTDevice) GetService(serviceID string) (*Service, error) {
if d.specParser == nil {
return nil, errors.New("spec parser not initialized")
}
return d.specParser.GetService(serviceID)
}
2. 属性缓存同步
问题:本地缓存的属性值需要与云端同步
建议:
- 实现
Refresh方法,从云端刷新属性 - 实现属性变更通知机制
- 使用时间戳判断属性是否过期
3. 动作调用的异步支持
问题:某些设备动作可能需要较长时间执行
建议:
// 同步调用
func (d *MIoTDevice) CallAction(siid, aiid int, params map[string]interface{}) (map[string]interface{}, error)
// 异步调用
func (d *MIoTDevice) CallActionAsync(siid, aiid int, params map[string]interface{}) <-chan ActionResult
测试计划
单元测试
-
设备创建测试
- 测试从字典创建
- 测试转换为字典
- 测试属性管理
-
属性查询测试
- 测试
GetProperty - 测试
SetProperty - 测试
Refresh
- 测试
-
动作调用测试
- 测试
CallAction - 测试参数验证
- 测试结果解析
- 测试
集成测试
- 端到端测试
- 使用真实设备测试
- 测试完整流程:创建 → 查询 → 控制
依赖关系
| 依赖文件 | 关系 | 说明 |
|---|---|---|
miot_spec.py |
强依赖 | SPEC 查询 |
miot_client.py |
弱依赖 | 客户端调用 |
移植优先级
| 任务 | 优先级 | 理由 |
|---|---|---|
| 集成 SPEC 查询 | 🔴 高 | 核心功能,影响属性查询 |
补全 CallAction |
🔴 高 | 核心功能,影响设备控制 |
实现 DeviceService |
🟡 中 | 辅助功能,提升可用性 |
| 优化属性管理 | 🟢 低 | 优化功能,可选 |
进度跟踪
- 集成 SPEC 查询 (预计 3小时)
- 补全
CallAction(预计 2小时) - 实现
DeviceService结构体 (预计 1小时) - 优化属性管理 (预计 2小时)
- 单元测试 (预计 3小时)
- 集成测试 (预计 2小时)
总计:13小时
创建时间:2026-06-28 最后更新:2026-06-28 负责人:待定