feat: 初始化小米 IoT (MIoT) 智能家居 Go 库
- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
# 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
|
||||
**负责人**:待定
|
||||
Reference in New Issue
Block a user