# 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 **负责人**:待定