Files
xiaomihome/miot/migration/13-miot-mdns.md
T
4566704 3a44cb9e6a feat: 初始化小米 IoT (MIoT) 智能家居 Go 库
- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写)
- 支持云端 API 调用与局域网设备发现(mDNS)
- 集成国际化(i18n)多语言支持
- 添加 MIoT 设备规约解析器(spec_parser)
- 包含单元测试与使用示例
2026-06-28 22:05:49 +08:00

175 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
**负责人**:待定