# RefreshDeviceAllProps 方案 ## 现状 | 版本 | 单个入队 | 批量执行 | 全量刷新 | |------|---------|---------|---------| | Python | `request_refresh_prop(did,siid,piid)` | `__refresh_props_handler` 200ms 聚合 150/批 | `MIoTDevice.__refresh_props_value()` | | Go | `RequestRefreshProp(did,siid,piid)` | `refreshPropsHandler` 200ms 聚合 150/批 | ❌ 缺失 | ## 方案 ### 在 `miot_client_prop.go` 新增: ```go // RefreshDeviceAllProps 刷新指定设备的所有可读属性 // 遍历 device.ServiceList → service.Properties → RequestRefreshProp func (c *MIoTClient) RefreshDeviceAllProps(did string) error { // 1. 查找设备 c.deviceListMu.RLock() info, exists := c.deviceListCache[did] c.deviceListMu.RUnlock() if !exists { return fmt.Errorf("device %s not found", did) } // 2. 获取 SPEC(需要 MIoTDevice 或 MIoTSpecParser) device := c.getOrCreateDevice(did, info) if device == nil { return fmt.Errorf("failed to create device for %s", did) } // 3. 遍历所有 service → property,入队可读属性 for _, svc := range device.ServiceList() { for _, prop := range svc.Properties { if !prop.Readable() { continue } c.RequestRefreshProp(did, prop.SIID, prop.PIID) } } return nil } ``` ### 前置依赖 需要 `MIoTClient` 能按 did 获取/创建 `MIoTDevice` 实例。可在 `miot_client.go` 或 `miot_client_device.go` 中新增内部方法: ```go // getOrCreateDevice 从缓存获取或创建 MIoTDevice func (c *MIoTClient) getOrCreateDevice(did string, info map[string]interface{}) *MIoTDevice { // 尝试从已有列表读取 if dev, ok := c.devices[did]; ok { return dev } // 创建新实例(需要 SPEC 解析器) if c.specParser == nil { return nil } urn, _ := info["urn"].(string) model, _ := info["model"].(string) spec, err := c.specParser.Parse(urn, model) if err != nil { return nil } dev := NewMIoTDevice(c, info, spec) c.devices[did] = dev return dev } ``` ### 需要在 `MIoTClient` 结构体新增字段 ```go // miot_client.go type MIoTClient struct { // ... specParser *MIoTSpecParser // SPEC 解析器 devices map[string]*MIoTDevice // did → 设备实例缓存 } ``` ### Setter ```go func (c *MIoTClient) SetSpecParser(p *MIoTSpecParser) { c.specParser = p } ``` ## 影响范围 | 文件 | 改动 | |------|------| | `miot_client.go` | +2 字段 (`specParser`, `devices`) + 1 setter | | `miot_client_prop.go` | +1 方法 `RefreshDeviceAllProps` | | `miot_client_device.go` | +1 方法 `getOrCreateDevice` | ## 验证 ```go // 用法示例 client.RefreshDevices() // 获取设备列表 client.RefreshDeviceAllProps("did_xxx") // 一次刷新该设备所有属性 // 200ms 后属性到达 → OnPropMsg → 分发给订阅者 ```