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

3.7 KiB
Raw Blame History

第二批移植任务提示词 (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