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

84 lines
4.2 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.
# 第三轮审查方案 — 体读验证
> 方法:逐函数读体 → 对照 Python 行为 → 标记空实现/部分实现/完整
> 判定标准:有 TODO 标记 + 无业务逻辑 = ❌ 空实现;有逻辑但缺关键分支 = ⚠️ 部分
## 审查清单(18 项)
### 块 A — Init() 链路(6 项已验证,0 项新)
| # | 函数 | Python 行 | Go 状态 | 备注 |
|---|------|----------|---------|------|
| A1 | OAuth 初始化 | 283-288 | ✅ | `NewMIoTOauthClient` 已调用 |
| A2 | Cert 初始化 | 296-299 | ✅ | `NewMIoTCert` + `VerifyCACert` |
| A3 | MipsCloud 初始化 | 301-310 | ✅ | `NewMipsCloudClient` + `Connect` |
| A4 | Network 订阅 | 312-316 | ✅ | `SubNetworkStatus` + 初始触发 |
| A5 | mDNS + MipsLocal + LAN | 319-371 | ✅ | `SubServiceChange` + `NewMipsLocalClient` + `SubLanState` |
| A6 | i18n | 275-279 | ✅ | `NewMIoTI18n` + `Init` |
### 块 B — Deinit() 链路
| # | 操作 | Python 行 | Go 状态 |
|---|------|----------|---------|
| B1 | network.unsub | 376 | ✅ |
| B2 | cancel refresh_props_timer | 379-382 | ✅ |
| B3 | mips_cloud unsub → deinit | 385-387 | ✅ |
| B4 | mDNS unsub_service_change | 395-396 | ✅ |
| B5 | 遍历 mips_local: unsub → disconnect | 397-399 | ✅ |
| B6 | cancel gw timers | ✅(并入 local loop) |
| B7 | LAN: unsub_lan_state → unsub_device_state → delete_devices → vote(false) | 400- | 需检查 |
| B8 | oauth.deinit | | 需检查 |
| B9 | http.deinit | | 需检查 |
| B10 | i18n.deinit | | ✅ |
| B11 | cancel notify timer | | 需检查 |
| B12 | **save device cache to storage** | | ✅ |
### 块 C — 回调事件处理(关键链路)
| # | 函数 | Python 行为 | Go 状态 |
|---|------|-----------|---------|
| C1 | `onMipsCloudStateChanged(disconnect)` | 批量标记所有 cloud device offline + 聚合 cache | ❌ **只有 fmt.Printf + TODO** |
| C2 | `onMipsLocalStateChanged(disconnect)` | 批量标记该网关所有 device offline + 聚合 | ❌ **只有 fmt.Printf + TODO** |
| C3 | `onMipsServiceStateChange` | 创建/销毁 MipsLocalClient + connect | ❌ **只有 fmt.Printf + TODO** |
| C4 | `onGWDeviceListChanged` | 从网关拉取设备列表 + 更新 gw cache | ❌ **只有 fmt.Printf + TODO** |
| C5 | `onLanDeviceStateChanged` | 更新 LAN cache + 聚合到 device cache | ❌ **方法不存在** |
### 块 D — MQTT 消息处理
| # | 函数 | Python 行为 | Go 状态 |
|---|------|-----------|---------|
| D1 | `handleMIPSMessage` | MIPS payload 解包 → dispatch 到 subTree 订阅者 | ❌ **只有 fmt.Printf + TODO** |
| D2 | `handleMIPSStateMessage` | 解析 state 消息 → 更新 online 状态 → 回调 OnDeviceStateChanged | ❌ **只有 fmt.Printf + TODO** |
| D3 | `OnDeviceStateChanged` | 更新对应源 + 三源聚合 + 通知 | ⚠️ 只更新 cloud cache,未调 checkDeviceState 聚合 |
| D4 | `updateDeviceMsgSub` | 三源优先级 + push_available 检测 + 订阅切换 | ⚠️ 简化版,缺 push_available 检测和 unsub/sub 切换 |
### 块 E — Token/证书刷新
| # | 函数 | Python 行为 | Go 状态 |
|---|------|-----------|---------|
| E1 | `RequestRefreshAuthInfo` | 定时器 → refresh_oauth_info_async: load_storage → 判断有效期 → refresh → 更新 http/mips_cloud → save_storage | ❌ **回调只有 fmt.Printf + TODO** |
| E2 | `RequestRefreshUserCert` | 定时器 → refresh_user_cert_async: verify_ca → 判断有效期 → gen_user_csr → get 云端证书 → save | ❌ **回调只有 fmt.Printf + TODO** |
### 块 F — 设备列表更新
| # | 函数 | Python 行为 | Go 状态 |
|---|------|-----------|---------|
| F1 | `updateDevicesFromCloud` | BLE默认online/子设备合并/owner分离/diff检测/通知 | ✅ 已实现 |
| F2 | `loadCacheDevice` | storage.Load('miot_devices', key, 'dict') + 复制到 cloud/gw cache | ⚠️ 需验证存储 key 格式和初始复制逻辑 |
---
## 汇总
| 块 | 总数 | ✅ | ⚠️ | ❌ |
|-----|------|----|-----|----|
| A Init | 6 | 6 | 0 | 0 |
| B Deinit | 12 | 10 | 2 | 0 |
| C 回调 | 5 | 0 | 0 | 5 |
| D MQTT | 4 | 0 | 2 | 2 |
| E Token/Cert | 2 | 0 | 0 | 2 |
| F 设备 | 2 | 1 | 1 | 0 |
| **合计** | **31** | **17** | **5** | **9** |
**9 项空实现 + 5 项部分实现需要修复。**