在 Texas Instruments CC32XX 上构建与运行 Matter 空气净化器示例应用(connectedhomeip / CC3235SF LaunchPad)
在 Texas Instruments CC32XX 上构建与运行 Matter 空气净化器示例应用connectedhomeip / CC3235SF LaunchPad【免费下载链接】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导读本文基于 connectedhomeipMatter/Project CHIP 开源实现仓库中的 CC32XX Air Purifier 示例应用文档系统讲解如何在一颗 TI SimpleLink™ Wi-Fi® CC32XX 无线 MCU默认目标为 CC3235SF_LAUNCHXL LaunchPad上编译、烧录并运行一个完整的 Matter 空气净化器设备。你将掌握从环境准备SysConfig bootstrap、GN/Ninja 交叉编译、DAC 证书替换到 CCS 调试烧录、UART 日志查看、以及通过 SimpleLink 方式配网并入 Matter 网络的全流程并能在阅读过程中对照仓库源码理解应用初始化、按钮交互、KVS 存储与设备认证的实现细节。一、示例应用概述一个基于 CC32XX 的联网空气净化器CC32XX 空气净化器示例应用examples/air-purifier-app/cc32xx是一个可工作的联网空气净化器设备演示它同时使用开源 Matter/CHIP 实现与德州仪器 SimpleLink™ Wi-Fi® CC32xx 软件开发套件SDK。目标硬件默认面向 CC3235SF_LAUNCHXL LaunchPad但示例工程被设计为可在整个CC32XX系列 MCU 上构建板卡名通过 GN 变量ti_simplelink_board指定见 args.gni。定位既可作为探索 Matter/CHIP 工作原理的入口也可作为基于 TI 器件开发真实产品的模板。从构建脚本看这个示例并非单端点灯泡式应用而是一个多端点Endpoint聚合设备。在 AppTask.cpp 中定义了 5 个端点端点 ID用途1空气净化器主体Air Purifier2空气质量传感器Air Quality Sensor3温度传感器Temperature Sensor4相对湿度传感器Relative Humidity Sensor5恒温器Thermostat其中传感器与恒温器端点通过SetParentEndpointForEndpoint(...)挂接在空气净化器端点之下形成父子端点层级见 AppTask.cpp随后由AirPurifierManager::InitInstance(...)统一初始化AppTask.cpp。公共逻辑位于 examples/air-purifier-app/air-purifier-common其中包含集群定义文件air-purifier-app.zap、数据模型文件air-purifier-app.matter以及src/下的管理器实现CC32XX 工程通过air-purifier-common目标直接复用见 BUILD.gn。二、设备 UI按键交互与状态指示2.1 按键行为按键动作行为左键BTN-1单击触发配网Provisioning默认以 oneshot 模式启用右键BTN-2长按1 秒复位设备 / 清除 Matter 配置右键长按的底层实现在 AppTask.cpp 的ButtonRightEventHandler中TI Button 驱动产生Button_EV_CLICKED或Button_EV_LONGCLICKED事件长按阈值longPressDuration 1000UmsAppTask.cpp事件经 ISR 上下文通过xQueueSendFromISR投递到应用事件队列由DispatchEvent处理长按事件会先删除设备文件系统上的 KVS 配置/sys/matter/kvs.cfgtoken0x13578642随后执行 Matter 部分设备复位AppTask.cpp。应用主循环则通过 FreeRTOS 队列xQueueReceive等待并分发事件AppTask.cpp。2.2 按键 / LED 的硬件映射按键与 LED 的引脚映射由 SysConfig 工程文件 chip.syscfg 定义CONFIG_BTN_LEFT↔ 板载SW2CONFIG_BTN_RIGHT↔ 板载SW3CONFIG_LED_BLUE、CONFIG_LED_GREEN、CONFIG_LED_RED红色 LED 为可调光 PWM 输出占用了 Timer3 通道见 chip.syscfg。AppTask::Init()中会依次打开红、绿 LED 并初始化为熄灭状态AppTask.cpp。Wi-Fi 模块还支持将蓝色 LED 用作连接状态指示断开时常灭、配网中闪烁、已连接常亮见 wifi_settings.h 的WIFI_LED_HANDLE宏。三、构建环境准备Preparation构建环境为 Linux官方推荐 Ubuntu 20.04。本节操作在每次升级 SDK 版本后都需要重新执行。3.1 安装 SysConfigSysConfig 是 TI 的图形化 / 命令行配置工具负责根据chip.syscfg生成驱动配置文件ti_drivers_config.c/.h、ti_drivers_net_wifi_config.c、ti_net_config.c等见 BUILD.gn。安装命令$ cd ~ $ wget https://software-dl.ti.com/ccs/esd/sysconfig/sysconfig-1.13.0_2553-setup.run $ chmod x sysconfig-1.13.0_2553-setup.run $ ./sysconfig-1.13.0_2553-setup.run安装完成后请记录 SysConfig 的安装路径编译阶段需要将其绝对路径显式传给 GNLinux 默认位于$HOME/ti/sysconfig_1.13.0Windows 默认位于C:\ti。3.2 运行 bootstrap 脚本bootstrap 会拉取并准备构建所依赖的第三方组件与 Python 环境$ cd ~/connectedhomeip $ source ./scripts/bootstrap.sh仓库中对应的脚本位于 scripts/bootstrap.sh与之配套的还有 scripts/activate.sh 用于激活已就绪的构建环境。四、编译GN 生成 Ninja 构建每次打开新的 shell 都需要先激活构建环境然后依次执行 GN 和 Ninja$ cd ~/connectedhomeip $ source ./scripts/activate.sh$ cd ~/connectedhomeip/examples/air-purifier-app/cc32xx $ gn gen out/debug --argsti_sysconfig_root\$HOME/ti/sysconfig_1.13.0\ $ ninja -C out/debug要点说明ti_sysconfig_root必须填写绝对路径即第 3.1 节记录的安装目录。GN 构建需要传入的参数不止ti_sysconfig_root一个。工程自身的默认参数集中在 examples/air-purifier-app/cc32xx/args.gni它导入了 examples/platform/cc32xx/args.gni配置 CHIP 各子系统的工程头文件以及config/standalone/args.gni。该文件中的核心配置如下配置项默认值含义ti_simplelink_boardCC3235SF_LAUNCHXL目标板卡chip_config_network_layer_blefalse关闭 BLE 网络层BLE 配网暂不支持chip_bypass_rendezvousfalse不绕过 rendezvous 流程chip_progress_logging/chip_detail_logging/chip_automation_loggingtrue开启各级日志输出chip_stack_lock_trackingnone关闭栈锁追踪适配当前 FreeRTOS 配置未启用INCLUDE_xSemaphoreGetMutexHoldermatter_device_vid0xFFF1Matter 设备 VIDmatter_device_pid0x8006Matter 设备 PIDmatter_software_ver/matter_software_ver_str0x0001/1.0d1软件版本构建产物为 ELF 格式的可执行文件命名形如chip-CC3235SF_LAUNCHXL-air-purifier-example.out见 BUILD.gn。当前不生成UniFlash 烧录用的 bin 镜像。若需以优化尺寸编译可在args.gni中取消is_debug false的注释以启用-Os见 args.gni。4.1 构建系统结构源码视角BUILD.gn中的目标组织清晰地反映了本示例的依赖关系ti_simplelink_sdk(sdk)SDK 层携带BUILD_RELEASE宏debug 构建为 0release 为 1见 BUILD.gnti_sysconfig(sysconfig)由 chip.syscfg 生成驱动代码source_set(air-purifier_app_sdk)聚合平台侧代码包括 Logging.cpp、Wi-Fi 初始化cc32xxWifiInit.c以及 TI SimpleLink SDK 的lwip_if.c/utils_if.c/wifi_if.c网络适配层BUILD.gnti_simplelink_executable(air-purifier_app)最终可执行文件链接air-purifier-common的四个管理器air-purifier、air-quality-sensor、filter-delegates、thermostat与主目录下的AppTask.cpp、CHIPDeviceManager.cpp、DeviceCallbacks.cpp、ZclCallbacks.cpp等并依赖cc32xx-attestation-credentials目标BUILD.gn。编译目标assert(current_os freertos)表明该工程运行在 FreeRTOS 之上BUILD.gn。五、添加自定义 DAC 证书Matter 设备入网与认证依赖设备认证证书DAC。要替换为自定义 DAC需要修改 examples/platform/cc32xx/CC32XXDeviceAttestationCreds.cpp 中以下四组数组DAC 私钥gDacPrivKeyDAC 公钥gDacPubKeyDAC 证书gDacCertPAI 证书gPaiCert。从源码结构看CC32XXDeviceAttestationCreds.cpp这些数组被组织成factoryData结构体dac_priv_key/dac_pub_key/dac_cert/pai_cert四段{len, data}对并通过链接符号__attestation_credentials_base暴露给CC32XX::GetCC32XXDacProvider()。默认情况下数组内容对应 Matter 开发 VID0xFFF1/ PID0x8006证书 DER 的 Subject/Issuer 字段中编码了FFF1与8006见 CC32XXDeviceAttestationCreds.cpp。应用侧的选择逻辑在 AppTask.cpp若定义了CC32XX_ATTESTATION_CREDENTIALS宏则注册CC32XX::GetCC32XXDacProvider()来自examples/platform/cc32xx的认证凭据提供者否则回退到 SDK 的示例 DAC 提供者Examples::GetExampleDACProvider()。该注册发生在 Server 初始化之前以确保 Operational Credentials 在集群构建时就能拿到正确的提供者。六、烧录与调试Programming将构建好的镜像加载到 LaunchPad 上目前仅支持通过 Code Composer StudioCCS且 CCS 基于 ELF 中的调试信息进行源码定位因此若镜像在另一台机器上构建或源码目录与 ELF 记录的位置不一致CCS 会提示手动查找源码当前不生成 UniFlash 编程所需的 bin 镜像。6.1 Code Composer Studio 烧录步骤下载并安装 Code Composer Studio仓库 TI 平台文档目录。打开 CCS创建一个新的 workspace。为目标 SoC 与调试器创建 target connection即 CCXML参照 CCS Users Guide 中 Manual Method 一节的操作。启动一个 project-less无工程debug session参照 Manual Launch 一节。CCS 自动切换到 debug 视图对应 After Launch 一节。此时 SoC core 通常处于断开状态、符号未加载先连接 coreDebug View 一节再点击工具栏上的Load按钮加载 ELF 镜像。注意CCXML 的默认配置使用 2-wire cJTAG而非完整的 4-wire JTAG这是为了匹配 LaunchPad 默认的跳线配置无需改动。七、查看日志输出Logging默认情况下日志通过 Application/User UART 输出。使用终端模拟器连接该串口参数如下参数值Speed (baud)115200Data bits8Stop bits1ParityNoneFlow controlNone日志链路的实现可追溯平台日志函数cc32xxLog在 AppConfig.h 中声明并被PLAT_LOG(...)宏引用其实现位于 src/platform/cc32xx/Logging.cpp在AppTask::Init()中通过cc32xxLogInit()完成初始化AppTask.cpp。UART 硬件在 chip.syscfg 中映射到 XDS110UARTDisplay 模块使用 UART1 外设。启动后串口会依次输出应用横幅DisplayBanner()、内存初始化、LED/按键初始化、Wi-Fi 初始化、CHIP 栈初始化、设备认证配置、Server 初始化以及 Onboarding 二维码信息PrintOnboardingCodes(...)使用kOnNetwork标志见 AppTask.cpp。八、运行示例配网Provisioning将 Matter 设备接入网络的第一步是配网provisioning。本示例通过 TI 专有的 SimpleLink 配网方式AP 模式或 Smart Config完成配合 SimpleLink Starter Pro 手机 App 使用按左键BTN-1触发配网oneshot 模式即只进行一次配网尝试。设备通过 SimpleLink 配网AP 或 Smart Config接入本地 Wi-Fi。设备连上本地 AP 后即可使用 OnNetwork 方式触发 Matter commissioning配网/入网例如配合 chip-tool 等 Matter 控制器完成后续流程。配网参数集中在 wifi_settings.h宏默认值说明WIFI_IF_DEBUG_LEVELE_INFOWi-Fi 内部消息的最低日志级别可选E_TRACE/E_DEBUG/E_INFO/E_WARNING/E_ERROR/E_FATALPROVISIONING_MODEWifiProvMode_ONE_SHOT配网模式OFF/ON/ONE_SHOTPROVISIONING_CMDSL_WLAN_PROVISIONING_CMD_START_MODE_APSC配网命令AP、SCSmart Config、APSC、APSC_EXTERNAL_CONFIGURATION、EXTERNAL_CONFIGURATION 等PROVISIONING_TIMEOUT00 表示使用默认超时PROVISIONING_AP_PASSWORD1234567890AP 配网密码NULL表示开放网络PROVISIONING_SC_KEY1234567890123456Smart Config 密钥NULL表示默认FORCE_PROVISIONING(0)强制清除已有 profile 重新配网仅开发测试用开启时静态 profile 配置失效AP_SSID/AP_PASSWORDNULL静态直连配置方式一硬编码 SSID/密码密码NULL为开放网络否则为 WPA2AP_CFG_FILENAME/AP_CFG_TOKEN/AP_CFG_MAX_SIZEnetwork.cfg/12345678/100静态直连配置方式二从配置文件读取文件内容为ssid passwordSSID 与密码之间用一个空格分隔不可含换行、多余空格或引号WIFI_LED_HANDLEgLedBlueHandleWi-Fi 状态 LED关闭定义即禁用自动指示8.1 关于蓝牙 LE 配网BLE 配网当前暂不支持chip_config_network_layer_ble false见 args.gni这也是PrintOnboardingCodes使用kOnNetwork标志的原因。因此当前版本只支持 OnNetwork commissioning 路径。九、启动流程小结源码级结合 main.cpp 与 AppTask.cppCC32XX 示例的启动链路如下main()中调用Board_init()、GPIO_init()并将 mbedtls 的内存分配函数切换到 CHIP 平台实现mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree)见 main.cppGetAppTask().StartAppTask()创建应用事件队列与 FreeRTOS 应用任务栈 4096 字、优先级 4AppTask.cppvTaskStartScheduler()启动 FreeRTOS 调度器main.cppAppTask::Init()依次完成日志、内存、LED/按键、Wi-Fi、CHIP 栈、设备认证提供者、Matter Server、端点父子关系与 AirPurifierManager 的初始化AppTask.cpp。十、延伸阅读示例应用的公共逻辑与集群定义examples/air-purifier-app/air-purifier-common含air-purifier-app.zap、air-purifier-app.matter平台侧认证凭据examples/platform/cc32xx/CC32XXDeviceAttestationCreds.cpp平台层 CC32XX 实现src/platform/cc32xx/Logging.cpp构建环境脚本scripts/bootstrap.sh、scripts/activate.shTI 平台构建说明docs/platforms/ti/README.md注意示例默认使用 Matter 开发 VID0xFFF1/ PID0x8006与示例 DAC仅适用于开发验证面向生产环境时请务必按第五节流程替换为经过认证的正式证书并核对args.gni中的 VID/PID 与软件版本号与产品声明一致。【免费下载链接】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),仅供参考

相关新闻

书桌角落的 Mac mini,OpenClaw 通过 TaoToken 跑任务。

书桌角落的 Mac mini,OpenClaw 通过 TaoToken 跑任务。

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:03:32 阅读更多 →
验证 OpenSpec 兼容性,Cursor 的 Token 从 TaoToken 出

验证 OpenSpec 兼容性,Cursor 的 Token 从 TaoToken 出

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:03:32 阅读更多 →
Python数据库开发:SQLAlchemy ORM核心技巧与实战

Python数据库开发:SQLAlchemy ORM核心技巧与实战

1. Python数据库开发实战:SQLAlchemy ORM深度解析作为一名长期使用Python进行数据库开发的工程师,我见证了SQLAlchemy从一个小众工具成长为Python生态中最强大的ORM框架。在实际项目中,合理使用SQLAlchemy能大幅提升开发效率,但很…

2026/9/19 0:03:32 阅读更多 →

最新新闻

本地化营销公司推荐:商丘树品科技实时数据监控,适配门店与线上双场景

本地化营销公司推荐:商丘树品科技实时数据监控,适配门店与线上双场景

随着互联网流量红利逐渐向垂直场景、精准获客方向转移,传统实体企业、B端制造工厂都在寻求更适配自身业务的数字化营销路径,本地化营销服务因为更懂本地企业需求、能提供线下上门对接、长期陪跑的落地服务,正在成为越来越多企业开展线上营销的…

2026/9/19 1:37:26 阅读更多 →
Aptos move-model Builder 模块解析:Legacy 模式与 Compiler 模式的双轨构建机制

Aptos move-model Builder 模块解析:Legacy 模式与 Compiler 模式的双轨构建机制

Aptos move-model Builder 模块解析:Legacy 模式与 Compiler 模式的双轨构建机制 【免费下载链接】aptos-core Aptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience. 项目地址: htt…

2026/9/19 1:37:26 阅读更多 →
LeetCode 35 搜索插入位置 Search Insert Position 五种解法全剖析:从线性扫描到二分下界(NeetCode 仓库多语言实战)

LeetCode 35 搜索插入位置 Search Insert Position 五种解法全剖析:从线性扫描到二分下界(NeetCode 仓库多语言实战)

LeetCode 35 搜索插入位置 Search Insert Position 五种解法全剖析:从线性扫描到二分下界(NeetCode 仓库多语言实战) 【免费下载链接】leetcode Leetcode solutions 项目地址: https://gitcode.com/GitHub_Trending/leetcode1/leetcode …

2026/9/19 1:37:26 阅读更多 →
图像数据标注规范:从标注类型到质检流程的完整指南

图像数据标注规范:从标注类型到质检流程的完整指南

简介:这份PPT资料聚焦图像数据标注规范,面向数据标注初学者、计算机视觉项目从业者及需要搭建标注流程的团队,帮助解决标注角色分工不清、流程混乱、工具选型困难等问题。资源包共1个pptx文件,约445KB,以幻灯片形式系统…

2026/9/19 1:37:26 阅读更多 →
系统提示词拆解与实战:从泄露合集到工程化编写

系统提示词拆解与实战:从泄露合集到工程化编写

系统提示词泄露(system_prompts_leaks)这类仓库,我第一次刷到的时候以为又是个猎奇合集。翻了半小时之后改了主意。这东西真正的价值不在于"看到别人写了什么",而在于它一次性给了你几十份跑在真实生产环境里的对照组。…

2026/9/19 1:37:26 阅读更多 →
Windows下MariaDB安装避坑指南:路径、服务、密码全解析

Windows下MariaDB安装避坑指南:路径、服务、密码全解析

1. 为什么“看这一篇就够了”不是标题党——Win平台MariaDB安装的真实痛点拆解在Windows上装MariaDB,表面看只是点几下Next,但实际踩过的坑,远比想象中密集。我见过太多人卡在“服务启动失败”“命令行报错‘mariadb’不是内部或外部命令”“…

2026/9/19 1:36:25 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →