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

4.4 KiB
Raw Permalink Blame History

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 枚举
    • 状态变化通知

第二批任务(服务发现)

  1. 实现 mDNS 客户端 (2小时)

    • 使用 Go 的 mDNS 库(如 github.com/hashicorp/mdns)
    • 实现服务发现和监听
  2. 实现订阅管理 (1小时)

    • sub_service_change → SubscribeServiceChange
    • unsub_service_change → UnsubscribeServiceChange

第三批任务(测试)

  1. 单元测试 (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 负责人:待定