Matter环境搭建
获取Matter仓库
拉取Matter Github:
# 拉取仓库
mkdir -p ~/workspace
cd ~/workspace
git clone --depth 1 -b v1.3.0.0 https://github.com/project-chip/connectedhomeip.git
# 更新子模块
cd ~/workspace/connectedhomeip
git submodule update --init --depth 1
注意:更新子模块可能由于网络原因导致失败,可以重复执行更新子模块命令
获取先决条件
在基于 Debian 的 Linux 发行版(例如 Ubuntu)上,可以使用以下命令满足这些依赖关系:
sudo apt update
sudo apt install git gcc g++ pkg-config libssl-dev libdbus-1-dev \
libglib2.0-dev libavahi-client-dev ninja-build python3-venv python3-dev \
python3-pip unzip libgirepository1.0-dev libcairo2-dev libreadline-dev \
default-jre
注意:如果主机上已经具备依赖包,那么只做检查不会再下载
激活Matter环境
在运行任何其他构建命令之前,scripts/activate.sh
应在顶层获取环境设置脚本。此脚本负责下载 GN、ninja 以及设置用于构建和测试的库的 Python 环境。
执行如下命令:
pi@pi-NMH-WCX9:~/workspace/connectedhomeip$ source scripts/activate.sh
WELCOME TO...
█
█
▄ █ ▄ █ █
▀▀█████▀▀ ▄▀▀▀▄ ▄▀▀▀▄ ▄▀▀▀▀▄█ ▀▀█▀▀▀▀▀█▀▀ ▄▀▀▀▀▄ ▄▀▀
▀█▄ ▄█▀ █ █ █ █ █ █ █ █▄▄▄▄▄▄█ █
▀█▄ ▄█▀ █ █ █ █ █ █ █ █ █
▄██▀▀█ █▀▀██▄ █ █ █ ▀▄▄▄▄▀█ ▀▄▄ ▀▄▄ ▀▄▄▄▄▀ █
▀▀ █ █ ▀▀
BOOTSTRAP! Bootstrap may take a few minutes; please be patient.
Downloading and installing packages into local source directory:
Setting up CIPD package manager...done (10m31.9s)
Setting up Project actions........skipped (0.1s)
Setting up Python environment.....done (1m18.2s)
Setting up pw packages............skipped (0.1s)
Setting up Host tools.............done (0.1s)
Activating environment (setting environment variables):
Setting environment variables for CIPD package manager...done
Setting environment variables for Project actions........skipped
Setting environment variables for Python environment.....done
Setting environment variables for pw packages............skipped
Setting environment variables for Host tools.............done
Checking the environment:
20250113 21:56:41 INF Environment passes all checks!
Environment looks good, you are ready to go!
To reactivate this environment in the future, run this in your
terminal:
source ./activate.sh
To deactivate this environment, run this:
deactivate
Installing pip requirements for all...
[notice] A new release of pip is available: 23.2.1 -> 24.3.1
[notice] To update, run: pip install --upgrade pip
注意:Setting up CIPD package manager 过程可能会有点长
构建库
更新 Matter 子模块后,只拉取了源代码和构建脚本,还需要构建(编译)源代码获取库文件(*.o):
cd ~/workspace/connectedhomeip
source scripts/activate.sh
gn gen out/host
ninja -C out/host
注意:目录名称out/host
可以是任何目录,但通常在out
目录内构建。此示例使用host
来强调为主机系统构建。不同的构建目录可用于不同的配置,也可以使用单个目录并根据需要通过 重新配置。
这里执行 ninja -C out/host
出错了,报错如下:
pi@pi-NMH-WCX9:~/workspace/connectedhomeip$ ninja -C out/host
ninja: Entering directory `out/host'
ninja: error: '../../third_party/nlunit-test/repo/src/nlunit-test.c', needed by 'obj/third_party/nlunit-test/repo/src/libnlunit-test.nlunit-test.c.o', missing and no known rule to make it
在浏览器上找到解决方法,先不管上面的报错,接着编译 chip-tool
:
pi@pi-NMH-WCX9:~/workspace/connectedhomeip$ ./scripts/examples/gn_build_example.sh examples/chip-tool/ out/standalone
WELCOME TO...
█
█
▄ █ ▄ █ █
▀▀█████▀▀ ▄▀▀▀▄ ▄▀▀▀▄ ▄▀▀▀▀▄█ ▀▀█▀▀▀▀▀█▀▀ ▄▀▀▀▀▄ ▄▀▀
▀█▄ ▄█▀ █ █ █ █ █ █ █ █▄▄▄▄▄▄█ █
▀█▄ ▄█▀ █ █ █ █ █ █ █ █ █
▄██▀▀█ █▀▀██▄ █ █ █ ▀▄▄▄▄▀█ ▀▄▄ ▀▄▄ ▀▄▄▄▄▀ █
▀▀ █ █ ▀▀
ACTIVATOR! This sets your shell environment variables.
Activating environment (setting environment variables):
Setting environment variables for CIPD package manager...done
Setting environment variables for Project actions........skipped
Setting environment variables for Python environment.....done
Setting environment variables for pw packages............skipped
Setting environment variables for Host tools.............done
Checking the environment:
20250114 09:48:44 INF Environment passes all checks!
Environment looks good, you are ready to go!
+ env
SHELL=/bin/bash
SESSION_MANAGER=local/pi-NMH-WCX9:@/tmp/.ICE-unix/2273,unix/pi-NMH-WCX9:/tmp/.ICE-unix/2273
QT_ACCESSIBILITY=1
COLORTERM=truecolor
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
SSH_AGENT_LAUNCHER=gnome-keyring
XDG_MENU_PREFIX=gnome-
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GTK_IM_MODULE=fcitx
LC_ADDRESS=zh_CN.UTF-8
GNOME_SHELL_SESSION_MODE=ubuntu
LC_NAME=zh_CN.UTF-8
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
PW_PROJECT_ROOT=/home/pi/workspace/connectedhomeip
XMODIFIERS=@im=fcitx
DESKTOP_SESSION=ubuntu
LC_MONETARY=zh_CN.UTF-8
PW_ZAP_CIPD_INSTALL_DIR=/home/pi/workspace/connectedhomeip/.environment/cipd/packages/zap
GTK_MODULES=gail:atk-bridge
PWD=/home/pi/workspace/connectedhomeip
XDG_SESSION_DESKTOP=ubuntu
LOGNAME=pi
XDG_SESSION_TYPE=wayland
SYSTEMD_EXEC_PID=7931
XAUTHORITY=/run/user/1000/.mutter-Xwaylandauth.TRLA02
CIPD_CACHE_DIR=/home/pi/.cipd-cache-dir
PW_ROOT=/home/pi/workspace/connectedhomeip/third_party/pigweed/repo
HOME=/home/pi
USERNAME=pi
IM_CONFIG_PHASE=1
LANG=en_US.UTF-8
LC_PAPER=zh_CN.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
XDG_CURRENT_DESKTOP=ubuntu:GNOME
VIRTUAL_ENV=/home/pi/workspace/connectedhomeip/.environment/pigweed-venv
VTE_VERSION=6800
WAYLAND_DISPLAY=wayland-0
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/8306e5c5_9b0b_4d97_8ed7_7d8e3d900e7b
PW_PYTHON_CIPD_INSTALL_DIR=/home/pi/workspace/connectedhomeip/.environment/cipd/packages/python
CLUTTER_IM_MODULE=fcitx
_PW_ROSETTA=0
GNOME_SETUP_DISPLAY=:1
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
LC_IDENTIFICATION=zh_CN.UTF-8
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=pi
GNOME_TERMINAL_SERVICE=:1.157
DISPLAY=:0
SHLVL=2
LC_TELEPHONE=zh_CN.UTF-8
QT_IM_MODULE=fcitx
PW_PACKAGE_ROOT=/home/pi/workspace/connectedhomeip/.environment/packages
LC_MEASUREMENT=zh_CN.UTF-8
_PW_ENVIRONMENT_CONFIG_FILE=/home/pi/workspace/connectedhomeip/scripts/setup/environment.json
XDG_RUNTIME_DIR=/run/user/1000
PW_BRANDING_BANNER=/home/pi/workspace/connectedhomeip/scripts/setup/banner.txt
_PW_ACTUAL_ENVIRONMENT_ROOT=/home/pi/workspace/connectedhomeip/.environment
PW_ARM_CIPD_INSTALL_DIR=/home/pi/workspace/connectedhomeip/.environment/cipd/packages/arm
LC_TIME=zh_CN.UTF-8
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
PATH=/home/pi/workspace/connectedhomeip/third_party/pigweed/repo/out/host/host_tools:/home/pi/workspace/connectedhomeip/.environment/pigweed-venv/bin:/home/pi/workspace/connectedhomeip/.environment/cipd/packages/arm/bin:/home/pi/workspace/connectedhomeip/.environment/cipd/packages/arm:/home/pi/workspace/connectedhomeip/.environment/cipd/packages/zap:/home/pi/workspace/connectedhomeip/.environment/cipd/packages/pigweed/bin:/home/pi/workspace/connectedhomeip/.environment/cipd/packages/pigweed:/home/pi/workspace/connectedhomeip/.environment/cipd:/home/pi/.cargo/bin:/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
GDMSESSION=ubuntu
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
PW_PIGWEED_CIPD_INSTALL_DIR=/home/pi/workspace/connectedhomeip/.environment/cipd/packages/pigweed
LC_NUMERIC=zh_CN.UTF-8
OLDPWD=/home/pi/workspace/connectedhomeip/third_party
_=/usr/bin/env
+ gn gen --check --fail-on-unused-args --root=examples/chip-tool/ out/standalone --args=
ERROR at //third_party/connectedhomeip/third_party/nlassert/BUILD.gn:19:1: Source file not found.
source_set("nlassert") {
^-----------------------
The target:
//third_party/connectedhomeip/third_party/nlassert:nlassert
has a source file:
//third_party/connectedhomeip/third_party/nlassert/repo/include/nlassert.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlbyteorder-big.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlbyteorder.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlbyteorder-little.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlbyteorder.hpp
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-base.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-base.hpp
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-byteorder-big.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-byteorder-big.hpp
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-byteorder-little.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-byteorder-little.hpp
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-byteorder.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-byteorder.hpp
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio-private.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio.h
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlio/BUILD.gn:19:1: Source file not found.
source_set("nlio") {
^-------------------
The target:
//third_party/connectedhomeip/third_party/nlio:nlio
has a source file:
//third_party/connectedhomeip/third_party/nlio/repo/include/nlio.hpp
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlunit-test/BUILD.gn:30:1: Source file not found.
static_library("nlunit-test") {
^------------------------------
The target:
//third_party/connectedhomeip/third_party/nlunit-test:nlunit-test
has a source file:
//third_party/connectedhomeip/third_party/nlunit-test/repo/src/nlunit-test.c
which was not found.
___________________
ERROR at //third_party/connectedhomeip/third_party/nlunit-test/BUILD.gn:30:1: Source file not found.
static_library("nlunit-test") {
^------------------------------
The target:
//third_party/connectedhomeip/third_party/nlunit-test:nlunit-test
has a source file:
//third_party/connectedhomeip/third_party/nlunit-test/repo/src/nlunit-test.h
which was not found.
此时也出现了错误:部分子模块的源文件和库文件没有找到。
-
third_party/nlassert/repo
-
third_party/nlio/repo
-
third_party/nlunit-test
到对应子模块的文件下查看文件信息,结果一个文件都没有。那么只能是拉取子模块时出问题了,所以删除子模块,重新拉取:
cd ~/workspace/connectedhomeip
rm -rf third_party/nlassert/repo
# 重新拉取
pi@pi-NMH-WCX9:~/workspace/connectedhomeip$ git submodule update
Submodule path 'third_party/nlassert/repo': checked out 'c5892c5ae43830f939ed660ff8ac5f1b91d336d3'
# 检查子模块文件夹
pi@pi-NMH-WCX9:~/workspace/connectedhomeip$ ll third_party/nlassert/repo/
total 856
drwxrwxr-x 6 pi pi 4096 1月 14 10:00 ./
drwxrwxr-x 3 pi pi 4096 1月 14 10:00 ../
-rw-rw-r-- 1 pi pi 44922 1月 14 10:00 aclocal.m4
-rwxrwxr-x 1 pi pi 1305 1月 14 10:00 bootstrap*
lrwxrwxrwx 1 pi pi 62 1月 14 10:00 bootstrap-configure -> third_party/nlbuild-autotools/repo/scripts/bootstrap-configure*
-rw-rw-r-- 1 pi pi 838 1月 14 10:00 CHANGES
-rwxrwxr-x 1 pi pi 686635 1月 14 10:00 configure*
-rw-rw-r-- 1 pi pi 13920 1月 14 10:00 configure.ac
-rw-rw-r-- 1 pi pi 1452 1月 14 10:00 CONTRIBUTING.md
-rw-rw-r-- 1 pi pi 6 1月 14 10:00 .default-version
drwxrwxr-x 2 pi pi 4096 1月 14 10:00 doc/
-rw-rw-r-- 1 pi pi 39 1月 14 10:00 .git
-rw-rw-r-- 1 pi pi 15 1月 14 10:00 .gitignore
drwxrwxr-x 3 pi pi 4096 1月 14 10:00 include/
-rw-rw-r-- 1 pi pi 11358 1月 14 10:00 LICENSE
-rw-rw-r-- 1 pi pi 5767 1月 14 10:00 Makefile.am
-rw-rw-r-- 1 pi pi 3891 1月 14 10:00 Makefile-bootstrap
-rw-rw-r-- 1 pi pi 36772 1月 14 10:00 Makefile.in
-rw-rw-r-- 1 pi pi 3265 1月 14 10:00 README.md
-rw-rw-r-- 1 pi pi 146 1月 14 10:00 repos.conf
drwxrwxr-x 2 pi pi 4096 1月 14 10:00 tests/
drwxrwxr-x 3 pi pi 4096 1月 14 10:00 third_party/
-rw-rw-r-- 1 pi pi 1013 1月 14 10:00 .travis.yml
另外子模块可以使用同样的方法解决,就不再额外赘述。
现在,可以重新构建库:
# 一共会构建2300个文件。由于已经构建过了,构建系统会缓存通过的测试,所以提示:no work to do.
pi@pi-NMH-WCX9:~/workspace/connectedhomeip$ ninja -C out/host/
ninja: Entering directory `out/host/'
ninja: no work to do.
此时,在 out/host
下可以看到 chip-tool
可执行文件。
下载ZAP工具
ZAP 工具由 Silicon Labs 和 ZAP 开源社区的开发人员构建和维护。它的名称和功能继承自 Zigbee 集群库,这是 Matter 数据模型的起点。ZAP 用于根据 Zigbee 集群库和相关的 Matter 代码模板为 Matter 应用程序生成代码。
ZAP 工具不再作为 Matter 存储库中的子模块存在。ZAP 工具可以从 GitHub 下载为二进制文件,或者您也可以克隆整个 ZAP 存储库并从头开始构建 ZAP 二进制文件。
Matter SDK提供了下载和运行ZAP的脚本:
pi@pi-NMH-WCX9:~/workspace/connectedhomeip/scripts/tools/zap$ ls
BUILD.gn generate.py test_generate.py version_update.py zap_execution.py
check_file_existence.py __pycache__ tests zap_bootstrap.sh zapfile_formatter.py
convert.py run_zaptool.sh update_cluster_revisions.py zap_download.py
下载 ZAP:
pi@pi-NMH-WCX9:~/workspace/connectedhomeip/scripts/tools/zap$ python3 zap_download.py
2025-01-14 11:13:33 root INFO Found required zap version to be: v2024.03.14-nightly
2025-01-14 11:13:33 root INFO Fetching: https://github.com/project-chip/zap/releases/download/v2024.03.14-nightly/zap-linux-x64.zip
2025-01-14 11:27:15 root INFO Data downloaded, extracting ...
2025-01-14 11:27:17 root INFO Done extracting.
export ZAP_INSTALL_PATH=/home/pi/workspace/connectedhomeip/.zap/zap-v2024.03.14-nightly
设置环境ZAP环境变量:
export ZAP_INSTALL_PATH=/home/pi/workspace/connectedhomeip/.zap/zap-v2024.03.14-nightly
运行 ZAP 工具:
# 先要设备ZAP环境变量
cd ~/workspace/connectedhomeip/scripts/tools/zap
./run_zaptool.sh