- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
256 lines
5.9 KiB
Markdown
256 lines
5.9 KiB
Markdown
# 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 版本现状
|
||
|
||
### 已实现的结构体
|
||
|
||
```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 实现**:
|
||
```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 实现**:
|
||
```python
|
||
class DeviceService:
|
||
"""设备服务元数据"""
|
||
def __init__(self, siid: int, type: str):
|
||
self.siid = siid
|
||
self.type = type
|
||
```
|
||
|
||
**Go 缺失**:
|
||
- ❌ `DeviceService` 结构体
|
||
- ❌ 服务元数据管理
|
||
|
||
## 移植建议
|
||
|
||
### 第一批任务(核心功能)
|
||
|
||
1. **集成 SPEC 查询** (3小时)
|
||
- 实现 `GetService` 方法
|
||
- 实现 `GetPropertyDef` 方法
|
||
- 实现 `GetActionDef` 方法
|
||
- 集成 `spec_parser.go`
|
||
|
||
2. **补全 `CallAction`** (2小时)
|
||
- 实现参数验证
|
||
- 实现结果解析
|
||
- 实现异步调用支持(可选)
|
||
|
||
### 第二批任务(辅助功能)
|
||
|
||
3. **实现 `DeviceService` 结构体** (1小时)
|
||
- 定义结构体
|
||
- 实现构造函数
|
||
- 实现查询方法
|
||
|
||
4. **优化属性管理** (2小时)
|
||
- 改进属性缓存机制
|
||
- 实现属性变更通知
|
||
- 实现属性历史记录(可选)
|
||
|
||
## 技术难点
|
||
|
||
### 1. SPEC 集成
|
||
|
||
**问题**:需要从 SPEC 文件查询服务和属性定义
|
||
|
||
**建议**:
|
||
```go
|
||
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. 动作调用的异步支持
|
||
|
||
**问题**:某些设备动作可能需要较长时间执行
|
||
|
||
**建议**:
|
||
```go
|
||
// 同步调用
|
||
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
|
||
```
|
||
|
||
## 测试计划
|
||
|
||
### 单元测试
|
||
|
||
1. **设备创建测试**
|
||
- 测试从字典创建
|
||
- 测试转换为字典
|
||
- 测试属性管理
|
||
|
||
2. **属性查询测试**
|
||
- 测试 `GetProperty`
|
||
- 测试 `SetProperty`
|
||
- 测试 `Refresh`
|
||
|
||
3. **动作调用测试**
|
||
- 测试 `CallAction`
|
||
- 测试参数验证
|
||
- 测试结果解析
|
||
|
||
### 集成测试
|
||
|
||
1. **端到端测试**
|
||
- 使用真实设备测试
|
||
- 测试完整流程:创建 → 查询 → 控制
|
||
|
||
## 依赖关系
|
||
|
||
| 依赖文件 | 关系 | 说明 |
|
||
|---------|------|------|
|
||
| `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
|
||
**负责人**:待定
|