- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
84 lines
4.2 KiB
Markdown
84 lines
4.2 KiB
Markdown
# 第三轮审查方案 — 体读验证
|
||
|
||
> 方法:逐函数读体 → 对照 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 项部分实现需要修复。**
|