网络唤醒 Cluster(WakeOnLan)
Cluster ID: 0x0503 |
所在 Endpoint: 媒体端点(电视、机顶盒、游戏主机等) |
角色: Server(只读,无命令)
WakeOnLan 是 Matter 媒体设备中一个非常简单但实用的 Cluster —— 它不包含任何命令,只暴露设备的 MAC 地址和 IPv6 链路本地地址, 让外部系统能够通过发送 WoL Magic Packet(魔术包)将处于待机或休眠状态的设备远程唤醒。
这个 Cluster 通常和 LowPower Cluster(0x0508)配合使用: LowPower 负责让设备进入低功耗待机状态(Sleep 命令), WakeOnLan 则提供唤醒所需的网络地址信息。两者一个管"睡",一个管"醒"。
设备进入深度休眠后,Matter 的 IP 通信栈可能已经关闭,无法接收正常的 Matter 消息。 但网卡硬件仍然监听特定模式的以太网帧(Magic Packet),收到后触发硬件中断唤醒整个系统。 这就是为什么需要一个专门的 Cluster 来暴露 MAC 地址 —— 唤醒操作发生在 Matter 协议层之下。
属性详解
WakeOnLan Cluster 只有 2 个属性,全部只读,没有任何命令和事件。 两个属性都是可选的,但至少要支持其中一个,否则这个 Cluster 没有实际意义。
| ID | 名称 | 类型 | 必选 | 说明 |
|---|---|---|---|---|
0x0000 |
MACAddress | string | 可选 | 设备的 48 位 MAC 地址 |
0x0001 |
LinkLocalAddress | octstr (bytes) | 可选 | 设备的 IPv6 链路本地地址 |
MACAddress —— MAC 地址(0x0000)
设备用于接收 WoL Magic Packet 的以太网 MAC 地址。
格式为标准的 48 位 MAC,以冒号分隔的十六进制字符串表示,例如 AA:BB:CC:DD:EE:FF。
这个地址通常是设备有线网卡的地址。对于只有 WiFi 的设备,也可以是无线网卡的 MAC, 但 WoL 在 WiFi 环境下的可靠性远不如有线连接(需要路由器支持 WiFi WoL 转发)。
Matter 规范要求 MACAddress 以 大写十六进制 + 冒号分隔 的字符串格式存储,
例如 "AA:BB:CC:DD:EE:FF"。实际开发中建议做大小写兼容处理。
最大长度为 32 字节(含分隔符,可覆盖 48 位和 64 位 EUI 格式)。
LinkLocalAddress —— 链路本地地址(0x0001)
设备的 IPv6 链路本地地址(Link-Local Address),以字节数组形式存储,固定 16 字节。
链路本地地址以 fe80:: 开头,仅在同一网络链路(同一子网/VLAN)内有效。
这个地址的用途是让唤醒方知道设备在哪个链路上,以便将 Magic Packet 发送到正确的网段。 对于跨子网唤醒场景,还需要配合定向广播或子网转发。
当网络中存在多个子网或 VLAN 时,仅靠 MAC 地址不够 —— 广播域不同,Magic Packet 到不了目标设备。 LinkLocalAddress 可以帮助唤醒方确定目标设备所在的链路,选择正确的网络接口发送唤醒包。 如果你的环境是简单的单一子网(家庭网络的常见情况),通常只用 MACAddress 就够了。
WoL 唤醒机制
Wake-on-LAN(WoL)是一项已有数十年历史的网络标准,允许通过发送一个特殊的以太网帧(Magic Packet) 来远程唤醒处于待机、休眠或关机状态的设备。Matter 的 WakeOnLan Cluster 并不负责发送这个包, 它只是告诉你「往哪个地址发」。
Magic Packet 结构
Magic Packet 的格式非常简单:6 字节的 0xFF 同步头,
后面跟着目标 MAC 地址重复 16 次,总计 102 字节。
可以封装在 UDP 包中(常用端口 7 或 9),也可以直接作为以太网帧发送。
// WoL Magic Packet 结构(共 102 字节)
FF FF FF FF FF FF // 同步头:6 字节全 0xFF
AA BB CC DD EE FF // 目标 MAC 地址,重复 16 次
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
AA BB CC DD EE FF
唤醒流程
- 从设备的 WakeOnLan Cluster 读取
MACAddress(设备在线时提前缓存) - 设备进入待机/休眠(可能由 LowPower Cluster 的 Sleep 命令触发)
- 需要唤醒时,构造包含目标 MAC 的 Magic Packet
- 通过 UDP 广播(或定向广播)发送到目标网段
- 设备网卡硬件检测到匹配的 Magic Packet,触发中断唤醒系统
- 设备启动后重新加入 Matter Fabric,恢复正常通信
WoL 能否工作取决于硬件和固件支持:设备的网卡必须在休眠时仍然通电并监听网络帧, 且 BIOS/固件中需要启用 WoL 功能。不是所有设备都支持 —— 尤其是纯 WiFi 设备, WoL 在无线环境下的支持度和可靠性都不如有线以太网。
与 LowPower Cluster 的关系
在 Matter 媒体设备中,WakeOnLan 和 LowPower(0x0508)是一对互补的 Cluster:
| Cluster | 职责 | 方向 |
|---|---|---|
| LowPower(0x0508) | 让设备进入待机/休眠(Sleep 命令) | Controller → Device:「去睡觉」 |
| WakeOnLan(0x0503) | 提供唤醒设备所需的网络地址 | Controller 读取地址后自行发送 Magic Packet:「起来了」 |
典型的媒体设备(如电视、机顶盒)会同时实现这两个 Cluster。 用户说「关闭电视」时调用 LowPower 的 Sleep,说「打开电视」时用 WakeOnLan 的地址发送 Magic Packet。
示例数据
读取一台智能电视的 WakeOnLan Cluster 属性:
{
// --- 网络唤醒地址 ---
"0x0000": "AA:BB:CC:DD:EE:FF", // MACAddress = 设备有线网卡的 MAC 地址
"0x0001": "fe80::a8bb:ccff:fedd:eeff" // LinkLocalAddress = IPv6 链路本地地址
}
WakeOnLan 的属性值在设备整个生命周期内通常不变(MAC 地址和 Link-Local 地址都是固定的)。 建议在设备首次入网时读取一次并缓存到本地,不需要频繁轮询。 这样即使设备已经休眠、无法响应 Matter 请求,你仍然有地址可以发送 Magic Packet。
常见场景
场景 1:语音助手唤醒电视
用户对着智能音箱说「打开客厅电视」,电视当前处于待机状态,Matter 通信已断开。
- 智能音箱(Hub)从本地缓存中查找客厅电视的 WakeOnLan 信息(入网时已缓存)
- 取出
MACAddress = "AA:BB:CC:DD:EE:FF" - 构造 Magic Packet(6 字节 0xFF + MAC 重复 16 次 = 102 字节)
- 通过 UDP 端口 9 广播到本地网络
- 电视网卡检测到 Magic Packet,唤醒系统
- 电视启动后重新加入 Matter Fabric,Hub 检测到设备上线
- Hub 可选择性地发送 OnOff Cluster 的 On 命令确保电视完全开启
关键点:唤醒地址必须提前缓存。设备休眠后无法通过 Matter 读取属性, 如果没有缓存就只能等用户手动开机。
场景 2:自动化场景联动(回家模式)
用户设置了「回家模式」自动化:手机连上家庭 WiFi 时,自动唤醒电视并切换到常看的输入源。
- Hub 检测到用户手机连入家庭 WiFi(触发条件)
- 自动化引擎启动「回家模式」动作序列
- 第一步:用缓存的 MAC 地址发送 Magic Packet 唤醒电视
- 第二步:等待电视重新上线(轮询设备在线状态或监听 mDNS 广播)
- 第三步:通过 MediaInput Cluster(0x0507)切换到 HDMI 1(机顶盒)
- 同时:通过 LevelControl 调整客厅灯光亮度到 60%
注意:唤醒到设备完全上线需要时间(通常几秒到十几秒), 自动化引擎需要在发送 Magic Packet 后等待设备就绪,再执行后续的 Matter 命令。 直接连续发送会失败,因为设备的 Matter 栈还没启动。