• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

【代码库】Basic Matter Ready 连接 HMI 应用程序

09/21 15:27
481
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

ap-basic-matter-ready-connected-hmi-main.zip

共1个文件

Basic Matter Ready 连接 HMI 应用程序

成本优化的 MCU(FreeRTOS)平台,具有 Wi-Fi 4、Thread、低功耗蓝牙 5.0

NXP 的成本优化型 MCU(FreeRTOS)平台使用 i.MX RT1060 MCU、K32W0x MCU 和 88W8801 Wi-Fi SoC,支持通过 Wi-Fi 4、Thread 和低功耗蓝牙 5.0 无线连接协议进行 Matter-ready 边缘节点开发。

主板:EVK-MIMXRT1060

类别:无线连接、HMI、云连接设备、RTOS

外设:显示器、DMA、FLASH、GPIO、I2C、SPI、UART、USB

工具链:GCC

目录

  1. 软件
  2. 硬件
  3. 设置
  4. 建筑
  5. 构建 ot-rcp 二进制文件
  6. 运行 IHD 示例
  7. 使用 OTA 提供程序功能
  8. 使用 Matter CLI 连接到 WiFi 网络
  9. 更改 WiFi 网络
  10. 常见问题解答
  11. 支持
  12. 发行说明
  13. 已知问题

1.软件

该存储库包含运行支持 Matter 的 Connected HMI 应用程序所需的软件,使用 Wi-Fi 4、Thread 和低功耗蓝牙 5.0(称为 BLE)无线连接协议,用于 i.MX RT1060 MCU、K32W0x MCU 和 88W8801 Wi-Fi SoC。

存储库结构

该存储库包含几个与项??目相关的文件夹:

  • basicconnectedhmi_app文件夹,其中包含基本连接 HMI 应用程序所需的项目构建、源和包含文件,以及应用于 Matter 存储库所需的补丁。
  • binaries文件夹,其中包含适用于 Basic Connected HMI 应用程序的预编译二进制文件,这些应用程序分别支持 Thread 模式、Wi-Fi 模式(无需预编译凭据)以及 Thread+Wi-Fi 模式(无需预编译凭据)。更多信息,请参阅 binaries 文件夹中的 binaries_readme.md 文件。
  • 构建文件夹,其中包含指向 Matter 存储库所需的符号链接,以便在 Matter 存储库之上成功构建应用程序。
  • matter文件夹,其中包含 Matter SDK 并作为存储库的子模块指向。

2.硬件

该应用程序需要以下硬件设置:

关于 WiFi 的注意事项:由于 88W8801 模块仅支持 2.4 GHz Wi-Fi 频段,因此必须将其连接到 2.4 GHz 频段的 WiFi 接入点。

LCD 注意事项:本应用程序默认 LCD 模块设置为 RK043FN02H-CT LCD 面板。要使用 RK043FN66HS-CTG LCD 面板,请gn gen在构建系统的命令中添加 display_type="RK043FN66HS-CTG" 。请参阅下文的“设置”章节。

硬件连接

使用连接到 IOTZTB-DK006 载板的 K32W0x1 模块,需要使用跳线在板之间进行以下连接:

| PIN 名称 | DK6 (K32W061) | I.MXRT1060-EVKB | I.MXRT1060-EVK | RT1060 的引脚名称 | RT1060 的 GPIO 名称 | 88W8801引脚 |
| --------------- | ---------------------- | ----------------- | ---------------- | ------------------- | --------------------- | ------------- |
| UART0TXD | PIO(J3),引脚8 | J16,引脚 1 | J22,引脚 1 | LPUART3RXD | GPIOADB107 | -- |
| UART0
RXD | PIO(J3),引脚9 | J16,引脚 2 | J22,引脚 2 | LPUART3TXD | GPIOADB106 | -- |
| UART0RTS | PIO(J3),引脚 6 | J33,引脚 3 | J23,引脚 3 | LPUART3CTS | GPIOADB104 | -- |
| UART0
CTS | PIO(J3),引脚7 | J33,引脚 4 | J23,引脚 4 | LPUART3RTS | GPIOADB105 | -- |
| UART1TXD | PIO(J3),*引脚 10* | J16,引脚 8 | J22,引脚 8 | LPUART2RX | GPIOADB103 | -- |
| UART1
RXD | PIO(J3),引脚 11 | J16,引脚 7 | J22,引脚 7 | LPUART2TX | GPIOADB102 | -- |
| 接地 | J3,引脚 1 | J32,引脚 7 | J25,引脚 7 | 二十 | 二十 | -- |
| 重置 | J3,RSTN | J33,引脚 2 | J23,引脚 2 | GPIOADB111 | GPIOADB111 | -- |
| DIO5/ISP 入口 | PIO(J3),引脚 5 | J33,引脚 1 | J23,引脚 1 | GPIOADB110 | GPIOADB110 | -- |
| K32W0PRIO | PIO(J3),引脚 16 | -- | -- | -- | -- | GPIO2 |
| K32W0
REQ | PIO(J3),引脚 15 | -- | -- | -- | -- | GPIO3 |
| 8801_GRANT | PIO(J3),引脚 14 | -- | -- | -- | -- | GPIO1 |

  • 请检查 K32W0x1 应用程序上 UART1 的实际配置,因为它取决于是否定义了 USART1FTDI。如果定义了 USART1FTDI,则 UART1TXD 将移至引脚 0,UART1RXD 将移至同一 J3 接头上的引脚 1。otrcpblehcibb 应用程序默认定义了 USART1_FTDI。
  • chip_enable_matter_cli=true在 RT 版本中使用 时chip_cli_logs_same_interface=false,应用程序会使用 LPUART2TX 的 GPIOADB102 引脚打印 Matter 日志。您可以使用 FTDI 转 USB 适配器进行验证。如果chip_cli_logs_same_interface设置为 true,则日志将打印在与 CLI 相同的界面上。matterlogs在 CLI 中输入命令可启用/禁用 Matter 日志的打印。

请参阅下图作为电路板之间硬件设置的参考。

DK6_CBX

3. 设置

请按照以下步骤设置环境。如果您在激活 Matter 虚拟环境时遇到问题,请点击此处查看Matter 代码库的相关要求。

此示例假设此 repo 已克隆到您的主目录 (~)。


user@ubuntu: ~/connectivity_toolbox$ git submodule update --init --remote
user@ubuntu: ~/connectivity_toolbox$ cd matter
user@ubuntu: ~/connectivity_toolbox/matter$ source ./scripts/activate.sh
user@ubuntu: ~/connectivity_toolbox/matter$ git submodule update --init --recursive
user@ubuntu: ~/connectivity_toolbox/matter$ cd ..
user@ubuntu: ~/connectivity_toolbox$

设置 RT1060 环境

为了构建 RT1060 的连接工具箱示例,我们建议使用 Linux 发行版(演示应用程序是在 Ubuntu 20.04 上编译的)。

使用 west 工具从 GitHub 下载 NXP MCUXpresso SDK 2.13.0 和相关中间件


user@ubuntu: ~/connectivity_toolbox$ cd matter/third_party/nxp/rt_sdk/repo
user@ubuntu: ~/connectivity_toolbox/matter/third_party/nxp/rt_sdk/repo$ west init -l manifest --mf west.yml
user@ubuntu: ~/connectivity_toolbox/matter/third_party/nxp/rt_sdk/repo$ west update

将补丁应用到下载的 SDK。


user@ubuntu: ~/connectivity_toolbox/matter/third_party/nxp/rt_sdk/repo$ cd ../sdk_fixes
user@ubuntu: ~/connectivity_toolbox/matter/third_party/nxp/rt_sdk/sdk_fixes$ ./patch_rt_sdk.sh
user@ubuntu: ~/connectivity_toolbox/matter/third_party/nxp/rt_sdk/sdk_fixes$ cd ../../../../../basic_connected_hmi_app/

如果您想要更新已下载的 SDK 和/或重新应用 SDK 补丁(这应该在 manifest/west.yml 文件或补丁发生更改时完成),请使用 west for all 命令而不是 west init 来重置 west 工作区,然后再运行 west update 命令并再次应用补丁。


user@ubuntu: ~/connectivity_toolbox/matter/third_party/nxp/rt_sdk/repo$ west forall -c "git reset --hard && git clean -xdf" -a

4. 建筑

命令行

要构建基本连接 HMI 应用程序,请按照以下步骤操作。此应用程序基于 RT1060 全集群应用程序 Matter SDK 示例。


user@ubuntu: ~/connectivity_toolbox$ cd basic_connected_hmi_app

将补丁应用到 Matter 和 RT SDK。


user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ cd patch
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app/patch$ ./patch_rt_app.sh
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ cd ..

构建时有几种可用的配置:

  • RT1060 + K32W0 RCP(仅限螺纹)
  • RT1060 + 88W8801(仅限 WiFi)
  • RT1060 + K32W0 RCP + 88W8801(带/不带 PTA 的线程+WiFi)

仅线程配置

Thread 应用程序嵌入了 K32W0 RCP 二进制文件,该文件将在启动时通过 OTW 进行编程。为了构建映像并嵌入特定的 RCP 版本,用户需要在构建生成器中添加以下内容:k32w0_transceiver_bin_path="/path/to/build_k32w061/ot_rcp_ble_hci_bb_single_uart_fc/bin/ot-rcp-ble-hci-bb-k32w061.elf.bin.h"。否则,构建将使用默认路径,即。这意味着在构建应用程序之前需要重新编译 RCP 二进制文件,这将在下面的“构建 ot-rcp 二进制文件”章节matter/third_party/openthread/ot-nxp/ot_rcp_ble_hci_bb_single_uart_fc/bin/ot-rcp-ble-hci-bb-k32w061.elf.bin.h中描述。

为了方便起见,可以通过添加到构建生成器来使用预编译的二进制文件来构建应用程序k32w0_transceiver_bin_path="/home/<user>/connectivity_toolbox/binaries/k32w0_rcp_app/<BOARD_FORMAT>/<ot_rcp_app>/bin/<ot_rcp_app>.elf.bin.h",其中 可以是 dk6, 可以是 otrcpblehcibbsingleuartfc、otrcpblehcibbsingleuartfcpta、rcponlyuartflowcontrol 或 rcponlyuartflowcontrolpta。

例如:

shell
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ k32w0_transceiver_bin_path=${PWD}/../binaries/k32w0_rcp_app/dk6/ot_rcp_ble_hci_bb_single_uart_fc/bin/ot-rcp-ble-hci-bb-k32w061.elf.bin.h
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ gn gen --args="chip_enable_openthread=true k32w0_transceiver=true k32w0_transceiver_bin_path="${k32w0_transceiver_bin_path}" chip_inet_config_enable_ipv4=false chip_config_network_layer_ble=true hci_spinel_single_uart=true" out/debug
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ ninja -C out/debug

使用显示支持和 ot-rcp 二进制文件的默认路径构建应用程序。

shell
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ gn gen --args="chip_enable_openthread=true k32w0_transceiver=true chip_inet_config_enable_ipv4=false chip_config_network_layer_ble=true hci_spinel_single_uart=true" out/debug
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ ninja -C out/debug

仅 WiFi 配置

为 EVKB-MIMXRT1060 开发板 + 88W8801 构建仅支持 WiFi 的应用程序,并使用 Matter-over-Wifi 配置,并仅在网络调试(不使用 BLE,WiFi 网络凭证在构建时提供,这将使设备在启动时能够加入 Wi-Fi AP)。将 wifissid 和 wifipassword 替换为您的网络配置。

shell
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ export nwk_name=<my_ssid>
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ export nwk_pass=<my_pass>
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ gn gen --args="chip_enable_wifi=true w8801_transceiver=true chip_config_network_layer_ble=false wifi_ssid="${nwk_name}" wifi_password="${nwk_pass}"" out/debug
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ ninja -C out/debug

线程和 WiFi 配置

以下构建命令适用于线程和 WiFi 配置。请注意,wifi_enable_pta该参数需要与 88W8801 和 K32W0x1 IOTZTB-DK006 之间的硬件连接一起使用,以启用 PTA。

shell
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ export nwk_name=<my_ssid>
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ export nwk_pass=<my_pass>
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ k32w0_transceiver_bin_path=${PWD}/../binaries/k32w0_rcp_app/dk6/ot_rcp_ble_hci_bb_single_uart_fc_pta/bin/ot-rcp-ble-hci-bb-k32w061.elf.bin.h
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ gn gen --args="chip_enable_openthread=true k32w0_transceiver=true k32w0_transceiver_bin_path="${k32w0_transceiver_bin_path}" chip_inet_config_enable_ipv4=false chip_config_network_layer_ble=true hci_spinel_single_uart=true chip_enable_wifi=true w8801_transceiver=true wifi_ssid="${nwk_name}" wifi_password="${nwk_pass}" wifi_enable_pta=true" out/debug
user@ubuntu: ~/connectivity_toolbox/basic_connected_hmi_app$ ninja -C out/debug

请参阅下图作为 PTA 硬件支持的参考。

8801<em>K32W0</em>PTA

注意:为了在 EVKA 板上构建和运行,请添加evkname="evkmimxrt1060"gn gen 命令。

5. 构建 ot-rcp 二进制文件

构建支持或不支持 BLE 的 ot-rcp 的代码库位于 matter/third_party/openthread/ot-nxp 文件夹中。预编译的二进制文件位于 binaries 文件夹中。签名 K32W061 二进制文件的先决条件包括以下几个 Python 软件包:

shell
user@ubuntu: ~/connectivity_toolbox$ sudo apt-get install python3-pip
user@ubuntu: ~/connectivity_toolbox$ pip3 install pycrypto
user@ubuntu: ~/connectivity_toolbox$ pip3 install pycryptodome

适用于 K32W061 的 2.6.11 SDK 位于 repo 的根目录中,并支持 DK6 板。

例如,使用此 SDK,用户可以按照以下步骤编译 DK6 板的二进制文件:

shell
user@ubuntu: ~/connectivity_toolbox$ cd matter/third_party/openthread/ot-nxp
user@ubuntu: ~/connectivity_toolbox/matter/third_party/openthread/ot-nxp$ export NXP_K32W0_SDK_ROOT=~/connectivity_toolbox/SDK_2_6_11_K32W061DK6
user@ubuntu: ~/connectivity_toolbox/matter/third_party/openthread/ot-nxp$ ./script/build_k32w061

构建的输出可以在 buildk32w061 文件夹中找到。仅 OT 的 RCP 可以在 rcponlyuartflowcontrol/bin 文件夹中找到,而 OT+BLE 的 RCP 可以在 otrcpblehcibbsingleuartfc/bin 文件夹中找到。

6. 运行 IHD 示例

对于此设置,您将需要一个 OpenThread 边界路由器、一个运行 Chip-Tool 的控制器设备和两个刷写有基于 OnOff 集群的任何应用程序的电路板(例如,Ligthing App、All-clusters app、Plug-app 等)。

在此示例中,您将两个基于开/关的 Matter 端节点绑定到 IHD 并控制它们以及实时显示它们的状态。

由于此代码版本中绑定设备的一些识别参数是硬编码的,我们建议与light-switch-combo应用程序一起使用以确保没有问题(根据设备集群配置,订阅和开/关命令可能无法工作)

首先绑定两个端节点和IHD:

注意: IHD 目前仅支持 Matter over Thread,因此它将被视为线程端节点

对于线程节点使用此命令:

shell
user@ubuntu: $ chip-tool pairing ble-thread <Device_NodeID> hex:<OT_dataset_hex_string> 20202021 3840

注意:可以使用以下命令获取 OT 数据集:

shell
user@ubuntu: $ ot-ctl dataset active -x

对于 WiFi 节点使用此命令:

shell
user@ubuntu: $ chip-tool pairing onnetwork <Device_NodeID> 20202021 3840

或者,如果您在同一网络上同时有多个设备处于配对模式,请使用此命令指定设备的 IPv6 地址

shell
user@ubuntu: $ chip-tool pairing ethernet <Device_NodeID> 20202021 3840 <Device_Global_IPV6_addr> <Device_Remote_Port>

添加所有设备后,您将需要执行绑定序列:

在两个端节点上为 IHD 写入 ACL 表条目:

```shell
user@ubuntu: $ chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null },{"fabricIndex": 2, "privilege": 3, "authMode": 2, "subjects": [], "targets": null }]' 0

user@ubuntu: $ chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null },{"fabricIndex": 2, "privilege": 3, "authMode": 2, "subjects": [], "targets": null }]' 0
```

在 IHD 上写入两个绑定条目,每个端节点一个:

shell
user@ubuntu: $ chip-tool binding write binding '[{"node" : <First_Device_NodeID> , "cluster" : "0x0006" , "endpoint" : <LightNode_Endpoint> }, { "node" : <Second_Device_NodeID> , "cluster" : "0x0006" , "endpoint" : <LightNode_Endpoint>}]' <IHD_NodeID> 1

LightNode_Endpoint 是配置为“开/关”灯设备类型的设备端点,也是需要在绑定命令中引用的端点。通常,“开/关”灯的端点为 1,但如果您不确定设备上哪个是灯端点,请运行以下命令,该命令将显示与终端节点每个端点关联的所有设备类型:

shell
user@ubuntu: $ chip-tool descriptor read device-type-list <Device_NodeID> 0xFFFF

该命令将打印如下输出:

```shell
Endpoint: 0 Cluster: 0x0000001D Attribute 0x00000000 DataVersion: 2427881537

DeviceTypeList: 1 entries

 [1]: {

   Type: 22

   Revision: 1

  }

Endpoint: 1 Cluster: 0x0000001D Attribute 0x00000000 DataVersion: 1727396012

DeviceTypeList: 1 entries

 [1]: {

   Type: 256

   Revision: 1

  }

```

这里,端点 1 上的设备类型为 256,对应于十六进制值 0x0100,根据 Matter 文档,它是开/关灯设备类型。

收到该命令后,IHD 将自动开始绑定过程。

将设备绑定到 IHD 后,您可以使用 LIGHT 1 和 LIGHT 2 按钮来控制设备并实时显示其开/关状态:

  • 按下任何按钮都会向特定设备发送切换命令
  • 第一次按下每个按钮将向特定设备发送附加订阅命令

7. 使用 OTA 提供程序功能

OTA 提供程序功能需要结合使用 K32W0x1 终端设备节点通过 Thread 接口作为 OTA 请求器来使用。通过 Matter 发送的 OTA 镜像是针对该 OTA 请求器终端设备的。这意味着,作为先决条件,用户需要与这些设备建立 Matter 网络,并准备好用于 OTA 更新的二进制文件。

生成的终端节点 OTA 镜像需要在构建时集成到 RT1060 Matter 应用程序中,方法是覆盖../matter/examples/all-clusters-app/nxp/common/ota_provider/include文件夹中的 ota-fw-placeholder.bin.h 文件。然后,用户需要enable_ota_provider=true在构建 RT1060 应用程序之前将其添加到构建生成器命令中。

在发送实际命令启动 OTA 过程之前,还需要配置 OTA 提供商和终端节点。

有关拓扑和上述所需命令的更多详细信息,请参阅READMEOTAProvider

为方便起见,binaries/k32w0lightingapp 文件夹中提供了 K32W0x1 DK6 开发板上照明应用程序的预编译二进制文件。K32W0LightingappReadme 文件中介绍了如何将二进制文件烧录到 K32W0x1DK6 开发板上。K32W0x1独立应用程序还需要一个 SSBL,该 SSBL 位于 K32W0x1 SDK 的文件夹中boards/k32w0x1dk6/wireless_examples/framework/ssbl/binaryssbl_ext_flash_pdm_support.bin为了将这些二进制文件烧录到开发板上,用户需要使用 K32W0x1 SDK 中包含的 DK6Programmer 工具。更多信息,请参阅K32W0OTA_section。

用户需要从末尾标有 42020 的 K32W0x1 二进制文件开始,启动并调试 K32W0x1DK6 开发板到 Matter 结构。如需在基本连接应用程序上执行 OTA 提供程序功能(详见 READMEOTAProvider),用户需要使用末尾标有 42021 的 K32W0x1 二进制文件。这些数字是 K32W0x1 固件的版本号,如果使用具有相同版本号的二进制文件进行 OTA 操作,则过程将失败。

8. 使用 Matter CLI 连接到 WiFi 网络

您可以使用 Matter CLI 或在构建时提供网络凭证来连接到 WiFi 网络。后者在章节 中进行了介绍Building。请注意,如果在构建时提供了网络凭证,则无论 Matter CLI 是否可用,开发板都会自动连接到指定的网络。要使用 Matter CLI 连接到 WiFi 网络,请执行以下操作:

?步骤 1:?启用 Matter CLI 功能。chip_enable_matter_cli=true在构建 RT1060 应用程序之前,将其添加到构建生成器命令中。

?步骤 2:?扫描可用的 WiFi 网络。wifiscan在 Matter CLI 中运行以下命令。此步骤为可选步骤。

```shell

wifiscan
```

步骤 3:wifiadd使用可用的 Matter CLI 中的命令提供网络凭证。

```

wifiadd ```

?步骤 4:?使用 Matter CLI 中的命令开始连接 WiFi 网络wificonnect。分配给开发板的 IPv4 和 IPv6 地址将显示在调试控制台中。

```shell

wificonnect
```

步骤 5:wifistatus通过在 Matter CLI 中运行命令来检查连接状态。

```shell

wifistatus
```

9. 更改 WiFi 网络

仅当启用 Matter CLI 时才可以更改 WiFi 网络。请使用此chip_enable_matter_cli=true选项启用 CLI。要连接到其他 WiFi 网络:

步骤 1:wifidisconnect使用Matter CLI 中的命令断开当前网络。

```shell

wifidisconnect
```

第 2 步:wifiremove使用Matter CLI 中的命令删除网络。

```shell

wifiremove
```

步骤 3:wifiadd使用Matter CLI 中的命令添加您要连接的网络的凭据。

```shell

wifiadd ```

步骤 4:wificonnect使用Matter CLI 中的命令连接到新添加的 WiFi 网络。

```shell

wificonnect
```

步骤 5:wifistatus通过在 Matter CLI 中运行命令来检查连接状态。

```shell

wifistatus
```

注意:删除当前的 WiFi 网络并重置主板,将导致站点自动连接到构建时设置的网络。*

10. 常见问题解答

11. 支持

项目元数据

董事会徽章

类别徽章 类别徽章 类别徽章 类别徽章

周边徽章 周边徽章 周边徽章 周边徽章 周边徽章 周边徽章 周边徽章 周边徽章

工具链徽章

来源:恩智浦appcodehub

  • ap-basic-matter-ready-connected-hmi-main.zip
    下载
恩智浦

恩智浦

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。收起

查看更多

相关推荐