Add support for Matter in your smart home app
System & Services 进阶 14m

在你的智能家居 App 中支持 Matter

Add support for Matter in your smart home app

2021年6月10日

在 Apple 官方观看视频

一句话判断

Matter 是智能家居行业的「USB-C 时刻」——一个设备一个协议终于要结束了,你的 App 需要为这个统一标准做好准备。

这场 Session 讲了什么

Matter(前身为 Project CHIP)是一个新的智能家居连接标准,由 Apple、Google、Amazon、Samsung 等公司联合推动。它的目标是让所有智能家居设备用同一个协议通信,不管你用的是哪个平台的 App。这个 Session 讲的是:作为开发者,如何让你的智能家居 App 支持 Matter 设备。

Session 介绍了 Matter 的基本架构:Matter 设备通过 Wi-Fi 或 Thread 连接到家庭网络,一个 Matter 控制器(比如 Apple TV、HomePod mini)负责管理所有设备。每个 Matter 设备有一个「设备类型」(灯泡、门锁、传感器等)和一组「集群」(Cluster),集群定义了设备支持的功能(开关、亮度调节、颜色设置等)。

对于 iOS 开发者来说,接入 Matter 不需要直接处理底层协议。苹果提供了 Matter 支持层,你的 App 通过 HomeKit API(HMHomeManager)就能发现和控制 Matter 设备。用户在「家庭」App 中添加 Matter 设备后,你的 App 可以通过 HMAccessory 对象访问和控制它们。

值得深挖的点

Thread 网络和 Border Router 的概念。 Matter 支持 Thread 协议——一种低功耗的 mesh 网络技术,适合传感器、灯泡等小型设备。但 Thread 设备本身不能直接和 Wi-Fi 网络通信,需要一个 Thread Border Router 做桥接。Apple TV 4K 和 HomePod mini 可以充当 Thread Border Router。你的 App 不需要了解 Thread 的底层细节——系统会自动处理 Thread 网络的管理和路由。但你需要理解:用户家中的 Thread 网络质量取决于 Border Router 的数量和位置,如果你做的是设备配置类 App,需要考虑引导用户优化 Thread 网络。

Matter 设备的多管理员(Multi-Admin)支持。 Matter 的一个核心特性是多管理员——一个设备可以同时被多个生态系统控制(比如同时被 Apple Home 和 Google Home 管理)。这意味着用户不需要在你的 App 中重新配对设备,只要设备已经在「家庭」App 中添加了,你的 App 就可以通过 HomeKit API 控制它。但这也带来一个挑战:多个 App 可能同时控制同一个设备,你需要处理状态同步的问题——设备可能被另一个 App 关掉了,你的 App 需要能及时反映这个变化。

代码片段

import HomeKit

// 发现和控制 Matter 设备(通过 HomeKit API)
class HomeManagerDelegate: NSObject, HMHomeManagerDelegate {
    let homeManager = HMHomeManager()

    func setup() {
        homeManager.delegate = self
    }

    // 当家庭数据加载完成
    func homeManagerDidUpdateHomes(_ manager: HMHomeManager) {
        for home in manager.homes {
            for accessory in home.accessories {
                // Matter 设备和普通 HomeKit 设备使用相同的 API
                print("设备: \(accessory.name)")
                print("类别: \(accessory.category)")

                for service in accessory.services {
                    for characteristic in service.characteristics {
                        print("特征: \(characteristic.localizedDescription)")
                    }
                }
            }
        }
    }
}
// 控制一个 Matter 灯泡
func controlMatterLight(accessory: HMAccessory) {
    guard let lightService = accessory.services.first(where: { $0.serviceType == HMServiceTypeLightbulb }) else {
        return
    }

    // 找到电源开关特征
    guard let powerChar = lightService.characteristics.first(where: { $0.characteristicType == HMCharacteristicTypePowerState }) else {
        return
    }

    // 打开灯
    powerChar.writeValue(true) { error in
        if let error = error {
            print("控制失败: \(error)")
        }
    }

    // 调节亮度
    if let brightnessChar = lightService.characteristics.first(where: { $0.characteristicType == HMCharacteristicTypeBrightness }) {
        brightnessChar.writeValue(75) { error in
            // 设置亮度为 75%
        }
    }
}
// 监听 Matter 设备状态变化
func observeDeviceChanges(home: HMHome) {
    // 注册为代理以接收设备状态更新
    home.delegate = self

    // 当任何配件状态变化时触发
    // HMHomeDelegate 方法:
    // home(_:didUpdate:) — 配件更新
}

extension HomeViewController: HMHomeDelegate {
    func home(_ home: HMHome, didUpdate accessory: HMAccessory) {
        // 设备属性或状态发生了变化
        // 可能是其他 App 或自动化触发的
        updateUI(for: accessory)
    }
}

最佳实践

  • 不要假设设备一定是 Matter 设备——通过 HomeKit API 统一处理所有类型的设备(HomeKit、Matter、Bridge),你的代码不需要区分
  • 对于可能耗时的操作(比如开关百叶窗),使用 writeValue 的回调来确认操作是否成功,而不是假设写入就成功了
  • 用户家中的网络环境复杂多变——设备可能离线、Thread 网络可能不稳定,你的 App 需要优雅处理这些情况
  • 测试时使用真实的 Matter 设备,模拟器无法模拟 Thread/Wi-Fi 通信

还有什么值得关注

  • 苹果推荐使用 HomeKit ADK(开源)来开发 Matter 设备端固件
  • 「家庭」App 在 iOS 15 中支持自动发现附近的 Matter 设备,用户扫码即可添加
  • HMAccessoryCategory 新增了多种 Matter 设备类型(门锁、窗帘、温控器等)
WWDC 2021