- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
114 lines
3.7 KiB
Markdown
114 lines
3.7 KiB
Markdown
# 第二批移植任务提示词 (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
|
||
```
|