一、前言
Matter(当时称为 Project Connected Home over IP 或 Project CHIP)于2019年12月11日首次宣布。当时,它是由苹果、谷歌、亚马逊和联发科技等公司共同发起的一个项目,目的是创建一个开放标准,提高智能家居设备之间的互操作性。在2021年,该项目更名为 "Matter",同时宣布了首个 Matter 1.0 版本的发布,这标志着 Matter 开始为开发者和制造商提供稳定的规范,以便构建和推出兼容的智能家居设备。
本篇采用 nordic 的 nrf-connect-sdk v2.5.0,matter 标准1.1.0,体验 Matter over Thread 开发。
二、先决条件
- 带蓝牙的 Ubuntu 22.04 PC 环境。(用作 Matter Controller 控制 MAD 和 开发编译环境)
- 支持 IPV6 的路由器。(WiFi Access Point,因为matter基于IPV6,所以路由器必须具备IPV6地址分配的能力(DHCPV6或者可以分配地址前缀信息),否则matter运行过程中mDNS会报错)
- Raspberry Pi 5 + nrf52840dongle。(用作 Open Thread Border Router - OTBR)
- nrf5340 dk。(作为 Matter Accessory Device - MAD)
本文基于 Matter over Thread 的网络:
三、配置环境
Tip:下载相关操作需要梯子。
1.安装 nrf-connect-sdk,构建编译环境。
方式一:使用 vscode 编译与下载(推荐),使用 vscode 的 nrf connect sdk 扩展去下载 toolchain 和 sdk 即可。
方式二:使用 命令行 编译与下载。
方式三:使用 SEGGER Embedded Studio(SES) 编译与下载。
2. 构建 MAD。编译 Matter light hulb 示例。
配置文件选择 prj_no_dfu.conf,不需要烧录 bootloader,其他需要先编译并烧录bootloader。
3. 构建 OTBR 和 编译 coprocessor 示例。
- OTBR 需要 radvd 服务,来进行IPV6无状态自动配置。
sudo apt update
sudo apt install radvd
- 创建
/etc/radvd.conf
,例如:其中 wlan0 为网卡名称,根据实际情况修改,运行ifconfig
查看网卡名称。
interface wlan0 {
AdvManagedFlag on;
AdvSendAdvert on;
MinRtrAdvInterval 30;
MaxRtrAdvInterval 60;
prefix fd11:33::1/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};
- 重启 rvdvd 服务
sudo systemctl restart radvd
- 登录 Raspberry Pi 并从 GitHub 克隆 ot-br-posix:
git clone https://github.com/openthread/ot-br-posix.git --depth 1
- OTBR 可在线程接口和基础架构网络接口(例如 Wi-Fi/以太网)上使用,通过 INFRA_IF_NAME 指定。Thread 接口默认由 OTBR 创建,名为 wlan0。如果未明确指定 INFRA_IF_NAME,则基础架构接口的默认值为 wlan0。
cd ot-br-posix
./script/bootstrap
INFRA_IF_NAME=wlan0 ./script/setup
- 检查 OTBR 是否已成功安装:
$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago
Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2)
Main PID: 2444 (code=exited, status=2)
对树莓派 sudo reboot 重启更改生效
- 对 nrf52840dongle 编译 RCP:
west build -p always -b nrf52840dongle_nrf52840 nrf/samples/openthread/coprocessor/
打包:
nrfutil pkg generate --hw-version 52 --sd-req=0x00 \
--application build/zephyr/zephyr.hex --application-version 1 build/zephyr/zephyr.zip
烧录:
nrfutil dfu usb-serial -pkg build/zephyr/zephyr.zip -p /dev/ttyACM0
- 插入 RCP 到 Raspberry Pi,编辑文件
/etc/default/otbr-agent
,改变tty端口和主干接口波特率。
OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyUSB0?uart-baudrate=100000"
- 启动 otbr-agent 服务。
sudo systemctl start otbr-agent.service
4. 编译 CHIP Tool(POSIX chip-tool CLI)。
使用官方的最新 chip 项目:
git clone https://github.com/project-chip/connectedhomeip.git
cd connectedhomeip
git submodule update -f --init --recursive
./scripts/examples/gn_build_example.sh examples/chip-tool BUILD_PATH
other:Android chip tool;IOS chiptool。
四、测试设备
1. 配置和启动 OpenThread(OT)网络,在 raspberry pi 终端下执行。
sudo ot-ctl dataset init new
sudo ot-ctl dataset networkkey 00112233445566778899aabbccddeeff
sudo ot-ctl dataset extpanid 1111111122222222
sudo ot-ctl dataset panid 0x1234
sudo ot-ctl dataset channel 15
sudo ot-ctl dataset commit active
sudo ot-ctl ifconfig up
sudo ot-ctl thread start
- 初始化一个新的 OpenThread 数据集。
- 设置网络密钥(Network Key)为给定的值。这是用于保障网络安全性的密钥。
- 设置扩展PAN ID(Extended PAN ID)为给定的值。这是网络的唯一标识符。
- 设置PAN ID为给定的值。这是一个短地址,用于在同一网络中唯一标识设备。
- 设置网络通信的频道为给定的值。在 IEEE 802.15.4 网络中,通信频道的选择对于网络的性能和干扰有影响。
- 提交对数据集的更改,并激活新的数据集。这将应用上述设置。
- 启动 OpenThread 接口,准备进行通信。
- 启动 OpenThread 线程栈,使设备成为网络的一部分。
2. 使用 POSIX chip-tool CLI 来配置配对 Matter Light 设备。
Matter Light 等待配对状态下 LED1 慢闪,配对中快闪,配对后常亮(nrf5340dk 按住 button1 3s 以上恢复出厂设置)。执行编译出来的 chip-tool 应用如下命令进行配对:
sudo ./chip-tool pairing ble-thread 1234 hex:0e08000000000001000035060004001fffe00708fd9e914e6def9df2030f4f70656e5468726561642d323361350410542ccde31a710d5b17af34e12fec0f140c0402a0f7f8051000112233445566778899aabbccddeeff0208111111112222222201021234000300000f 20202021 3840
$ ./chip-tool pairing ble-thread <node_id> hex:<operational_dataset> <pin_code> <discriminator>
pairing ble-thread
: 指定使用 BLE Thread 进行配对。<node_id>
: 设备的节点ID。这是设备在网络中的唯一标识符。hex:<operational_dataset>
: 操作数据集(Operational Dataset)的十六进制表示。这是设备的操作参数,用于配置设备的网络连接等信息。<pin_code>
: PIN码。这是一种简单的配对方法,用户可以输入此代码来验证设备。<discriminator>
: 辨识码。用于在设备之间进行配对时进行标识的参数。
node_id 自定义为 1234。 operational_dataset 获取在 raspberry pi 终端中执行:
sudo ot-ctl dataset active -x
得到
0e08000000000001000035060004001fffe00708fd9e914e6def9df2030f4f70656e5468726561642d323361350410542ccde31a710d5b17af34e12fec0f140c0402a0f7f8051000112233445566778899aabbccddeeff0208111111112222222201021234000300000f
Done
pin_code、
discriminator 在 Matter Light 启动时
可以在设备的日志终端(例如UART)中找到,当前 pin_code
:20202021,discriminator:
3840。
I: 658 [DL]Device Configuration:
I: 662 [DL] Serial Number: 11223344556677889900
I: 666 [DL] Vendor Id: 65521 (0xFFF1)
I: 670 [DL] Product Id: 32773 (0x8005)
I: 673 [DL] Product Name: not-specified
I: 677 [DL] Hardware Version: 0
I: 681 [DL] Setup Pin Code (0 for UNKNOWN/ERROR): 20202021
I: 687 [DL] Setup Discriminator (0xFFFF for UNKNOWN/ERROR): 3840 (0xF00)
I: 694 [DL] Manufacturing Date: (not set)
I: 698 [DL] Device Type: 65535 (0xFFFF)
3. 使用 POSIX chip-tool CLI 发送 ZCL 消息来控制 Matter Light 设备。
- 使用以下命令模式切换 OnOff 属性状态(例如通过 LED 状态可视化):
$ ./chip-tool onoff toggle <node_id> <endpoint_id>
<node_id>为委托节点的用户自定义ID。
<endpoint_id>是已实现 OnOff 集群的端点的 ID。
- 使用以下命令模式更改 CurrentLevel 属性的值(例如,通过 LED 亮度进行可视化):
$ ./chip-tool levelcontrol move-to-level <level> <transition_time> <option_mask> <option_override> <node_id> <endpoint_id>
<level>
0
是在和之间编码的亮度级别254
,除非在集群中配置了自定义范围。<transition_time>是过渡时间。
<option_mask>是选项掩码。
<option_override>是选项覆盖。
<node_id>为委托节点的用户自定义ID。
<endpoint_id>是实现了 LevelControl 集群的端点的 ID。
exmple:
翻转LED2:
sudo ./chip-tool onoff toggle 1234 1
LED2 亮度 18,过渡时间 3s:
sudo ./chip-tool levelcontrol move-to-level 18 3 0 0 1234 1
相关参考
- Matter over Thread: Configuring Border Router and Linux/macOS controller on separate devices
- Thread tools
- 线程边界路由器 - 双向 IPv6 连接和基于 DNS 的服务发现
- Working with the CHIP Tool