Matter 冰箱与温控柜示例完全指南:Silicon Labs EFR32 / SiWx917 平台的定制、构建与调试实战

发布时间:2026/9/18 23:38:13
Matter 冰箱与温控柜示例完全指南:Silicon Labs EFR32 / SiWx917 平台的定制、构建与调试实战 Matter 冰箱与温控柜示例完全指南Silicon Labs EFR32 / SiWx917 平台的定制、构建与调试实战【免费下载链接】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本指南以 Matter 仓库中的refrigerator-appSilabs 示例为核心系统讲解 Temperature Controlled Cabinet温控柜参考设备的整体架构、基于 CRTP 模式的应用定制方法、EFR32 MG24 与 SiWx917 平台的构建烧录流程、日志调试手段以及如何通过 chip-tool 与 Matter Shell 完成配网、控制与事件订阅。读完本文你将掌握 Silabs 平台 Matter 示例从“开箱编译”到“深度定制产品代码”的完整链路。示例简介一款可实际配网的温控柜参考设备examples/refrigerator-app/silabs示例基于 Matter 与 Silicon Labs Simplicity SDK提供了一个Temperature Controlled Cabinet温控柜设备的基线演示。它面向两类 Silabs 硬件EFR32 MG24802.15.4 Thread SoCSiWx917 Wi-Fi SoC设备可以通过 chip controller控制器经OpenThread 或 Wi-Fi 网络进行控制。配网流程符合 Matter 标准 Rendez-vous 机制设备通过BLEBluetooth Low Energy广播配网信息控制器扫码或输入配对码后建立安全会话对于 Thread 版本设备拿到 Thread 网络凭据后加入 Thread 网络。如果 LCD 使能Silabs WSTK 开发板上的 LCD 会显示包含 BLE 配网信息的QR Code配网完成后屏幕切换为冰箱温控状态的图形化表示。该示例的定位不仅是演示 Matter 工作方式更是基于 Silabs 平台打造真实产品时的模板工程。从源码结构可以印证这一设计意图示例根目录下同时提供 Thread 与 Wi-Fi 两套数据模型文件data_model/refrigerator-thread-app.matter、data_model/refrigerator-wifi-app.matterBUILD.gn中通过wifi_soc开关区分两条 SDK 集成路径设备本身在 include/CHIPProjectConfig.h 中登记为测试厂商 ID0xFFF1、产品 ID0x800E并启用 CHIPoBLECHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1。扩展基础应用实现CustomerAppTask 定制机制这是该示例最重要的工程特性所有 Silabs 实现的 API 都可以在CustomerAppTask文件中覆写从而把“通用 SDK 示例”改造成“自己的产品代码”。CustomerAppTask 的角色与文件布局示例为定制提供了两对文件通用定制入口examples/platform/silabs/customer/CustomerAppTask.h 与 examples/platform/silabs/customer/CustomerAppTask.cpp位于examples/platform/silabs/customer/目录本示例的基类实现与全部可覆写的*Impl()API位于 include/AppTaskImpl.h 与 src/AppTask.cpp。默认情况下示例直接编译examples/platform/silabs/customer/下的通用 CustomerAppTask见 BUILD.gn 中的${examples_common_plat_dir}/customer/CustomerAppTask.cpp。任何未被覆写的*Impl()都保持 Silabs 默认行为。要定制行为只需将 CustomerAppTask.h 与 CustomerAppTask.cpp 从examples/platform/silabs/customer/复制到本应用的include/与src/目录更新BUILD.gn中对应的源文件路径。如何覆写 APICRTP 模式详解CustomerAppTask通过Curiously Recurring Template Pattern奇异递归模板模式CRTP继承自基类 AppTask。你只需覆写需要的*Impl()方法基类为每个可覆写 API 声明一个对应的*Impl()。以 include/AppTaskImpl.h 为例基类模板的关键机制清晰可见template typename Derived class AppTaskImpl : public AppTask { public: // Common AppTask bring up CHIP_ERROR AppInit() override { CRTP_OPTIONAL_DISPATCH(AppTaskImpl, Derived, AppInitImpl); } // Handle button press static void ButtonEventHandler(uint8_t button, uint8_t btnAction) { CRTP_OPTIONAL_STATIC_DISPATCH(AppTaskImpl, Derived, ButtonEventHandlerImpl, button, btnAction); } // Data model hook invoked when a cluster attribute changes void DMPostAttributeChangeCallback(...) { CRTP_OPTIONAL_VOID_DISPATCH(...); } private: // Default *Impl() hooks, each forwards to the matching AppTask method CHIP_ERROR AppInitImpl() { return AppTask::AppInit(); } ... };每个公开方法通过CRTP_OPTIONAL_DISPATCH系列宏派发到Derived::*Impl()如果派生类定义了同名*Impl()就调用派生实现否则回落到私有默认实现转发给 AppTask。覆写步骤为在 Override API Reference 中找到要覆写的基类方法在CustomerAppTask.h的private:区声明同名方法签名必须与基类*Impl()完全一致——注意即使公开派发器如ButtonEventHandler是static*Impl()覆写也是非静态实例方法在CustomerAppTask.cpp中实现重新构建。CRTP 层会自动把每次调用路由到你的*Impl()如果存在否则走 Silabs 默认实现。DataModelCallbacks 与 CustomerAppTask 的演进原先位于DataModelCallbacks.cpp的逻辑已并入AppTask.cpp。Matter SDK 的MatterPostAttributeChangeCallback在examples/platform/silabs/BaseApplication.cpp中实现并转发到AppTask::DMPostAttributeChangeCallback定义于src/AppTask.cpp你可以在 CustomerAppTask 中通过DMPostAttributeChangeCallbackImpl()定制。转发进入 AppTask 依然走 CRTP。定制时遵循两条原则AppTask 中已存在的方法——通过在 CustomerAppTask 中覆写对应的*Impl()来定制不要为应用特有行为直接修改AppTask.cpp全新的自定义数据模型方法——直接在 CustomerAppTask 中新增。切勿在自动生成的源码中加入应用逻辑因为重新生成或项目升级时这些改动不会保留。从 src/AppTask.cpp 可以看到默认实现的处理逻辑它按 cluster 分发DMPostAttributeChangeCallback对RefrigeratorAlarm集群维护mMask/mStateAlarmBitmap 类型对TemperatureControl集群把TemperatureSetpoint经ConvertToPrintableTemp()四舍五入到整数摄氏度后保存为mTemperatureSetpoint供 LCD 显示等使用。示例实现一个最小 CustomerAppTask以下为 README 提供的完整示例——覆写AppInitImpl()与ButtonEventHandlerImpl()两个方法CustomerAppTask.h#pragma once #include AppTaskImpl.h /** Minimal AppTaskImpl-derived class. Override only the *Impl() methods you need **/ class CustomerAppTask : public AppTaskImplCustomerAppTask { public: static CustomerAppTask GetAppTask() { return sAppTask; } private: friend class AppTaskImplCustomerAppTask; CHIP_ERROR AppInitImpl(); void ButtonEventHandlerImpl(uint8_t button, uint8_t btnAction); static CustomerAppTask sAppTask; };CustomerAppTask.cpp#include CustomerAppTask.h #include AppTask.h #include AppEvent.h #include platform/CHIPDeviceLayer.h #include platform/silabs/platformAbstraction/SilabsPlatform.h #define APP_FUNCTION_BUTTON 0 CustomerAppTask CustomerAppTask::sAppTask; AppTask AppTask::GetAppTask() { return CustomerAppTask::GetAppTask(); } CHIP_ERROR CustomerAppTask::AppInitImpl() { SILABS_LOG(CustomerAppTask: custom implementation (AppInitImpl)); CHIP_ERROR err AppTask::AppInit(); if (err CHIP_NO_ERROR) { // Override the SDK default button handler registered in AppTask::AppInit(). chip::DeviceLayer::Silabs::GetPlatform().SetButtonsCb(CustomerAppTask::ButtonEventHandler); } return err; } void CustomerAppTask::ButtonEventHandlerImpl(uint8_t button, uint8_t btnAction) { SILABS_LOG(CustomerAppTask: custom implementation (ButtonEventHandlerImpl)); AppEvent aEvent {}; aEvent.Type AppEvent::kEventType_Button; aEvent.ButtonEvent.Action btnAction; if (button APP_FUNCTION_BUTTON) { aEvent.Handler BaseApplication::ButtonHandler; AppTask::GetAppTask().PostEvent(aEvent); } }注意两点实现细节AppInitImpl()调用基类AppTask::AppInit()完成 SDK 默认初始化如注册按钮回调、初始化冰箱端点树、注册 Shell 事件随后用SetButtonsCb()替换默认按钮处理ButtonEventHandlerImpl()构造AppEvent并投递到事件队列由AppTaskMain循环取出分发。Override API ReferenceCHIP_ERROR StartAppTask()只声明在AppTask上它不是*Impl()钩子平台代码例如MatterConfig以静态类型AppTask 调用AppTask::GetAppTask().StartAppTask()运行的是AppTask.cpp中的实现通过BaseApplication::StartAppTask(...)创建 FreeRTOS 应用任务。要改变启动行为应在产品源码中修改AppTask::StartAppTask()或BaseApplication::StartAppTask。本示例的基类 API 与默认 AppTask 行为维护在以下位置它们是可覆写方法与应用配置的权威参考文件用途include/AppTaskImpl.h声明全部可覆写的*Impl()方法。把需要的签名复制到CustomerAppTask.hsrc/AppTask.cppSilabs 对 AppTask 的默认实现。任何未覆写的*Impl()都运行这里的代码可作为定制行为的参考从 include/AppTaskImpl.h 可以看到完整的可覆写集合AppInitImpl、InitRefrigeratorImpl、ButtonEventHandlerImpl、DMPostAttributeChangeCallbackImpl、CabinetModeClusterInitImpl、CabinetModeClusterShutdownImpl以及 ModeBase::Delegate 系列CabinetModeInitImpl、HandleChangeToModeImpl、GetModeLabelByIndexImpl、GetModeValueByIndexImpl、GetModeTagsByIndexImpl。温控柜模式Cabinet Mode与端点组合的源码透视默认端点定义在 include/RefrigeratorConfig.h可修改宏调整REFRIGERATOR_ENDPOINT 1—— 冰箱根端点树的根节点COLD_CABINET_ENDPOINT 2—— 冷藏柜端点FREEZE_CABINET_ENDPOINT 3—— 冷冻柜端点。AppTask::InitRefrigerator()中通过SetTreeCompositionForEndpoint/SetParentEndpointForEndpoint建立端点树冷/冻柜父级为冰箱端点并通过SetTagList为冷柜打上语义标签命名空间0x41、tag0x00Refrigerator、为冷冻柜打上命名空间0x41、tag0x01Freezer。CabinetModeClusterInit()在冰箱端点上创建ModeBase::Instance注册三种模式见 include/AppTask.h 中的常量ModeNormal(0)、ModeRapidCool(1)、ModeRapidFreeze(2)并带Auto/RapidCool/RapidFreeze模式标签。HandleChangeToMode()还实现了业务约束不允许 Normal(0) 与 Rapid Freeze(2) 之间直接切换否则返回kGenericFailure。温度档位选项Hot / Warm / Freezing则由 refrigerator-common/src/static-supported-temperature-levels.cpp 中按端点2、3配置。构建示例环境准备下载Simplicity Commander命令行工具并确保commander在 shell 搜索路径中macOS 下位于Commander.app/Contents/MacOS/下载并安装合适的ARM gcc 工具链多数主机通过 bootstrap 已自动安装GNU Arm Embedded Toolchain 12.2 Rel1安装附加工具CHIP 开发者通常已具备# Linux $ sudo apt-get install git ninja-build # Mac OS X $ brew install ninja支持的硬件Silabs 开发板板卡套件频段 / 功率BRD2703ASLWSTK6000B / Wireless Starter Kit2.4GHz 10dBmBRD4186CSLWSTK6006A / Wireless Starter Kit2.4GHz 10dBmBRD4187CSLWSTK6006A / Wireless Starter Kit2.4GHz 20dBmBRD4338ASLWSTK6006A / Wireless Starter Kit2.4GHz 20dBmBRD4346ASLWSTK6006A / Wireless Starter Kit2.4GHz 20dBm最新的硬件支持清单以 Silicon Labs Matter 文档的 Hardware Requirements 页面为准。SiWx917 Wi-Fi 项目还需设置地区码region code在src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp中配置可用地区码定义于 Silicon Labs wiseconnect SDK 的sl_si91x_types.h。标准构建脚本方式在仓库根目录执行cd ~/connectedhomeip ./scripts/examples/gn_silabs_example.sh ./examples/refrigerator-app/silabs/ ./out/refrigerator-app BRD4187C清除生成物$ cd ~/connectedhomeip $ rm -rf ./out/标准构建GN/Ninja 直连方式$ cd ~/connectedhomeip/examples/refrigerator-app/silabs $ git submodule update --init $ source third_party/connectedhomeip/scripts/activate.sh $ export SILABS_BOARDBRD4187C $ gn gen out/debug $ ninja -C out/debug清理$ cd ~/connectedhomeip/examples/refrigerator-app/silabs $ rm -rf out/构建为间歇性连接设备ICD$ ./scripts/examples/gn_silabs_example.sh ./examples/refrigerator-app/silabs/ ./out/refrigerator-app_ICD BRD4187C --icd或使用 GN 直连并附加参数$ gn gen out/debug --argsSILABS_BOARDBRD4187C enable_sleepy_devicetrue chip_openthread_ftdfalse构建带 Pigweed RPC 的版本$ ./scripts/examples/gn_silabs_example.sh examples/refrigerator-app/silabs/ out/refrigerator_app_rpc BRD4187C import(//with_pw_rpc.gni)GN/Ninja 直连方式$ cd ~/connectedhomeip/examples/refrigerator-app/silabs $ git submodule update --init $ source third_party/connectedhomeip/scripts/activate.sh $ export SILABS_BOARDBRD4187C $ gn gen out/debug --argsimport(//with_pw_rpc.gni) $ ninja -C out/debug更多构建选项可运行不带参数的构建脚本查看帮助./scripts/examples/gn_silabs_example.sh构建系统的源码级说明从 BUILD.gn 可以看出关键构建开关与结构目标名为refrigerator_app输出matter-silabs-refrigerator-example.out通过wifi_soc在SiWx917 SDKSiWx917_sdk.gniexamples/platform/silabs/SiWx917与EFR32 SDKefr32_sdk.gniexamples/platform/silabs/efr32两条路径间切换use_temp_sensor默认false可启用温湿度传感器si70xx / i2cspm 驱动定义USE_TEMP_SENSORchip_enable_pw_rpc使能 Pigweed RPC 相关服务Attribute / Button / Descriptor / Device service!disable_lcd时编译 src/RefrigeratorUI.cppchip_build_libshell时加入 src/EventHandlerLibShell.cpp提供 Matter Shell 事件注入命令chip_print_memory_usage可在链接时打印内存占用--print-memory-usage-fstack-usage。烧录应用在命令行烧录$ cd ~/connectedhomeip/examples/refrigerator-app/silabs $ python3 out/debug/matter-silabs-refrigerator-example.flash.py也可以使用SEGGER Ozone 调试器直接加载.out文件。注意所有 EFR32 板卡都需要 bootloader预编译 bootloader 二进制可从 Silicon Labs Matter Software Artifacts 页面获取。查看日志输出SEGGER RTT示例默认使用SEGGER Real Time TransferRTT输出日志。RTT 内置于 WSTK 开发板的 J-Link 接口 MCU无需专用 UART 即可与嵌入式应用双向通信。使用 RTT 需要安装 SEGGER J-Link Software and Documentation Pack也可用 SEGGER Ozone 调试器在烧录.out后查看 RTT 日志$ cd ~/Downloads $ sudo dpkg -i JLink_Linux_V*_x86_64.debLinux 下还需把当前用户加入dialout组以访问开发硬件/dev/ttyACMx$ sudo usermod -a -G dialout ${USER}之后用JLinkExe配合JLinkRTTClient查看日志# 终端 1自动连接 WSTKMG24 设备 $ JLinkExe -device EFR32MG24AXXXF1536 -if SWD -speed 4000 -autoconnect 1 # 终端 2查看日志 $ JLinkRTTClient串口控制台Console Log如果二进制以对应选项构建或使用SiWx917 Wi-Fi SoC日志与 CLI若启用会输出到串口控制台。控制台默认波特率为115200带 CTS/RTS 硬件流控Silabs 开发套件默认配置选择verbose 模式--verbose时波特率需切换为 921600 CTS/RTS。配置 VCOM 的两种方式使用 Simplicity StudioWSTK 虚拟串口波特率设置使用 commander 命令行commander vcom config --baudrate 921600 --handshake rtscts使用任意串口终端screen、putty、minicom 等连接即可。运行完整示例前置条件OpenThread 边界路由器假定你已配置并运行 OpenThread 边界路由器OTBR。如未配置可参考 openthread_border_router_pi.md树莓派上搭建边界路由器的完整指南。RCP 固件可在 Simplicity Studio 5 中通过 File → New → Project Wizard → Examples → Thread →ot-rcp获取。用户界面与状态指示LCDSilabs WSTK 的 LCD 显示 QR Code由 CHIP Tool 应用扫描以完成 BLE Rendez-vous。对没有/不支持 LCD 的板卡如 BRD4166A Thunderboard Sense 2RTT 日志中会打印二维码 URLinfo [SVR] Copy/paste the below URL in a browser to see the QR Code: info [SVR] https://project-chip.github.io/connectedhomeip/qrcode.html?dataCH%3AI34NM%20-00%200C9SS0LED 0设备整体状态与连接状态状态含义短闪亮50ms 亮 / 950ms 灭未配网unpaired等待配网应用连接快速均匀闪烁100ms 亮 / 100ms 灭未配网但已有配网应用通过 Bluetooth LE 连接短灭950ms 亮 / 50ms 灭已配网但尚无完整 Thread 网络或服务连接常亮完全配网Thread 网络与服务连接正常LED 1冰箱温控柜状态——当前 README 明确标注“暂无实现将在未来更新中提供”。Push Button 0功能键 恢复出厂按下并释放暂无实现未来更新提供按住 6 秒触发设备恢复出厂设置6 秒窗口内松开则取消。恢复出厂流程启动时LED 会同步闪烁。Push Button 1应用键按下并释放、按住 3 秒均暂无实现未来更新提供。配网并加入 Thread 网络设备配网后加入 Thread 网络在 RTT 日志中可以看到[DL] Device Role: CHILD [DL] Partition Id:0x6A7491B7 [DL] \_OnPlatformEvent default: event-Type 32778 [DL] OpenThread State Changed (Flags: 0x00000001) [DL] Thread Unicast Addresses: [DL] 2001:DB8::E1A2:87F1:7D5D:FECA/64 valid preferred [DL] FDDE:AD00:BEEF::FF:FE00:2402/64 valid preferred rloc [DL] FDDE:AD00:BEEF:0:383F:5E81:A05A:B168/64 valid preferred [DL] FE80::D8F2:592E:C109:CF00/64 valid preferred [DL] LwIP Thread interface addresses updated [DL] FE80::D8F2:592E:C109:CF00 IPv6 link-local address, preferred) [DL] FDDE:AD00:BEEF:0:383F:5E81:A05A:B168 Thread mesh-local address, preferred) [DL] 2001:DB8::E1A2:87F1:7D5D:FECA IPv6 global unicast address, preferred)验证设备在 Thread 网络上用串口终端screen / minicom在运行 refrigerator-app 的板卡上执行router table命令或通过ipaddr命令获取地址列表。设备配网可通过CHIP Tool Android/iOS 应用或OTBR 上的 CLI 命令完成。配网完成后可用 chip-tool 向冰箱设备发送 ZCL 命令。基于示例配置include/CHIPProjectConfig.h 中测试配对码20202021、discriminator0xF00配网与读写示例chip-tool pairing ble-thread 1 hex:operationalDataset 20202021 3840 ./chip-tool refrigeratoralarm read state 1 1 Refrigerator Endpoint Id 1 This enpoint support the refrigerator alarm cluster ./chip-tool temperaturecontrol read temperature-setpoint 1 2 Enpoint for temperaturecontrol is 2 and 3 Freeze Cabinet Endpoint Id 2 Cold Cabinet Endpoint Id 3 This enpoint support Temperature control cluster即Endpoint 1冰箱承载 Refrigerator Alarm 集群及 RefrigeratorAndTemperatureControlledCabinetMode 温控柜模式集群Endpoint 2冷冻柜与 Endpoint 3冷藏柜承载 Temperature Control 集群——与 include/RefrigeratorConfig.h 的端点默认值完全一致。查看支持的冰箱集群命令chip-tool refrigeratorandtemperaturecontrolledcabinetmode chip-tool temperaturecontrol订阅 RefrigeratorAlarm 事件Notify 事件最小/最大间隔 10/1端点 1chip-tool interactive start refrigeratoralarm subscribe-event notify 1 10 1 1IPv6 网络注意点部分路由器不会为设备边界路由器 / PC提供原生 IPv6 地址。此时需在两侧手动配置静态 IPv6 地址并在 PC 上添加指向边界路由器的 IPv6 路由# 边界路由器上 $ sudo ip addr add dev Network interface 2002::2/64 # PCLinux上 $ sudo ip addr add dev Network interface 2002::1/64 # PCLinux上添加 IPv6 路由 $ sudo ip route add Thread global ipv6 prefix/64 via 2002::2从 Matter CLI 触发事件示例还提供 Matter Shell 命令用于模拟/注入冰箱事件便于联调测试。在串口控制台或已启用 shell 的终端执行door-state-change门状态变化事件- matterCli refrigeratoralarm event door-state-change open - DoneNotes从 src/EventHandlerLibShell.cpp 的RegisterRefrigeratorEvents()可以看到 Shell 命令树的完整结构根命令refrigeratoralarm子命令help、event、alarmevent子命令help、door-state-changealarm子命令help、suppress抑制冰箱告警。实现层面door-state-change通过DeviceLayer::PlatformMgr().ScheduleWork()调度到事件工作线程由于 AlarmBase 要求 State 中的每个置位比特都必须在 Mask 与 Supported 中使能开门非零状态更新会先设置 Mask 再设置 State同时也能在suppress之后重新启用监控而关门零状态只清除 State、保持 Mask 使能。suppress则清空 Mask禁用所有已使能告警AlarmBase 同时会裁剪 State。OTA 软件更新EFR32 示例的软件更新流程参见 silabs_efr32_software_update.mdSiWx917 示例的 OTA 软件更新流程参见 Silicon Labs Matter 文档的 OTA Software UpdateSoC章节。构建选项Matter 仓库中所有 Silabs 示例默认启用全部特性以获得最佳用户体验但部分特性可通过构建参数轻松开关。以下选项均通过gn_silabs_example.sh脚本以附加参数形式传入。禁用日志对应 GN 参数chip_progress_logging、chip_detail_logging、chip_automation_logging$ ./scripts/examples/gn_silabs_example.sh ./examples/refrigerator-app/silabs ./out/refrigerator-app BRD4164A chip_detail_loggingfalse chip_automation_loggingfalse chip_progress_loggingfalseDebug / Release 构建对应 GN 参数is_debug$ ./scripts/examples/gn_silabs_example.sh ./examples/refrigerator-app/silabs ./out/refrigerator-app BRD4164A is_debugfalse禁用 LCD / QR Code对应 GN 参数show_qr_code$ ./scripts/examples/gn_silabs_example.sh ./examples/refrigerator-app/silabs ./out/refrigerator-app BRD4164A show_qr_codefalseKVS 最大条目数对应 GN 参数kvs_max_entries设置 NVM 中可存储的最大 KVSKey-Value Store条目数默认 75取值范围30 ≤ kvs_max_entries ≤ 255$ ./scripts/examples/gn_silabs_example.sh ./examples/refrigerator-app/silabs ./out/refrigerator-app BRD4164A kvs_max_entries50总结examples/refrigerator-app/silabs是一个结构完整、可直接上手的 Silabs 平台 Matter 参考实现它以 CRTP 派发架构把“SDK 默认行为”与“产品定制逻辑”清晰解耦开发者只需覆写*Impl()钩子即可注入自己的业务代码而无需触碰自动生成源码构建层面同时覆盖 ThreadEFR32 MG24与 Wi-FiSiWx917两条硬件路径并支持 ICD、Pigweed RPC、温湿度传感器、LCD 等可裁剪特性。配合本文所述的配网、chip-tool 控制、Shell 事件注入与日志调试手段即可基于该模板快速开展基于 Silicon Labs 平台的 Matter 温控设备产品开发。【免费下载链接】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),仅供参考