- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
185 lines
3.9 KiB
Markdown
185 lines
3.9 KiB
Markdown
# 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
|
||
**负责人**:待定
|