# 第三轮审查方案 — 体读验证 > 方法:逐函数读体 → 对照 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 项部分实现需要修复。**