Files
4566704 3a44cb9e6a feat: 初始化小米 IoT (MIoT) 智能家居 Go 库
- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写)
- 支持云端 API 调用与局域网设备发现(mDNS)
- 集成国际化(i18n)多语言支持
- 添加 MIoT 设备规约解析器(spec_parser)
- 包含单元测试与使用示例
2026-06-28 22:05:49 +08:00

185 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
**负责人**:待定