- 实现 MIoT 客户端核心功能(MQTT 连接、设备管理、属性读写) - 支持云端 API 调用与局域网设备发现(mDNS) - 集成国际化(i18n)多语言支持 - 添加 MIoT 设备规约解析器(spec_parser) - 包含单元测试与使用示例
4.4 KiB
4.4 KiB
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 版本中完全缺失。
缺失的核心功能
-
mDNS 服务发现
- 基于 Zeroconf/bonjour 协议
- 发现 MIoT 中央 hub 网关
-
服务数据解析
- 解析 mDNS profile 数据
- 提取设备 ID、组 ID、角色等信息
-
服务状态管理
- 服务添加/更新/删除
- 订阅和通知机制
移植建议
第一批任务(数据解析)
-
实现服务数据解析 (2小时)
MipsServiceData→MipsServiceData- Profile 解析(Base64 解码)
- 提取 did、group_id、role、suite_mqtt
-
实现服务状态管理 (1小时)
MipsServiceState→MipsServiceState枚举- 状态变化通知
第二批任务(服务发现)
-
实现 mDNS 客户端 (2小时)
- 使用 Go 的 mDNS 库(如
github.com/hashicorp/mdns) - 实现服务发现和监听
- 使用 Go 的 mDNS 库(如
-
实现订阅管理 (1小时)
sub_service_change→SubscribeServiceChangeunsub_service_change→UnsubscribeServiceChange
第三批任务(测试)
- 单元测试 (1小时)
- 测试服务数据解析
- 测试服务发现(需要网络环境)
技术难点
1. mDNS 库选择
问题:Python 使用 python-zeroconf,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 数据
建议:
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 负责人:待定