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