开始使用基于 IP 的智能互联家居 (CHIP)

1. 简介

Matter 是连接标准联盟(原名为“Zigbee 联盟”)推出的一项新标准。这一业界统一标准是确保连接可靠安全的前提,是设备在现在和未来都能无缝协同工作的有力保障

此标准的目标是简化制造商的开发工作并针对消费者提升产品兼容性。目前,对 Matter 的开发工作正在 GitHub 上的基于 IP 的智能互联家居项目中积极开展,该项目围绕一个共同信念展开,即:智能家居设备应能安全、可靠和顺畅地使用。该项目以互联网协议 (IP) 为基础,旨在让智能家居设备、移动应用和云服务之间能够通信,以及为设备认证定义一组特定的基于 IP 的网络技术。

此 Codelab 的内容已获得以下许可(除非另有说明)

Apache 2.0 许可。如需了解详情,请参阅 CHIP 项目开源许可

此 Codelab 会引导你使用 ESP32 开发板设置 Wi-Fi 设备、为其添加开启/关闭功能,以及通过命令行界面对其进行控制。

学习内容

  • 如何连接和控制支持 CHIP 的设备。
  • 如何向示例设备应用添加更多功能。

所需条件

  • Linux 基础知识
  • ESP32 开发板
  • 一部已安装“git”的 Linux 机器

2. 预备知识

串行端口终端

你应熟悉如何通过终端连接到串行端口。此 Codelab 使用 screen 并提供使用情况概览,但你也可以使用其他终端软件。

Linux 机器

此 Codelab 旨在使用基于 x86 的 64 位 Linux 机器来执行芯片工具,并刷写所有开发板。所有步骤已在 Ubuntu 20.04.2.0 LTS 上进行了测试。

ESP32 开发板

此 Codelab 使用以下其中一个 ESP32 开发板:

  • ESP32-DevkitC
  • ESP32-WROVER-KIT V4.1
  • M5Stack ESP32 系列基本核心 IoT 开发套件

你需要使用 USB 线将开发套件连接至 Linux 机器,以刷写固件并访问设备日志。

3. 克隆代码库

如需查看与本文档兼容的源代码版本,请按照以下步骤克隆代码库:

$ git clone git@github.com:project-chip/connectedhomeip.git
$ cd connectedhomeip
$ git checkout 1de2b73bb4123af5f184eac54d1b1d76985b4f62
$ git submodule update --init

然后,按照 GitHub 上“Build Documentation”(构建文档)的“Prerequisites”(前提条件)部分和“Build Preparation”(构建准备)部分中适合你平台的步骤操作。完成后,请继续阅读下文。

为 Codelab 应用补丁

借助此补丁,我们将移除用于处理来自 CHIP 的开启/关闭命令的回调。稍后,我们将引导你完成上述操作,然后逐步重新添加回调。

$ git fetch origin ce1e0ab44c367bc9d5907115e09a4c45fc6d8c96
$ git cherry-pick ce1e0ab44c367bc9d5907115e09a4c45fc6d8c96

4. 构建 CHIP 客户端示例

为了从宿主机与 CHIP 设备通信,你需要为主机构建 chip-tool

按照 GitHub 上的说明构建 chip-tool

拥有 chip-tool 后,你可以使用它执行一些操作,例如将设备端点切换至开启和关闭状态。

如需详细了解不同 chip-tool 的操作,请参阅 chip-toolGitHub 上的文档和源代码

5. 构建所有集群示例

设置主机并构建 chip-tool 后,你可以为 ESP32 构建并运行所有集群示例。

首先,切换到所有集群示例目录。

$ cd examples/all-clusters-app/esp32

然后,按照 GitHub 上的说明进行操作,直到系统指示你运行以下命令:

$ idf make menuconfig

运行此命令时,你会看到示例的配置编辑器。

配置开发板类型

依次转到 DemoDevice Type,然后选择构建所针对的开发板。

35343b20891ccdfd.png

停用 Rendezvous 模式

停用 Rendezvous 模式让设备可通过不安全的信道与 chip-tool 通信。在配置菜单中,依次转到 DemoRendezvous Mode,然后将该模式设置为 Bypass

9db9116fda290c03.png

配置 Wi-Fi SSID 和密码

在配置菜单中,依次转到 Component configCHIP Device LayerWiFi Station Options,为你的 Wi-Fi 网络设置以下两个选项:

  • 默认 Wi-Fi SSID
  • 默认 Wi-Fi 密码

60b3fe446c502711.png

构建和刷写

完成这些配置设置后,构建并刷写示例应用。

将下面的“USB0”替换为开发板所关联的 TTY 设备。如果你的宿主机上插入了多个串行线,则该宿主机可能拥有一个不同的 TTY(例如 /dev/ttyUSB1/dev/ttyUSB2)。请继续在本文档中显示 USB0 的其他位置进行上述替换。

$ idf make
$ idf make erase_flash ESPPORT=/dev/ttyUSB0
$ idf make flash ESPPORT=/dev/ttyUSB0

上述步骤也在 CHIP 所有集群示例自述文件中提供。

6. 启用 OnOff 命令

在任意编辑器中打开位于 examples/all-clusters-app/esp32/mainDeviceCallbacks.cpp。在编辑器中打开后,前往“DeviceCallbacks::PostAttributeChangeCallback()”函数。

chip-tool 发送 on-off 命令时,设备应收到 ZCL_ON_OFF_CLUSTER_ID 事件。为了处理这些事件,我们需要将其添加到处理不同 clusterID 的事件回调中。

void DeviceCallbacks::PostAttributeChangeCallback(...)
{
    ...

    switch (clusterId)
    {
    case ZCL_ON_OFF_CLUSTER_ID:
        break;

    default:
        ESP_LOGI(TAG, "Unhandled cluster ID: %d", clusterId);
        break;
    }
    ...
}

每个集群都支持许多属性。我们想要支持简单的开启和关闭功能。因此,请检查代码中 ZCL_ON_OFF_ATTRIBUTE_IDattributeId。它应该为空。

void DeviceCallbacks::PostAttributeChangeCallback(...)
{
    ...

    switch (clusterId)
    {
    case ZCL_ON_OFF_CLUSTER_ID:
        if (attributeId == ZCL_ON_OFF_ATTRIBUTE_ID) {

        } else {
          ESP_LOGI(TAG, "Unhandled attribute ID: %d", attributeId);
        }
        break;

    default:
        ESP_LOGI(TAG, "Unhandled cluster ID: %d", clusterId);
        break;
    }

    ...
}

如果 clusterIdattributeId 正确,则添加函数调用来控制开发套件上 LED 的状态。

void DeviceCallbacks::PostAttributeChangeCallback(...)
{
    ...

    switch (clusterId)
    {
    case ZCL_ON_OFF_CLUSTER_ID:
        if (attributeId == ZCL_ON_OFF_ATTRIBUTE_ID) {
          statusLED1.Set(*value);
        } else {
          ESP_LOGI(TAG, "Unhandled attribute ID: %d", attributeId);
        }
        break;

    default:
        ESP_LOGI(TAG, "Unhandled cluster ID: %d", clusterId);
        break;
    }

    ...
}

保存文件,然后按照上一步构建和刷写中所述的相同流程,重新构建应用并刷写开发套件:

$ idf make
$ idf make erase_flash ESPPORT=/dev/ttyUSB0
$ idf make flash ESPPORT=/dev/ttyUSB0

7. 运行示例应用

将 ESP32 开发板的 USB 线连接到宿主机,并启动串行终端。screen 是一个实用的程序,你可以运行以下命令来查看 ESP32 的串行输出:

$ screen /dev/ttyUSB0 115200

设备启动并连接至 Wi-Fi 后,会在串行控制台中显示其 IP 地址。你需要该地址才能通过 chip-tool 与设备通信。

b8b3b97d230997e0.png

在上述情况中,IP 地址为 192.168.117.134,设备监听的是端口 11097。

使用此 IP 地址和端口,绕过配对步骤与设备建立连接:

$ cd examples/chip-tool
$ ./out/debug/chip-tool pairing bypass 192.168.117.134 11097

现在,你可以使用以下命令切换端点 1:

$ ./out/debug/chip-tool onoff toggle 1

在 ESP32 DevKitC 上,这将切换 GPIO2 上的信号:

2bc30b2e82b22153.png

在上图中,1.8V/20mA 红色 LED 被连接到 GPIO2,并串联 75 欧姆电阻。

在 ESP32-WROVER-KIT 上,运行上述命令后,显示屏左上角会开启/关闭虚拟绿色 LED:

8f9ab6a82f525248.png

在 M5Stack 开发板上,运行上述命令后,显示屏左上角会开启/关闭虚拟绿色 LED:

8067715c8175fee9.png

8. 恭喜

你已成功使用 CHIP 控制了开发套件。非常棒!

在此 Codelab 中,你学习了如何:

  • 在开发套件上启用 OnOff 功能。
  • 通过 CHIP 控制器工具控制开发套件。

深入学习

你可以采取以下建议做法,以进行更深入的探索:

  • 修改 ZAP 文件,以扩展相应功能的效力。
  • 将 ZCL_IDENTIFY_CLUSTER_ID 功能加入 DeviceCallbacks.cpp 文件
  • 参阅 ZigBee 集群库的定义规范。
  • 访问 GitHub 以了解 CHIP 项目的最新动态;访问 buildwithmatter.com 以了解 Matter 的最新动态。