- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
107 lines
2.9 KiB
Markdown
107 lines
2.9 KiB
Markdown
# 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 → 分发给订阅者
|
||
```
|