ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Matter 布尔状态配置集群(Boolean State Configuration Server)在 connectedhomeip 中的实现与接入指南

Matter 布尔状态配置集群(Boolean State Configuration Server)在 connectedhomeip 中的实现与接入指南 Matter 布尔状态配置集群Boolean State Configuration Server在 connectedhomeip 中的实现与接入指南【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本篇技术指南围绕 connectedhomeip 仓库中 Boolean State Configuration Server 集群 展开讲解该集群在 Matter 应用中的定位、Delegate 应用集成方式、codegen 兼容层、服务端 API、属性持久化迁移以及测试事件触发机制。读者读完可获得在自有 Matter 设备如具备视觉/听觉报警能力的布尔传感器上接入并正确驱动该集群的完整实战方案。集群概述配置布尔传感器的标准通道Boolean State Configuration布尔状态配置集群在 Matter 规范中对应Matter Application Clusters 规范第 1.8 节其用途是配置一个布尔传感器包括可选的状态变化报警alarm特性以及与传感器相关的灵敏度级别sensitivity level配置。从 BooleanStateConfigurationCluster.h 可以看到该集群内部维护的状态量状态量类型含义mCurrentSensitivityLeveluint8_t当前灵敏度级别可写属性mSupportedSensitivityLevelsuint8_tconst支持的灵敏度级别总数范围约束在kMinSupportedSensitivityLevels 2与kMaxSupportedSensitivityLevels 10之间mDefaultSensitivityLeveluint8_tconst默认灵敏度级别构造函数中会被钳制为不超过supportedSensitivityLevels - 1mAlarmsActiveBitMaskAlarmModeBitmap当前激活的报警位mAlarmsSuppressedBitMaskAlarmModeBitmap当前被抑制的报警位mAlarmsEnabledBitMaskAlarmModeBitmap当前启用的报警位可通过命令配置mAlarmsSupportedBitMaskAlarmModeBitmapconst设备支持的报警模式位图mSensorFaultBitMaskSensorFaultBitmap当前传感器故障位其中AlarmModeBitmap目前包含kAudible听觉与kVisual视觉两种报警模式源码中以kAllKnownAlarmModes 0x03表示当前已知的完整报警位图见 BooleanStateConfigurationCluster.cpp。特性开关与属性可选性规则该集群是一个特性Feature驱动的 code-driven 集群。构造函数的实现BooleanStateConfigurationCluster.cpp清晰展示了每个特性对可选属性集合的影响kSensitivityLevel灵敏度特性强制启用CurrentSensitivityLevel与SupportedSensitivityLevels属性若同时在 codegen 配置中标记DefaultSensitivityLevel为可选则一并启用。kVisual/kAudible视觉/听觉报警特性任一启用时强制启用AlarmsActive与AlarmsSupported若 codegen 标记AlarmsEnabled可选则启用。kAlarmSuppress报警抑制特性启用AlarmsSuppressed属性。该特性必须与视觉/听觉报警特性同时存在否则Startup()会返回CHIP_ERROR_INCORRECT_STATE内部状态校验。SensorFault完全可选仅当 codegen 标记其为可选时启用。注意kFaultEvents特性在构造函数中被无条件强制置位mFeatures.Set(Feature::kFaultEvents)即故障事件是基础能力。AcceptedCommands()也随特性变化启用kAudible/kVisual时暴露EnableDisableAlarm命令启用kAlarmSuppress时额外暴露SuppressAlarm命令。应用集成通过 Delegate 与集群交互应用层通过BooleanStateConfiguration::Delegate实例与集群交互。接口定义位于 boolean-state-configuration-delegate.h职责有两类命令处理钩子纯虚函数必须实现HandleSuppressAlarm(AlarmModeBitmap alarmToSuppress)处理报警抑制命令HandleEnableDisableAlarms(BitMaskAlarmModeBitmap alarms)处理启用/停用报警命令。类型安全的按属性变更回调带默认实现返回true按需覆写OnCurrentSensitivityLevelChanged(uint8_t)CurrentSensitivityLevel变化时触发OnAlarmsActiveChanged(BitMaskAlarmModeBitmap)AlarmsActive变化时触发OnAlarmsSuppressedChanged(BitMaskAlarmModeBitmap)AlarmsSuppressed变化时触发OnAlarmsEnabledChanged(BitMaskAlarmModeBitmap)AlarmsEnabled变化时触发OnSensorFaultChanged(BitMaskSensorFaultBitmap)SensorFault变化时触发。回调触发的完整路径这些回调无论属性经由何种途径改变都会被调用属性写入WriteAttribute、命令调用InvokeCommand或服务端 API如SetAlarmsActive()、GenerateSensorFault()。以 BooleanStateConfigurationCluster.cpp 中SetAlarmsActive()为例调用链为校验mFeatures是否具备视觉/听觉特性校验待激活报警必须包含于mAlarmsEnabled且状态无变化时直接视为 NOOP返回Status::Success调用mDelegate-OnAlarmsActiveChanged(alarms)若返回false则整体返回Status::Failure状态不落盘更新mAlarmsActive、NotifyAttributeChanged(AlarmsActive::Id)调用GenerateAlarmsStateChangedEvent()生成AlarmsStateChanged事件。EnableDisableAlarm命令处理BooleanStateConfigurationCluster.cpp则展示了更完整的命令语义先校验请求的报警位必须全部在mAlarmsSupported内否则返回ConstraintError随后更新AlarmsEnabled并持久化、触发OnAlarmsEnabledChanged再对请求中未启用的“已知位”取反得到alarmsToDisable逐一清理mAlarmsActive/mAlarmsSuppressed并触发对应回调最后在状态确有变化时生成AlarmsStateChanged事件。Codegen 兼容层CodegenIntegration集群以 code-driven 方式实现为兼容代码生成与 ember 框架目录下提供了 CodegenIntegration.h 与 CodegenIntegration.cpp负责按 codegen 配置预分配并初始化集群实例。使用注意点调用时机CodegenIntegration.h保留了原有 API但所有 API 调用**必须在服务端初始化之后即集群创建完成之后**才能调用否则FindClusterOnEndpoint()找不到集群实例。首选方式头文件顶部明确标注以下方法均为DEPRECATED已废弃建议 codegen 构建下直接通过FindClusterOnEndpoint(endpointId)获取BooleanStateConfigurationCluster *再调用集群方法。废弃 API 仅保留用于向后兼容。废弃但可用的便捷 API 一览API作用SetDefaultDelegate(ep, delegate)/GetDefaultDelegate(ep)设置/获取端点上集群的 DelegateSetAlarmsActive(ep, alarms)激活指定报警SetAllEnabledAlarmsActive(ep)激活全部已启用报警ClearAllAlarms(ep)清空激活与抑制的报警位SuppressAlarms(ep, alarms)抑制指定报警SetCurrentSensitivityLevel(ep, level)设置当前灵敏度级别EmitSensorFault(ep, fault)触发传感器故障事件HasFeature(ep, feature)查询端点上集群是否具备某特性实现上这些 inline 函数先通过FindClusterOnEndpoint(ep)查找集群nullptr时返回CHIP_ERROR_NO_ENDPOINT成功后将集群方法返回的 IM 状态码转换为CHIP_ERROR或直接透传。初始化回调用例CodegenIntegration.cpp 中MatterBooleanStateConfigurationClusterInitCallback()通过CodegenClusterIntegration::RegisterServer注册集群集群实例池采用LazyRegisteredServerCluster容量为“固定集群数 CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT”IntegrationDelegate::CreateRegistration()从SupportedSensitivityLevels、DefaultSensitivityLevel、AlarmsSupported的默认值带 fallback构造StartupConfiguration并创建集群实例同时注册ShutdownCallback用于注销集群。关于PostAttributeChangeCallbackREADME 明确建议——当属性变化时需要额外逻辑时优先使用 Delegate 提供的类型安全回调如OnCurrentSensitivityLevelChanged而不是在 ember 的PostAttributeChangeCallback中自行实现。Delegate 回调覆盖了属性写入、命令处理与服务端 API 全部三条变更路径避免重复实现与遗漏。服务端 API 与状态约束语义除命令与属性读写外集群还暴露了供应用直接调用的服务端 API定义见 BooleanStateConfigurationCluster.hAPI返回语义与约束SetAlarmsActive(AlarmModeBitMask)IMStatus要求具备视觉/听觉特性且报警位必须已启用无变化时 NOOPSetAllEnabledAlarmsActive()IMStatus将mAlarmsEnabled整体置为激活SuppressAlarms(AlarmModeBitMask)IMStatus需要kAlarmSuppress特性输入报警必须受支持且当前激活否则分别返回ConstraintError/InvalidInState已抑制则为 NOOPClearAllAlarms()void清理激活与抑制位有清除时生成AlarmsStateChanged事件SetCurrentSensitivityLevel(uint8_t)CHIP_ERROR级别必须 supportedSensitivityLevels否则ConstraintError相同级别为 NOOP成功后持久化GenerateSensorFault(SensorFaultBitMask)void无条件生成SensorFault事件若SensorFault属性可选且值变化则同步更新属性并触发OnSensorFaultChangedGetCurrentSensitivityLevel()等 Getter各自类型读取内部维护状态SetCurrentSensitivityLevel()还体现出持久化策略任何灵敏度级别的变更都会通过AttributePersistence以 native endian 写入属性存储BooleanStateConfigurationCluster.cpp。属性持久化与存储迁移集群在Startup()阶段BooleanStateConfigurationCluster.cpp从属性持久化提供者加载CurrentSensitivityLevel加载失败时回退到默认灵敏度并对越界值做钳制与AlarmsEnabled。EnableDisableAlarm命令也会将新的AlarmsEnabled落盘。仓库还提供了从旧式SafeAttributePersistenceProvider到新属性存储的迁移路径MigrateBooleanStateConfigurationStorage()MigrateBooleanStateConfigurationStorage.cpp将CurrentSensitivityLevel这一标量属性迁移到目标存储。该迁移由 CodegenIntegration 中的CodegenBooleanStateConfigurationCluster::Startup()自动触发确保持久化提供者在迁移执行前已就绪见 CodegenIntegration.cpp。测试支持单元测试与测试事件触发单元测试集群测试位于 tests/TestBooleanStateConfigurationCluster.cpp覆盖属性列表随特性组合的变化如无特性时属性列表为空启用kSensitivityLevelkAudible后出现灵敏度与报警相关属性灵敏度级别的取值范围约束测试断言 supported levels 与kMinSupportedSensitivityLevels的钳制关系报警激活流程与OnAlarmsActiveChanged回调通过SetAlarmsActive触发并断言返回Status::Success。测试通过StartupConfigurationBuilder灵活构造StartupConfigurationsupported/default 灵敏度、alarmsSupported 位图可作为应用层实现参考。测试事件触发为便于自动化测试如 YAML 集成测试提供了 BooleanStateConfigurationTestEventTriggerHandler.h 定义两个事件触发值触发值含义0x0080000000000000kSensorTrigger触发传感器报警0x0080000000000001kSensorUntrigger解除传感器报警HandleEventTrigger()在清除端点号前缀后委托给HandleBooleanStateConfigurationTestEventTrigger()该函数需要由应用层实现头文件注释明确说明启用 TestEventTrigger 时应用必须实现该函数未命中任何已知触发值时返回CHIP_ERROR_INVALID_ARGUMENT。构建集成集群的 GN 构建目标为source_set(boolean-state-configuration-server)见 BUILD.gn依赖attribute-persistence、persistence:migration、server-cluster与zzz_generated/app-common/clusters/BooleanStateConfiguration生成代码同时提供app_config_dependent_sources.cmake与.gni供 CMake/ZAP 构建体系引用测试目标则由tests/BUILD.gn组织。接入清单Best Practices在应用的 ZAP/codegen 配置中按需求勾选kSensitivityLevel、kVisual、kAudible、kAlarmSuppress特性与SensorFault可选属性实现BooleanStateConfiguration::Delegate必实现两个Handle*命令钩子按需覆写 5 个On*Changed回调在服务端初始化完成集群创建后再通过FindClusterOnEndpoint()或兼容场景下SetDefaultDelegate()挂载 Delegate应用逻辑对属性的更新统一走服务端 APISetAlarmsActive/SuppressAlarms/SetCurrentSensitivityLevel等属性变更通知通过 Delegate 回调接收不要在 emberPostAttributeChangeCallback中重复实现业务逻辑如需 TestEventTrigger在应用中实现HandleBooleanStateConfigurationTestEventTrigger()并注册对应 Handler即可复用kSensorTrigger/kSensorUntrigger驱动自动化测试。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表