- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
175 lines
4.4 KiB
Markdown
175 lines
4.4 KiB
Markdown
# 13 - miot_mdns.py 移植计划
|
||
|
||
## 概览
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| **Python 文件** | `py-miot/miot_mdns.py` (286行) |
|
||
| **Go 文件** | ❌ 缺失 |
|
||
| **状态** | ❌ 完全缺失 |
|
||
| **优先级** | 🟢 P2 |
|
||
| **预计工作量** | 6-8 小时 |
|
||
|
||
## Python 版本核心类
|
||
|
||
### 数据类
|
||
|
||
| 类名 | 行号 | 功能 | Go 状态 |
|
||
|------|------|------|---------|
|
||
| `MipsServiceState` | 76 | 服务状态枚举(ADDED/REMOVED/UPDATED) | ❌ 缺失 |
|
||
| `MipsServiceData` | 82 | 服务数据(profile 解析) | ❌ 缺失 |
|
||
|
||
### 主类
|
||
|
||
| 类名 | 行号 | 功能 | Go 状态 |
|
||
|------|------|------|---------|
|
||
| `MipsService` | 147 | mDNS 服务发现 | ❌ 缺失 |
|
||
|
||
### 核心方法
|
||
|
||
| 方法名 | 行号 | 功能 | Go 状态 |
|
||
|--------|------|------|---------|
|
||
| `init_async` | 167 | 初始化 Zeroconf 浏览器 | ❌ 缺失 |
|
||
| `deinit_async` | 176 | 清理资源 | ❌ 缺失 |
|
||
| `get_services` | 181 | 获取服务列表 | ❌ 缺失 |
|
||
| `sub_service_change` | 208 | 订阅服务变化 | ❌ 缺失 |
|
||
| `unsub_service_change` | 216 | 取消订阅 | ❌ 缺失 |
|
||
| `__on_service_state_change` | 223 | 状态变化回调 | ❌ 缺失 |
|
||
| `__request_service_info_async` | 243 | 请求服务信息 | ❌ 缺失 |
|
||
|
||
## Go 版本现状
|
||
|
||
整个 `miot_mdns.py` 模块在 Go 版本中完全缺失。
|
||
|
||
### 缺失的核心功能
|
||
|
||
1. **mDNS 服务发现**
|
||
- 基于 Zeroconf/bonjour 协议
|
||
- 发现 MIoT 中央 hub 网关
|
||
|
||
2. **服务数据解析**
|
||
- 解析 mDNS profile 数据
|
||
- 提取设备 ID、组 ID、角色等信息
|
||
|
||
3. **服务状态管理**
|
||
- 服务添加/更新/删除
|
||
- 订阅和通知机制
|
||
|
||
## 移植建议
|
||
|
||
### 第一批任务(数据解析)
|
||
|
||
1. **实现服务数据解析** (2小时)
|
||
- `MipsServiceData` → `MipsServiceData`
|
||
- Profile 解析(Base64 解码)
|
||
- 提取 did、group_id、role、suite_mqtt
|
||
|
||
2. **实现服务状态管理** (1小时)
|
||
- `MipsServiceState` → `MipsServiceState` 枚举
|
||
- 状态变化通知
|
||
|
||
### 第二批任务(服务发现)
|
||
|
||
3. **实现 mDNS 客户端** (2小时)
|
||
- 使用 Go 的 mDNS 库(如 `github.com/hashicorp/mdns`)
|
||
- 实现服务发现和监听
|
||
|
||
4. **实现订阅管理** (1小时)
|
||
- `sub_service_change` → `SubscribeServiceChange`
|
||
- `unsub_service_change` → `UnsubscribeServiceChange`
|
||
|
||
### 第三批任务(测试)
|
||
|
||
5. **单元测试** (1小时)
|
||
- 测试服务数据解析
|
||
- 测试服务发现(需要网络环境)
|
||
|
||
## 技术难点
|
||
|
||
### 1. mDNS 库选择
|
||
|
||
**问题**:Python 使用 `python-zeroconf`,Go 需要选择对应的库
|
||
|
||
**建议**:
|
||
```go
|
||
// 使用 github.com/hashicorp/mdns
|
||
import "github.com/hashicorp/mdns"
|
||
|
||
type MipsService struct {
|
||
server *mdns.Server
|
||
services map[string]*MipsServiceData
|
||
}
|
||
|
||
func (s *MipsService) Init() error {
|
||
// 创建 mDNS 浏览器
|
||
entriesCh := make(chan *mdns.ServiceEntry, 32)
|
||
go func() {
|
||
for entry := range entriesCh {
|
||
s.handleServiceEntry(entry)
|
||
}
|
||
}()
|
||
|
||
return mdns.Lookup("_miot-central._tcp.local.", entriesCh)
|
||
}
|
||
```
|
||
|
||
### 2. Profile 解析
|
||
|
||
**问题**:需要解析二进制 profile 数据
|
||
|
||
**建议**:
|
||
```go
|
||
import "encoding/binary"
|
||
|
||
type MipsServiceData struct {
|
||
Name string
|
||
Addresses []string
|
||
Port int
|
||
Did string
|
||
GroupID string
|
||
Role int
|
||
SuiteMQTT bool
|
||
}
|
||
|
||
func ParseProfile(profileB64 string) (*MipsServiceData, error) {
|
||
profileBin, err := base64.StdEncoding.DecodeString(profileB64)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
// 解析 did (1-8 bytes, big-endian)
|
||
did := binary.BigEndian.Uint64(profileBin[1:9])
|
||
// 解析 group_id (9-16 bytes, little-endian)
|
||
groupID := hex.EncodeToString(reverseBytes(profileBin[9:17]))
|
||
// 解析 role (byte 20, upper 4 bits)
|
||
role := int(profileBin[20] >> 4)
|
||
// 解析 suite_mqtt (byte 22, bit 1)
|
||
suiteMQTT := ((profileBin[22] >> 1) & 0x01) == 0x01
|
||
|
||
return &MipsServiceData{...}, nil
|
||
}
|
||
```
|
||
|
||
## 依赖关系
|
||
|
||
| 依赖文件 | 关系 | 说明 |
|
||
|---------|------|------|
|
||
| `miot_error.py` | 强依赖 | 错误定义 |
|
||
| `github.com/hashicorp/mdns` | 强依赖 | mDNS 库 |
|
||
| `net` | 强依赖 | 网络操作 |
|
||
|
||
## 进度跟踪
|
||
|
||
- [ ] 实现服务数据解析 (预计 2小时)
|
||
- [ ] 实现服务状态管理 (预计 1小时)
|
||
- [ ] 实现 mDNS 客户端 (预计 2小时)
|
||
- [ ] 实现订阅管理 (预计 1小时)
|
||
- [ ] 单元测试 (预计 1小时)
|
||
|
||
**总计**:7小时
|
||
|
||
---
|
||
|
||
**创建时间**:2026-06-28
|
||
**最后更新**:2026-06-28
|
||
**负责人**:待定
|