通用诊断 Cluster(GeneralDiagnostics)
Cluster ID: 0x0033 |
所在 Endpoint: 固定在 Endpoint 0(根端点)
GeneralDiagnostics 提供设备的健康状态和运行诊断信息 —— 包括网络接口详情、重启次数、运行时长、启动原因, 以及硬件/射频/网络三类故障的实时追踪。所有 Matter 设备都必须实现这个 Cluster,是设备运维和问题排查的第一入口。
GeneralDiagnostics 只出现在 Endpoint 0(根端点),不会出现在功能端点上。
它反映的是整个设备的健康状态,不是某个功能模块的状态。
读取时请确保指定 endpointId = 0。
命令(Commands)
GeneralDiagnostics 只有两个命令。TestEventTrigger 用于测试认证,生产环境通常禁用;
TimeSnapshot 用于获取设备当前的时间快照。
点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | 方向 | 说明 |
|---|---|---|---|
0x00 |
TestEventTrigger | Client → Server | 触发设备内部的测试事件 |
0x01 |
TimeSnapshot | Client → Server | 获取设备当前时间快照 |
TestEventTrigger —— 测试事件触发(0x00)
触发设备预置的测试事件。这个命令主要用于 Matter 认证测试期间,允许测试工具在不拆机的情况下模拟特定的设备行为 (如模拟传感器告警、触发故障状态等)。
| 参数 | 类型 | 说明 |
|---|---|---|
| EnableKey | octstr (16 bytes) | 启用密钥 —— 必须与设备预设的密钥匹配,否则命令被拒绝。生产设备应将此密钥设为全零以禁用测试功能 |
| EventTrigger | uint64 | 触发器编号 —— 标识要触发的具体测试事件,由厂商或 Matter 测试规范定义 |
TestEventTriggersEnabled 属性为 true 时此命令才生效。
生产环境的设备必须禁用测试触发器(将 EnableKey 设为全零),否则存在安全风险 ——
攻击者可能利用此命令模拟故障或篡改设备行为。
使用场景
Matter 认证测试时,测试工具通过此命令让设备模拟特定状态(如烟感报警、网络断开等), 验证设备的事件上报和故障处理逻辑是否符合规范。App 开发中几乎不会用到此命令。
TimeSnapshot —— 时间快照(0x01)
请求设备返回当前的系统时间。不需要参数。
设备会返回一个 TimeSnapshotResponse,包含系统启动后的毫秒计时和 POSIX 时间戳(如果设备有可靠时钟)。
TimeSnapshotResponse 响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
| SystemTimeMs | uint64 | 设备启动后经过的毫秒数(单调递增,不受时钟校准影响) |
| PosixTimeMs | uint64 / null | POSIX 时间戳(毫秒精度)。如果设备没有可靠的 UTC 时钟,此字段为 null |
使用场景
排查设备时间同步问题时使用。例如设备的日志时间戳明显偏差,可以通过 TimeSnapshot 确认设备当前的内部时钟是否准确。
SystemTimeMs 是从启动开始的单调时钟,配合 UpTime 属性可以交叉验证。
属性详解
GeneralDiagnostics 的属性按功能分为四组。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。
| ID | 名称 | 类型 | 分组 | 说明 |
|---|---|---|---|---|
0x0000 |
NetworkInterfaces | list<NetworkInterface> | 网络接口 | 设备所有网络接口信息 |
0x0001 |
RebootCount | uint16 | 运行统计 | 累计重启次数 |
0x0002 |
UpTime | uint64 | 运行统计 | 设备已运行时间(秒) |
0x0003 |
TotalOperationalHours | uint32 | 运行统计 | 累计运行小时数 |
0x0004 |
BootReason | BootReasonEnum | 运行统计 | 最近一次启动的原因 |
0x0005 |
ActiveHardwareFaults | list<HardwareFaultEnum> | 故障追踪 | 当前活跃的硬件故障列表 |
0x0006 |
ActiveRadioFaults | list<RadioFaultEnum> | 故障追踪 | 当前活跃的射频故障列表 |
0x0007 |
ActiveNetworkFaults | list<NetworkFaultEnum> | 故障追踪 | 当前活跃的网络故障列表 |
0x0008 |
TestEventTriggersEnabled | bool | 测试配置 | 测试事件触发器是否启用 |
网络接口(0x0000)
设备当前可用的所有网络接口的详细信息列表。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
NetworkInterfaces 网络接口列表 |
list<NetworkInterface> | 设备当前所有网络接口的信息列表。每个元素是一个 NetworkInterface 结构体,包含接口名称、状态、IP 地址等详情。最多 8 个接口 |
NetworkInterfaces 是了解设备网络连接状况的最直接途径。
如果设备同时有 WiFi 和 Thread 接口,列表中会包含多个条目。
通过检查 IsOperational 可以判断哪个接口当前是活跃的。
运行统计(0x0001-0x0004)
设备的运行时间统计和启动原因,是判断设备稳定性的关键指标。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0001 |
RebootCount 重启次数 |
uint16 | 设备自出厂以来的累计重启次数。频繁重启通常意味着设备存在稳定性问题(电源不稳、固件崩溃等) |
0x0002 |
UpTime 运行时间 |
uint64 | 设备自最近一次启动以来已运行的时间,单位秒。可用来判断设备是否刚刚重启过 |
0x0003 |
TotalOperationalHours 累计运行小时数 |
uint32 | 设备自出厂以来的累计运行小时数(取整)。这个值跨重启持久化保存,用于评估设备使用寿命 |
0x0004 |
BootReason 启动原因 |
BootReasonEnum | 设备最近一次启动的原因(见下方枚举)。排查异常重启时首先检查此字段 |
UpTime 的单位是秒,而 TotalOperationalHours 的单位是小时。
例如 UpTime = 86400 表示已运行 24 小时,而 TotalOperationalHours = 720 表示累计运行了 30 天。
故障追踪(0x0005-0x0007)
三个列表属性分别追踪硬件、射频和网络层面的当前活跃故障。 正常运行的设备这三个列表都应该为空。一旦出现非空值,说明设备检测到了对应类型的故障。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0005 |
ActiveHardwareFaults 活跃硬件故障 |
list<HardwareFaultEnum> | 当前存在的硬件故障列表。空列表 = 无故障。可能同时包含多个不同类型的故障 |
0x0006 |
ActiveRadioFaults 活跃射频故障 |
list<RadioFaultEnum> | 当前存在的射频(无线通信)故障列表。WiFi/BLE/Thread 模块异常时会出现 |
0x0007 |
ActiveNetworkFaults 活跃网络故障 |
list<NetworkFaultEnum> | 当前存在的网络层故障列表。如连接失败、网络干扰等 |
这三个列表记录的是当前存在的故障。当故障状态发生变化时(新增或恢复),设备会同时发出对应的变更事件 (HardwareFaultChange、RadioFaultChange、NetworkFaultChange), 事件中包含变化前后的完整列表,方便追踪故障的出现和恢复过程。
测试配置(0x0008)
与认证测试相关的配置属性。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0008 |
TestEventTriggersEnabled 测试触发器启用 |
bool | 标识设备是否启用了 TestEventTrigger 命令。生产设备必须设为 false。如果在已上市的产品上读到 true,说明厂商的安全配置有缺陷 |
枚举速查
GeneralDiagnostics 涉及多个枚举类型,下面逐一列出所有枚举值。
BootReasonEnum —— 启动原因
描述设备最近一次启动的原因,对应 BootReason (0x0004) 属性和 BootReason 事件。
HardwareFaultEnum —— 硬件故障
描述设备可能遇到的硬件层故障,对应 ActiveHardwareFaults (0x0005) 属性。
RadioFaultEnum —— 射频故障
描述设备无线通信模块的故障类型,对应 ActiveRadioFaults (0x0006) 属性。
NetworkFaultEnum —— 网络故障
描述设备网络层面的故障类型,对应 ActiveNetworkFaults (0x0007) 属性。
InterfaceTypeEnum —— 网络接口类型
描述网络接口的物理类型,对应 NetworkInterface 结构体中的 Type 字段。
数据结构
NetworkInterface 结构体
描述一个网络接口的完整信息,是 NetworkInterfaces (0x0000) 属性中每个列表元素的结构。
| 字段 | 类型 | 说明 |
|---|---|---|
| Name | string (max 32) | 接口名称,如 "wlan0"、"eth0"、"Thread" |
| IsOperational | bool | 接口是否正在运行并可用于通信 |
| OffPremiseServicesReachableIPv4 | bool / null | 通过此接口的 IPv4 是否可达外部(互联网)服务。null = 未知 |
| OffPremiseServicesReachableIPv6 | bool / null | 通过此接口的 IPv6 是否可达外部服务。null = 未知 |
| HardwareAddress | octstr (6 or 8 bytes) | 接口的硬件地址(MAC 地址)。WiFi/Ethernet 为 6 字节,IEEE 802.15.4(Thread)为 8 字节 |
| IPv4Addresses | list<octstr> | 分配给此接口的所有 IPv4 地址列表 |
| IPv6Addresses | list<octstr> | 分配给此接口的所有 IPv6 地址列表(通常包含链路本地地址和全局地址) |
| Type | InterfaceTypeEnum | 接口的物理类型 |
NetworkInterface 数据示例:
{
"Name": "wlan0", // 接口名称
"IsOperational": true, // 接口正在运行
"OffPremiseServicesReachableIPv4": true, // IPv4 可达外部服务
"OffPremiseServicesReachableIPv6": null, // IPv6 可达性未知
"HardwareAddress": "AA:BB:CC:DD:EE:FF", // MAC 地址
"IPv4Addresses": ["192.168.1.100"], // IPv4 地址列表
"IPv6Addresses": ["fe80::1", "2001:db8::1"], // IPv6 地址列表
"Type": 1 // WiFi 接口
}
事件(Events)
GeneralDiagnostics 定义了 4 个事件,均为 Critical 优先级。 前三个分别对应硬件/射频/网络故障状态的变更通知,第四个是设备启动原因通知。 订阅这些事件可以实时感知设备健康状态的变化。
| ID | 名称 | 优先级 | 说明 |
|---|---|---|---|
0x00 |
HardwareFaultChange | Critical | 硬件故障列表发生变化 |
0x01 |
RadioFaultChange | Critical | 射频故障列表发生变化 |
0x02 |
NetworkFaultChange | Critical | 网络故障列表发生变化 |
0x03 |
BootReason | Critical | 设备启动时上报启动原因 |
HardwareFaultChange —— 硬件故障变更(0x00)
当设备的硬件故障状态发生变化时触发 —— 无论是新增故障还是故障恢复。 事件数据中同时包含变化前后的完整故障列表,方便对比分析。
| 字段 | 类型 | 说明 |
|---|---|---|
| Current | list<HardwareFaultEnum> | 变化后的当前硬件故障列表(与 ActiveHardwareFaults 属性一致) |
| Previous | list<HardwareFaultEnum> | 变化前的硬件故障列表 |
解读示例
假设收到事件 Previous = [3],Current = [3, 9]。
说明之前已有「可恢复过温(3)」故障,现在又新增了「非易失存储错误(9)」。
如果后续收到 Previous = [3, 9],Current = [9],说明过温故障已恢复,但存储错误仍在。
RadioFaultChange —— 射频故障变更(0x01)
当设备的射频故障状态发生变化时触发。结构与 HardwareFaultChange 相同。
| 字段 | 类型 | 说明 |
|---|---|---|
| Current | list<RadioFaultEnum> | 变化后的当前射频故障列表 |
| Previous | list<RadioFaultEnum> | 变化前的射频故障列表 |
NetworkFaultChange —— 网络故障变更(0x02)
当设备的网络故障状态发生变化时触发。结构与 HardwareFaultChange 相同。
| 字段 | 类型 | 说明 |
|---|---|---|
| Current | list<NetworkFaultEnum> | 变化后的当前网络故障列表 |
| Previous | list<NetworkFaultEnum> | 变化前的网络故障列表 |
BootReason —— 启动原因事件(0x03)
设备每次启动时都会发出此事件,上报启动的原因。
这是排查设备异常重启的第一手线索 —— 配合 RebootCount 属性使用效果更佳。
| 字段 | 类型 | 说明 |
|---|---|---|
| BootReason | BootReasonEnum | 本次启动的原因 |
解读示例
收到 BootReason = 3(SoftwareWatchdogReset),说明设备因固件异常被看门狗强制重启。
如果短时间内多次收到同一原因的 BootReason 事件,强烈建议联系厂商排查固件问题。
示例数据
一个正常运行中的 WiFi 智能设备的 GeneralDiagnostics Cluster 读取结果:
{
// --- 网络接口 ---
"0x0000": [ // NetworkInterfaces
{
"Name": "wlan0",
"IsOperational": true,
"OffPremiseServicesReachableIPv4": true,
"OffPremiseServicesReachableIPv6": null,
"HardwareAddress": "AA:BB:CC:DD:EE:FF",
"IPv4Addresses": ["192.168.1.100"],
"IPv6Addresses": ["fe80::1"],
"Type": 1 // WiFi
}
],
// --- 运行统计 ---
"0x0001": 12, // RebootCount = 12(累计重启 12 次)
"0x0002": 86400, // UpTime = 86400 秒(已运行 24 小时)
"0x0003": 720, // TotalOperationalHours = 720(累计运行 30 天)
"0x0004": 1, // BootReason = PowerOnReboot(正常上电启动)
// --- 故障状态 ---
"0x0005": [], // ActiveHardwareFaults = [](无硬件故障)
"0x0006": [], // ActiveRadioFaults = [](无射频故障)
"0x0007": [], // ActiveNetworkFaults = [](无网络故障)
// --- 测试配置 ---
"0x0008": false // TestEventTriggersEnabled = false(测试触发器未启用)
}
正常设备的三个故障列表(0x0005 ~ 0x0007)都应该为空数组。如果读到非空值,说明设备当前存在异常。
配合 BootReason (0x0004) 和 RebootCount (0x0001) 可以初步判断设备的稳定性 ——
频繁重启 + 看门狗原因 + 硬件故障列表非空,基本可以断定设备硬件有问题。
常见场景
场景 1:设备健康状态总览
- 读取
UpTime (0x0002)确认设备运行时间,判断是否刚刚重启过 - 读取
BootReason (0x0004),如果不是 PowerOnReboot(1) 或 SoftwareReset(6),可能存在异常 - 读取
ActiveHardwareFaults (0x0005)、ActiveRadioFaults (0x0006)、ActiveNetworkFaults (0x0007),确认无活跃故障 - 读取
RebootCount (0x0001),如果值异常高,配合TotalOperationalHours (0x0003)计算平均重启频率
场景 2:排查设备离线问题
- 设备重新上线后,读取
BootReason (0x0004)—— 看是重启了还是只是网络断开 - 读取
NetworkInterfaces (0x0000),检查IsOperational和OffPremiseServicesReachableIPv4状态 - 检查
ActiveNetworkFaults (0x0007),看是否有 ConnectionFailed(3) 或 NetworkJammed(2) - 订阅
NetworkFaultChange事件,监控后续是否再次出现网络异常
场景 3:固件更新后验证
- OTA 升级完成后,设备应自动重启
- 读取
BootReason (0x0004),期望值为SoftwareUpdateCompleted (5) - 如果是
SoftwareWatchdogReset (3)或HardwareWatchdogReset (4),说明新固件可能有问题 - 持续监控
ActiveHardwareFaults和RebootCount,确保新版本运行稳定
场景 4:生产安全检查
- 读取
TestEventTriggersEnabled (0x0008),必须为false - 如果为
true,设备未关闭测试模式,存在安全风险 —— 攻击者可通过 TestEventTrigger 命令操纵设备行为 - 这个检查通常在产品出厂前和安全审计时执行