ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Matter EVSE 充电桩示例在 Silabs EFR32 平台上的完整开发指南:构建、定制与调试

Matter EVSE 充电桩示例在 Silabs EFR32 平台上的完整开发指南:构建、定制与调试 Matter EVSE 充电桩示例在 Silabs EFR32 平台上的完整开发指南构建、定制与调试【免费下载链接】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原 Project CHIP仓库中的examples/evse-app/silabs示例展开完整讲解如何在 Silicon Labs EFR32 MG24 硬件上构建、烧录、运行并定制一个 Matter 电动汽车供电设备EVSE即充电桩。文章不仅覆盖从工具链准备、GN/Ninja 构建到 BLE/Thread 配网与 chip-tool 控制的完整实战流程还结合仓库源码深入剖析基于 CRTP 模式的CustomerAppTask应用扩展机制、Device Energy Management 功能开关以及内存、日志、OTA、RPC 等工程化配置帮助开发者快速把该示例演进为真实 EVSE 产品原型。示例定位与运行方式该示例为在 Silicon Labs EFR32 MG24 平台上基于 Matter 与 Gecko SDK 构建的 EVSE 设备基线演示见 examples/evse-app/silabs/README.md。设备可通过 Chip 控制器在 OpenThread 或 Wi-Fi 网络中被控制初次使用时通过低功耗蓝牙BLE完成 Rendez-vous 配网流程——设备与控制器交换安全信息后若走 Thread 网络控制器会把 Thread 网络凭据下发给 EFR32 设备设备随即加入 Thread 网络。如果启用了 LCDSilabs WSTK 开发板上的 LCD 会显示包含 BLE 配网信息的二维码供配网应用扫描后发起 Rendez-vous对于无 LCD 的板卡如 BRD4166A Thunderboard Sense 2可在 RTT 日志中找到二维码对应的 URL复制到浏览器即可显示同样的二维码。从示例目录结构可以清楚看到应用主体由以下文件构成文件作用include/AppConfig.h应用级预处理器配置include/AppTask.hAppTask 公共接口声明include/AppTaskImpl.h所有可覆写*Impl()方法的声明include/EvseConfig.hEVSE 端点等预制配置开关src/AppTask.cppSilabs 默认 AppTask 实现BUILD.gnGN 构建定义与构建参数其中 EvseConfig.h 通过#define EVSE_ENDPOINT 1指定承载 EnergyEvse / DeviceEnergyManagement 集群的端点默认值为端点 1可根据产品设计修改。扩展基类应用实现CustomerAppTask 定制机制这是整个示例中面向厂商定制最核心的机制。Silabs 将平台默认行为与客户定制行为通过 C 的 CRTP奇异递归模板模式解耦让厂商在不改动平台默认源码的前提下按需覆写单个行为。CustomerAppTask 与 CRTP 分层examples/platform/silabs/customer/CustomerAppTask.h 与 examples/platform/silabs/customer/CustomerAppTask.cpp 是留给厂商的定制入口。默认实现仅声明静态单例sAppTask并重写AppTask::GetAppTask()指向CustomerAppTask::GetAppTask()即默认行为完全继承自基类。基类模板定义在 include/AppTaskImpl.htemplate typename Derived class AppTaskImpl : public AppTask { public: CHIP_ERROR AppInit() override { CRTP_OPTIONAL_DISPATCH(AppTaskImpl, Derived, AppInitImpl); } void ApplicationInit() { CRTP_OPTIONAL_VOID_DISPATCH(AppTaskImpl, Derived, ApplicationInitImpl); } static void ButtonEventHandler(uint8_t button, uint8_t btnAction) { CRTP_OPTIONAL_STATIC_DISPATCH(AppTaskImpl, Derived, ButtonEventHandlerImpl, button, btnAction); } static void EnergyManagementActionEventHandler(AppEvent * aEvent) { CRTP_OPTIONAL_STATIC_DISPATCH(AppTaskImpl, Derived, EnergyManagementActionEventHandlerImpl, aEvent); } private: CHIP_ERROR AppInitImpl() { return AppTask::AppInit(); } void ApplicationInitImpl() { AppTask::ApplicationInit(); } void ButtonEventHandlerImpl(uint8_t button, uint8_t btnAction) { AppTask::ButtonEventHandler(button, btnAction); } void EnergyManagementActionEventHandlerImpl(AppEvent * aEvent) { AppTask::EnergyManagementActionEventHandler(aEvent); } };每个公共分发入口AppInit、ApplicationInit、ButtonEventHandler、EnergyManagementActionEventHandler都通过宏把调用路由到Derived::*Impl()基类的默认*Impl()私有实现则转发回AppTask的默认行为。这样凡是厂商未覆写的*Impl()都保持 Silabs 默认行为覆写了的则走客户逻辑。如何覆写 API按照 README 给出的四个步骤即可完成一次定制在基类 API 中定位需要覆写的方法参考下文 Override API Reference在CustomerAppTask.h的private:段声明同名方法——注意*Impl()覆写是非静态的实例方法即使其公共分发入口如ButtonEventHandler是static在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()进行定制转发过程同样走 CRTP。两条铁律需要遵守AppTask 中已有的方法通过在CustomerAppTask覆写对应的*Impl()来定制不要为了应用特有行为去改AppTask.cpp全新的自定义数据模型方法直接在CustomerAppTask中新增。不要往自动生成的源码里塞应用逻辑——那些改动无法在重新生成或项目升级后存活。最小定制示例README 给出一个同时覆写AppInitImpl()与ButtonEventHandlerImpl()的最小CustomerAppTaskCustomerAppTask.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 #define APP_CONTROL_BUTTON 1 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_CONTROL_BUTTON btnAction static_castuint8_t(SilabsPlatform::ButtonAction::ButtonPressed)) { aEvent.Handler CustomerAppTask::EnergyManagementActionEventHandler; AppTask::GetAppTask().PostEvent(aEvent); } else if (button APP_FUNCTION_BUTTON) { aEvent.Handler BaseApplication::ButtonHandler; AppTask::GetAppTask().PostEvent(aEvent); } }对照默认实现 src/AppTask.cpp 可以看到默认AppInit()会注册CustomerAppTask::ButtonEventHandler作为按钮回调、调用AppInstance().ApplicationInit()、按需注册测试事件触发句柄Test Event Trigger并更新 LCD 二维码显示默认ButtonEventHandler()中控制按钮APP_CONTROL_BUTTON即按钮 1按下时派发EnergyManagementActionEventHandler事件功能按钮APP_FUNCTION_BUTTON即按钮 0则交给BaseApplication::ButtonHandler。定制版本正是围绕这两个行为做差异化。Override API ReferenceCHIP_ERROR StartAppTask()只在AppTask上声明它不是*Impl()钩子平台代码如MatterConfig以静态类型AppTask 调用AppTask::GetAppTask().StartAppTask()从而执行AppTask.cpp中的实现通过BaseApplication::StartAppTask(...)创建 FreeRTOS 应用任务。如需改变启动行为应修改产品源码中的AppTask::StartAppTask()或BaseApplication::StartAppTask。可覆写方法与默认实现的位置参考文件用途include/AppTaskImpl.h声明所有可覆写的*Impl()方法从这里面拷贝所需签名到CustomerAppTask.hsrc/AppTask.cppSilabs 默认 AppTask 实现任何未覆写的*Impl()都会运行这里面的逻辑可作为定制行为的参考能源管理硬件集成需要特别说明的是CRTPCustomerAppTask模式目前只覆盖 AppTask 行为。电能与功率计量、功率拓扑Power Topology以及响应集群命令对充电硬件进行启停等能源管理硬件集成尚未纳入 CRTP 路由官方计划未来将其纳入 CRTPCustomerAppTask接口。在此过渡期内需要对接真实能源管理硬件的厂商必须直接修改以下共享 delegate 实现对应仓库 examples/energy-management/electrical-sensor 目录examples/energy-management/electrical-sensor/src/ElectricalEnergyMeasurementDelegateImpl.cppexamples/energy-management/electrical-sensor/src/ElectricalPowerMeasurementDelegateImpl.cppexamples/energy-management/electrical-sensor/src/PowerTopologyDelegateImpl.cpp构建示例前置条件下载 Simplicity Commander 命令行工具并确保commander位于 shell 搜索路径中Mac OS X 下位于Commander.app/Contents/MacOS/安装合适的 ARM GCC 工具链README 推荐 GNU Arm Embedded Toolchain 9-2019-q4-major安装辅助工具Linux 执行sudo apt-get install git ninja-buildMac OS X 执行brew install ninja。支持的硬件示例面向 MG24 系列板卡包括BRD2703A / SLWSTK6000B / Wireless Starter Kit / 2.4GHz10dBmBRD4186C / SLWSTK6006A / Wireless Starter Kit / 2.4GHz10dBmBRD4187C / SLWSTK6006A / Wireless Starter Kit / 2.4GHz20dBmBRD2703A / MG24 Explorer KitBRD2704A / SparkFun Thing Plus MGM240P board最新的受支持硬件清单以 Silicon Labs Matter 仓库的 Hardware Requirements 为准。从 BUILD.gn 可见silabs_board变量驱动板级配置且对 BRD2704A 额外定义了SL_STATUS_LED0同时支持通过wifi_soc切换到 SiWx917 Wi-Fi SoC 构建此时平台目录切换为examples/platform/silabs/SiWx917。一键构建脚本在仓库根目录使用官方脚本构建cd ~/connectedhomeip ./scripts/examples/gn_silabs_example.sh ./examples/evse-app/silabs/ ./out/evse-app BRD4187C脚本位于 scripts/examples/gn_silabs_example.sh不带参数运行可查看全部构建选项的帮助信息。使用 GN/Ninja 直接构建也可以绕过脚本直接走 GN/Ninjacd ~/connectedhomeip/examples/evse-app/silabs git submodule update --init source third_party/connectedhomeip/scripts/activate.sh export SILABS_BOARDBRD4187C gn gen out/debug ninja -C out/debugDevice Energy Management 功能开关示例支持通过gn gen参数切换 Device Energy ManagementDEM特性——即电源预测Power forecast与状态预测State forecast上报支持。对应的 GN 参数声明在 BUILD.gn 中declare_args() { # Device Energy Management feature support - only one of these can be true # or both can be disabled if forecasting is not supported sl_dem_support_power_forecast_reporting true sl_dem_support_state_forecast_reporting false }这两个宏最终会以SL_MATTER_CONFIG_DEM_SUPPORT_POWER_FORECAST_REPORTING与SL_MATTER_CONFIG_DEM_SUPPORT_STATE_FORECAST_REPORTING的形式注入编译定义并决定 src/AppTask.cpp 中 DeviceEnergyManagement 集群的sFeatureMap二者同时为 true 会触发编译错误#error启用 Power 预测时 FeatureMap 包含kPowerAdjustment, kPowerForecastReporting, kStartTimeAdjustment, kPausable, kForecastAdjustment, kConstraintBasedAdjustment启用 State 预测时用kStateForecastReporting替换kPowerForecastReporting两者都关闭则只保留kPowerAdjustment。应用启动时会在日志中打印实际的 featureMapevse-app starting. featureMap 0x...。构建示例gn gen out/debug --argssl_dem_support_state_forecast_reportingtrue sl_dem_support_power_forecast_reportingfalse ninja -C out/debug构建为 ICD间歇性连接设备./scripts/examples/gn_silabs_example.sh ./examples/evse-app/silabs/ ./out/evse-app_ICD BRD4187C --icd构建带 Pigweed RPC 的版本./scripts/examples/gn_silabs_example.sh examples/evse-app/silabs/ out/evse_app_rpc BRD4187C import(//with_pw_rpc.gni)或直接使用 GN/Ninjacd ~/connectedhomeip/examples/evse-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/debugwith_pw_rpc.gniexamples/evse-app/silabs/with_pw_rpc.gni会开启chip_enable_pw_rpc、chip_enable_thread并将 tracing 后端切换为pw_trace_tokenized。开启 RPC 后BUILD.gn 会追加 attribute、button、descriptor、device、lighting、ot_cli、thread 等一批 nanopb RPC 服务以及对应的 tracing service并将日志后端切换到 PigweedLogger。清理构建产物cd ~/connectedhomeip rm -rf ./out/或仅清理示例目录下的产物cd ~/connectedhomeip/examples/evse-app/silabs rm -rf out/烧录应用命令行烧录进入示例目录后执行生成的 flash 脚本cd ~/connectedhomeip/examples/evse-app/silabs python3 out/debug/matter-silabs-evse-example.flash.py或者使用 Ozone 调试器直接加载.out文件输出文件名matter-silabs-evse-example.out定义在 BUILD.gn 的output_name。所有 EFR32 板卡都需要 bootloader具体请参考 Silicon Labs 文档Silicon Labs Matter 仓库的 Releases 页提供了预编译 bootloader 二进制。查看日志输出SEGGER RTT示例默认使用 SEGGER Real Time TransferRTT输出日志。RTT 是 WSTK 上 J-Link 接口 MCU 内置的功能无需专用 UART 即可与嵌入式应用双向通信。使用前提下载并安装 SEGGER J-Link Software and Documentation PackLinux 下为JLink_Linux_x86_64.debMac 下为JLink_MacOSX.pkg安装命令cd ~/Downloads sudo dpkg -i JLink_Linux_V*_x86_64.debLinux 下把当前用户加入dialout组以访问/dev/ttyACMxsudo usermod -a -G dialout ${USER}终端一运行 JLinkExe 自动连接 WSTKMG24 使用 EFR32MG24AXXXF1536 器件JLinkExe -device EFR32MG24AXXXF1536 -if SWD -speed 4000 -autoconnect 1终端二运行 JLinkRTTClient 查看日志JLinkRTTClient也可在烧录.out文件后用 SEGGER Ozone J-Link 调试器直接查看 RTT 日志。串口控制台如果二进制以控制台模式构建或使用的是 SiWx917 Wi-Fi SoC日志与 CLI若启用会走串口控制台。控制台默认波特率115200需 CTS/RTS 硬件流控这也是 Silabs 开发套件的默认配置但若选择了 verbose 模式--verbose波特率需切换为921600并保持 CTS/RTS。配置 VCOM 波特率有两种方式在 Simplicity Studio 中修改 WSTK 虚拟串口波特率设置使用 commander-clicommander vcom config --baudrate 921600 --handshake rtscts随后可用任意串口终端软件screen、putty、minicom 等连接查看输出。运行完整示例前提OpenThread 边界路由器示例假设你已配置并运行 OpenThread 边界路由器RCP 代码可通过 Simplicity Studio 5 的 File-New-Project Wizard-Examples-Thread 下的ot-rcp工程直接获取。若尚未配置可参考 Openthread border router 指南在树莓派上搭建边界路由器。LCD 与二维码配网Silabs WSTK 的 LCD 会显示二维码由 CHIP Tool 等配网应用扫描后发起 BLE Rendez-vous。无 LCD 的板卡可在 RTT 日志中找到类似如下 URL 并复制到浏览器查看二维码info [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 状态指示LED 0指示设备整体状态与连接情况短闪亮 50ms / 灭 950ms未配网unprovisioned等待配网应用连接快速均匀闪烁亮 100ms / 灭 100ms未配网且已有配网应用通过 BLE 连接短暂熄灭亮 950ms / 灭 50ms已完全配网但尚未获得完整的 Thread 网络或服务连通性常亮已完全配网且拥有完整的 Thread 网络与服务连通性。按键功能Push Button 0功能键按下并松开以快速模式启动或重启BLE 广播持续 30 秒后切换为慢速间隔广播15 分钟后停止广播同时会依次循环显示二维码、应用状态与设备状态界面长按 6 秒触发设备恢复出厂设置在 6 秒窗口内松开则取消该流程。恢复出厂设置触发时LED 会同步闪烁。配网与控制可使用 Python 控制器、chip-tool 独立工具、Android 或 iOS 应用对设备进行配网与控制。以 chip-tool 为例chip-tool pairing ble-thread 1 hex:operationalDataset 20202021 3840其中operationalDataset是 Thread 网络的 operational dataset十六进制20202021是配网 PIN3840是 discriminator。网络注意事项若路由器无法为边界路由器/PC 提供原生 IPv6 地址需要手动配置静态 IPv6 与路由边界路由器上sudo ip addr add dev Network interface 2002::2/64PCLinux上sudo ip addr add dev Network interface 2002::1/64PC 上添加 IPv6 路由sudo ip route add Thread global ipv6 prefix/64 via 2002::2运行 RPC 控制台启用 RPC 构建后chip_rpcPython 交互式控制台会被安装到 venv 中wheel 文件同时生成于输出目录out/debug/chip_rpc_console_wheels。无需重新构建即可手动安装pip3 install out/debug/chip_rpc_console_wheels/*.whl安装后启动控制台chip-console --device /dev/tty.SERIALDEVICE -b 115200 -o /YourFolder/pw_log.out随后可模拟按键事件例如让按钮 1idx1按下rpcs.chip.rpc.Button.Event(idx1, pushedTrue)其中 idx 为 0 或 1对应 PB0/PB1action 为 0 表示按下、1 表示释放。示例也可用 RPC 测试 LED 开关。设备追踪Device Tracing设备追踪用于分析设备性能需要先按上文构建带 Pigweed RPC 的版本方式开启 RPC 构建。获取 tracing JSON 文件./{PIGWEED_REPO}/pw_trace_tokenized/py/pw_trace_tokenized/get_trace.py -d {PORT} -o {OUTPUT_FILE} \ -t {ELF_FILE} {PIGWEED_REPO}/pw_trace_tokenized/pw_trace_protos/trace_rpc.proto内存设置Matter 的 RAM 使用大部分是静态分配的便于通过符号分析进行调试与优化但仍需为 crypto 与 OpenThread 保留部分 HEAP。HEAP 大小可通过修改本示例FreeRTOSConfig.h中的configTOTAL_HEAP_SIZE宏调整。注意HEAP 小于 13k 会导致 BLE Rendez-vous 或 CASE 会话期间的 Mbedtls 失败。如需跟踪内存使用可在 BUILD.gn 中设置enable_heap_monitoring true或作为构建参数传给 gn。开启后 RTT 控制台会打印每个任务的 RAM 占用以及内存分配/释放次数。该监控并非全量监控可自行修改examples/platform/silabs/MemMonitoring.cpp在trackAlloc与trackFree函数中加入自定义内存追踪代码。OTA 软件更新EFR32 示例应用的软件升级流程详见 EFR32 OTA Software Update该文档位于仓库docs/platforms/silabs/目录下。组通信多播该 EVSE 示例支持组通信可向多台设备同时发送 EVSE 命令。具体操作参考 chip-tool 文档 中的Configuring the server side for Group Commands与Using the Client to Send Group (Multicast) Matter Commands两节。构建选项汇总Matter 仓库中所有 Silabs 示例默认开启全部特性以获得最佳开箱体验但这些特性均可通过构建参数轻松开关。关闭日志日志相关参数为chip_progress_logging、chip_detail_logging、chip_automation_logging./scripts/examples/gn_silabs_example.sh ./examples/evse-app/silabs ./out/evse-app BRD4164A chip_detail_loggingfalse chip_automation_loggingfalse chip_progress_loggingfalseDebug / Release 构建通过is_debug切换./scripts/examples/gn_silabs_example.sh ./examples/evse-app/silabs ./out/evse-app BRD4164A is_debugfalse关闭 LCD通过show_qr_code关闭二维码/LCD 显示./scripts/examples/gn_silabs_example.sh ./examples/evse-app/silabs ./out/evse-app BRD4164A show_qr_codefalseKVS 最大条目数通过kvs_max_entries设置 NVM 中可存储的 KVS 条目上限默认 75取值范围 30 ≤ kvs_max_entries ≤ 255./scripts/examples/gn_silabs_example.sh ./examples/evse-app/silabs ./out/evse-app BRD4164A kvs_max_entries50结语examples/evse-app/silabs示例既是用 Matter 探索 EVSE 工作方式的入口也是基于 Silicon Labs 平台打造真实充电桩产品的模板。掌握CustomerAppTask的 CRTP 覆写机制、DEM 功能开关Power/State forecast reporting、构建/烧录/配网/调试的完整链路以及内存、KVS、RPC、OTA 与组通信等工程化配置开发者即可把这份示例快速演进为满足自身产品需求的 Matter EVSE 固件。需要注意当前能源管理硬件集成电能/功率计量与充电硬件启停尚未接入 CRTP 接口仍需直接修改examples/energy-management/electrical-sensor下的共享 delegate 实现相关演进计划可在后续 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),仅供参考
返回列表