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
+184
View File
@@ -0,0 +1,184 @@
# 12 - miot_lan.py 移植计划
## 概览
| 项目 | 内容 |
|------|------|
| **Python 文件** | `py-miot/miot_lan.py` (53,181字节) |
| **Go 文件** | ❌ 缺失 |
| **状态** | ❌ 完全缺失 |
| **优先级** | 🟢 P2 |
| **预计工作量** | 20-28 小时 |
## Python 版本核心类
### 设备管理
| 类名 | 行号 | 功能 | Go 状态 |
|------|------|------|---------|
| `_MIoTLanDevice` | 131 | LAN 设备(加密通信) | ❌ 缺失 |
| `_MIoTLanDeviceState` | 123 | 设备状态枚举 | ❌ 缺失 |
### 数据类
| 类名 | 行号 | 功能 | Go 状态 |
|------|------|------|---------|
| `_MIoTLanRequestData` | 115 | LAN 请求数据 | ❌ 缺失 |
| `_MIoTLanSubDeviceData` | 102 | 订阅设备数据 | ❌ 缺失 |
| `_MIoTLanBroadcastData` | 91 | 广播数据 | ❌ 缺失 |
### 主类
| 类名 | 行号 | 功能 | Go 状态 |
|------|------|------|---------|
| `MIoTLan` | ~300 | LAN 管理主类 | ❌ 缺失 |
## Go 版本现状
整个 `miot_lan.py` 模块在 Go 版本中完全缺失。
### 缺失的核心功能
1. **设备管理**
- 设备发现和注册
- 设备状态监控(PING/DEAD)
- 保活机制
2. **加密通信**
- AES-128-CBC 加密
- Token 管理
- 消息加解密
3. **网络管理**
- UDP 通信
- 广播和单播
- 网络接口管理
4. **订阅管理**
- 设备订阅/取消订阅
- 广播注册/取消注册
- 设备状态订阅
## 移植建议
### 第一批任务(数据结构和加密)
1. **实现数据结构** (4小时)
- 数据类(RequestData, SubDeviceData, BroadcastData)
- 设备状态枚举
- LAN 设备结构体
2. **实现加密通信** (4小时)
- AES-128-CBC 加密
- Token 管理
- 消息加解密
### 第二批任务(设备管理)
3. **实现设备管理** (6小时)
- 设备发现和注册
- 设备状态监控
- 保活机制
4. **实现网络通信** (4小时)
- UDP 通信
- 广播和单播
- 网络接口管理
### 第三批任务(高级功能)
5. **实现订阅管理** (4小时)
- 设备订阅/取消订阅
- 广播注册/取消注册
6. **实现网络状态管理** (3小时)
- 网络状态监控
- 网络不稳定性检测
7. **单元测试** (4小时)
- 测试加密通信
- 测试设备发现
- 测试订阅管理
## 技术难点
### 1. AES 加密
**问题**:Python 使用 `cryptography` 库,Go 使用标准库
**建议**:
```go
import (
"crypto/aes"
"crypto/cipher"
"crypto/md5"
)
func NewAESCipher(token []byte) (cipher.Block, []byte, error) {
aesKey := md5Sum(token)
aesIV := md5Sum(append(aesKey[:], token...))
block, err := aes.NewCipher(aesKey[:])
return block, aesIV[:], err
}
```
### 2. UDP 通信
**问题**:需要实现 UDP 广播和单播
**建议**:
```go
import "net"
func (d *LanDevice) SendBroadcast(data []byte) error {
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4bcast,
Port: 54321,
})
// ...
}
```
### 3. 设备状态监控
**问题**:需要实现 PING 检测和设备状态管理
**建议**:
```go
type LanDeviceState int
const (
LanDeviceFresh LanDeviceState = iota
LanDevicePing1
LanDevicePing2
LanDevicePing3
LanDeviceDead
)
```
## 依赖关系
| 依赖文件 | 关系 | 说明 |
|---------|------|------|
| `miot_error.py` | 强依赖 | 错误定义 |
| `miot_network.py` | 强依赖 | 网络管理 |
| `miot_mdns.py` | 强依赖 | mDNS 发现 |
| `cryptography` | 强依赖 | 加密库 |
## 进度跟踪
- [ ] 实现数据结构 (预计 4小时)
- [ ] 实现加密通信 (预计 4小时)
- [ ] 实现设备管理 (预计 6小时)
- [ ] 实现网络通信 (预计 4小时)
- [ ] 实现订阅管理 (预计 4小时)
- [ ] 实现网络状态管理 (预计 3小时)
- [ ] 单元测试 (预计 4小时)
**总计**:29小时
---
**创建时间**:2026-06-28
**最后更新**:2026-06-28
**负责人**:待定