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

114 lines
3.7 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.
# 第二批移植任务提示词 (P1 高级功能)
> 源文件在 `D:\miot\py-miot\`,子文档在 `D:\miot\go-miot\migration\`
## 任务 2.1 — miot_spec.py → spec_parser.go (补全)
```
目标文件:D:\miot\go-miot\spec_parser.go(现有 stub,需补全)
详细说明:D:\miot\go-miot\migration\09-miot-spec.md
spec_parser.go 已有所有结构体定义(MIoTSpecInstance、MIoTSpecService、MIoTSpecProperty 等),
但 Parse() 是 stub。需实现:
1. _SpecStdLib → SpecStdLib 结构体
- 字段:lang, devices/services/properties/events/actions/values map
- DeviceTranslate/ServiceTranslate/PropertyTranslate/EventTranslate/ActionTranslate/ValueTranslate
- Refresh() — 从 miot-spec.org 和 cdn.cnbj1.fds.api.mi-img.com 下载标准库 JSON
- 缓存到 storage,有效期 SPEC_STD_LIB_EFFECTIVE_TIME
2. Parse 方法
- 读取本地 JSON 规格文件(specDir/{urn}.json)
- 用标准库翻译 description
- 构建 MIoTSpecInstance → MIoTSpecService → MIoTSpecProperty/Event/Action 树
- 跳过 proprietary=true 的项
3. 属性处理
- format_ 映射:string→str, bool→bool, float→float, 其他默认int
- access 列表解析 writable/readable/notifiable
- ValueRange 加载(min/max/step)
- ValueList 加载(去重描述、多语言)
- Precision 从 step 计算
### 注意事项
- 不依赖 miot_cloud(独立模块)
- 标准库 JSON 下载失败不中断,只打日志
- spec_parser.go 末尾有 errors import,可以用 miot_error 替换
```
---
## 任务 2.2 — miot_mips.py → mips_client.go (补全)
```
目标文件:D:\miot\go-miot\mips_client.go(现有基础结构,需补全)
详细说明:D:\miot\go-miot\migration\10-miot-mips.md
需实现:
1. MipsMessage 打包/解包
- Pack(mid int, payload, msgFrom, retTopic string) []byte
- Unpack(data []byte) *MipsMessage
- 协议格式:每段 [4字节len][1字节type][len字节数据+1字节\x00]
2. MipsClient 结构体
- MQTT 连接管理(host/port/username/password/cert)
- 连接状态:_event_connect / _event_disconnect
- 重连机制:指数退避(10s~600s)
3. 订阅管理
- 订阅队列(MIPS_SUB_PATCH=300,MIPS_SUB_INTERVAL=1)
- 设备状态订阅(MipsDeviceState)
- 广播订阅(MipsBroadcast)
4. 请求管理
- 请求 ID 生成(mid)
- 超时处理(Timer)
- 回复回调
5. MIoTDeviceState 枚举:DISABLE=0, OFFLINE=1, ONLINE=2
### 依赖
- MQTT 库:github.com/eclipse/paho.mqtt.golang
- miot_error.go, const.go
```
---
## 任务 2.3 — miot_network.py → miot_network.go
```
源文件:D:\miot\py-miot\miot_network.py
目标文件:D:\miot\go-miot\miot_network.go(新建)
实现 MIoTNetwork(网络状态监控器):
1. 数据结构
- InterfaceStatus 枚举:ADD=0, UPDATE=1, REMOVE=2
- NetworkInfo 结构体:name, ip, netmask, netSeg string
2. MIoTNetwork 结构体
- ipAddrMap / httpAddrMap(已知地址 + 响应时间缓存)
- networkStatus bool
- networkInfo map[string]*NetworkInfo
- 订阅列表(networkStatus 和 networkInfo 回调)
3. 核心方法
- Init() — 启动监控
- Deinit() — 停止监控
- GetNetworkStatus() bool — ping + HTTP 组合检测
- GetNetworkInfo() map[string]*NetworkInfo — 获取网卡信息(跳过 lo/docker/hassio)
- Refresh() — 手动刷新
- 定时刷新间隔:NETWORK_REFRESH_INTERVAL=30s
4. 检测逻辑
- PingMulti(ipList) — 逐 IP ping,记录响应时间
- HTTPMulti(urlList) — HTTP HEAD/GET 检测
- 优先检测响应最快的地址,全失败则遍历所有
### 注意事项
- Windows 用 ping -n 1 -w,Linux 用 ping -c 1 -w
- 网络接口获取:Go 用 net.Interfaces() 替代 Python psutil
- IPv4 only,过滤 127.0.0.1
```