feat: 初始化小米 IoT (MIoT) 智能家居 Go 库

- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写)
- 支持云端 API 调用与局域网设备发现(mDNS)
- 集成国际化(i18n)多语言支持
- 添加 MIoT 设备规约解析器(spec_parser)
- 包含单元测试与使用示例
This commit is contained in:
2026-06-28 22:05:49 +08:00
parent ac442812b4
commit 3a44cb9e6a
118 changed files with 31630 additions and 0 deletions
+248
View File
@@ -0,0 +1,248 @@
# 03 - miot_cloud.py 移植计划
## 概览
| 项目 | 内容 |
|------|------|
| **Python 文件** | `py-miot/miot_cloud.py` (270行) |
| **Go 文件** | ❌ 缺失 |
| **状态** | ❌ 完全缺失 |
| **优先级** | 🔴 P0 |
| **预计工作量** | 10-14 小时 |
## Python 版本分析
### 核心类
#### MIoTOauthClient(OAuth 客户端)
**位置**:第 73-228 行
**主要职责**:
- OAuth 认证流程管理
- 生成授权 URL
- 获取和刷新 access token
- 管理 token 过期时间
**核心方法**:
| 方法名 | 行号 | 功能 | Go 状态 |
|--------|------|------|---------|
| `__init__` | 83 | 初始化 OAuth 客户端 | ❌ 缺失 |
| `gen_auth_url` | 121 | 生成授权 URL | ❌ 缺失 |
| `get_access_token_async` | 193 | 使用授权码获取 access token | ❌ 缺失 |
| `refresh_access_token_async` | 212 | 使用 refresh token 刷新 access token | ❌ 缺失 |
| `deinit_async` | 112 | 清理资源 | ❌ 缺失 |
#### MIoTHttpClient(HTTP 客户端)
**位置**:第 231-538 行
**主要职责**:
- 封装小米 IoT 云端 API 调用
- 处理设备查询、属性读写、动作调用
- 管理 HTTP 请求和响应
- 处理 token 过期和刷新
**核心方法**:
| 方法名 | 行号 | 功能 | Go 状态 |
|--------|------|------|---------|
| `__init__` | 246 | 初始化 HTTP 客户端 | ❌ 缺失 |
| `update_http_header` | 284 | 更新 HTTP 请求头 | ❌ 缺失 |
| `get_user_info_async` | 365 | 获取用户信息 | ❌ 缺失 |
| `get_central_cert_async` | 386 | 获取中央证书 | ❌ 缺失 |
| `get_homeinfos_async` | 459 | 获取家庭信息 | ❌ 缺失 |
| `get_separated_shared_devices_async` | 448 | 获取共享设备 | ❌ 缺失 |
## Go 版本现状
### 缺失的功能
整个 `miot_cloud.py` 模块在 Go 版本中完全缺失。
Go 版本中相关的云端调用分散在:
- `miot_client_api.go` - 部分 API 调用
- `http_client.go` - HTTP 客户端
但是缺少统一的云端客户端封装。
## 移植建议
### 第一批任务(核心功能)
1. **创建 `miot_cloud.go` 文件** (1小时)
- 定义 `MIoTCloud` 结构体
- 实现构造函数
2. **实现登录功能** (2小时)
- 实现 `Login` 方法
- 集成 OAuth token 管理
- 处理 token 过期和刷新
3. **实现设备查询** (2小时)
- 实现 `GetDevices` 方法
- 实现 `GetDeviceInfo` 方法
- 解析设备列表 JSON
4. **实现属性读写** (2小时)
- 实现 `GetDeviceProp` 方法
- 实现 `SetDeviceProp` 方法
- 处理批量读写
5. **实现动作调用** (2小时)
- 实现 `CallDeviceAction` 方法
- 处理同步和异步调用
- 解析返回结果
### 第二批任务(辅助功能)
6. **实现 LAN 命令转发** (2小时)
- 实现 `SendLanCommand` 方法
- 通过云端转发 LAN 命令
7. **优化 HTTP 客户端** (1小时)
- 集成 `http_client.go`
- 实现重试机制
- 实现错误处理
8. **实现请求签名** (2小时)
- 实现 `_build_url` 功能
- 实现请求签名算法
- 处理 API 版本
## 技术难点
### 1. OAuth Token 管理
**问题**:需要处理 token 的存储、读取、刷新
**建议**:
```go
type MIoTCloud struct {
// ...
oauthClient *MIoTOAuth
token *OAuthToken
}
func (c *MIoTCloud) Login() error {
// 尝试从存储加载 token
token, err := c.storage.LoadToken()
if err == nil && !token.IsExpired() {
c.token = token
return nil
}
// 刷新 token
token, err = c.oauthClient.RefreshToken(token)
if err != nil {
return err
}
c.token = token
return c.storage.SaveToken(token)
}
```
### 2. API 请求签名
**问题**:小米 IoT 云端 API 需要签名
**建议**:
- 参考 Python 版本的 `_build_url` 实现
- 实现签名算法(MD5、nonce、timestamp)
- 处理 API 版本差异
### 3. 错误处理
**问题**:云端 API 可能返回各种错误
**建议**:
```go
type CloudError struct {
Code int
Message string
}
func (e *CloudError) Error() string {
return fmt.Sprintf("cloud error: code=%d, message=%s", e.Code, e.Message)
}
func (c *MIoTCloud) handleResponse(resp *http.Response) (interface{}, error) {
// 解析响应
// 检查错误码
// 返回结果或错误
}
```
## 测试计划
### 单元测试
1. **登录测试**
- 测试 token 加载
- 测试 token 刷新
- 测试登录失败
2. **设备查询测试**
- 测试获取设备列表
- 测试获取设备信息
- 测试解析错误
3. **属性读写测试**
- 测试获取属性
- 测试设置属性
- 测试批量操作
4. **动作调用测试**
- 测试调用动作
- 测试参数验证
- 测试结果解析
### 集成测试
1. **端到端测试**
- 使用真实账号测试
- 测试完整流程:登录 → 查询 → 控制
## 依赖关系
| 依赖文件 | 关系 | 说明 |
|---------|------|------|
| `miot_oauth.py` | 强依赖 | OAuth 认证 |
| `miot_storage.py` | 强依赖 | Token 存储 |
| `http_client.go` | 强依赖 | HTTP 客户端 |
## 移植优先级
| 任务 | 优先级 | 理由 |
|------|--------|------|
| 创建基础结构 | 🔴 高 | 基础框架 |
| 实现登录功能 | 🔴 高 | 核心功能,其他功能依赖 |
| 实现设备查询 | 🔴 高 | 核心功能 |
| 实现属性读写 | 🔴 高 | 核心功能 |
| 实现动作调用 | 🔴 高 | 核心功能 |
| 实现 LAN 命令转发 | 🟡 中 | 高级功能 |
| 优化 HTTP 客户端 | 🟡 中 | 优化功能 |
| 实现请求签名 | 🟡 中 | 必要功能 |
## 进度跟踪
- [ ] 创建 `miot_cloud.go` 文件 (预计 1小时)
- [ ] 实现登录功能 (预计 2小时)
- [ ] 实现设备查询 (预计 2小时)
- [ ] 实现属性读写 (预计 2小时)
- [ ] 实现动作调用 (预计 2小时)
- [ ] 实现 LAN 命令转发 (预计 2小时)
- [ ] 优化 HTTP 客户端 (预计 1小时)
- [ ] 实现请求签名 (预计 2小时)
- [ ] 单元测试 (预计 4小时)
- [ ] 集成测试 (预计 2小时)
**总计**:20小时
---
**创建时间**:2026-06-28
**最后更新**:2026-06-28
**负责人**:待定