matter初体验
前言
去年开始就一直传出matter的消息,其在概念和标准上的先进让各位开发者和公司一直关注,现在我们终于看到了实质性的进展。这篇文章介绍了matter的前世今生:连接标准联盟、Matter 协议——它们的「前世今生」和「未来」
前两天报名参加了芯科的matter培训,并且很幸运的获得了开发套件,可以亲自动手体验一下。强烈推荐去 B站芯科科技主页 观看这次的培训,满满的干货,可以更加深入了解matter。具体流程B站上已经有视频可以观看,故本文主要针对matter的环境搭建和运行编译过程进行总结。
补充资料
边界路由(Border Router)
必备条件
-
支持 IPV6 的路由器
因为matter基于IPV6,所以路由器必须具备IPV6地址分配的能力(DHCPV6或者可以分配地址前缀信息),否则matter运行过程中mDNS会报错。我自己的普通路由器一直都有问题,当换成家里的软路由才工作正常;
-
梯子
在环境拉取的时候会访问Apple的开源社区,在OTBR运行的时候会使用Google的8.8.8.8 DNS,然而国内并不能直接访问;
-
电脑
支持蓝牙,或者可以使用USB蓝牙适配器。安装Linux (Ubuntu 20.04 Desktop LTS 64-bit),虚拟机安装后,一张网卡设置为桥接模式,第二张网卡设置为仅主机模式。因为matter中会把第二张网卡当作wifi接口使用;
-
可做RCP的USB转接板
连接虚拟机,用作RCP;
-
被控子设备
使用efr32 Matter Lighting-app设备
-
依赖安装:
sudo apt-get install git gcc g++ python 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 cmake
虚拟机中应该同时安装Simplicity Studio 5,方法可以参考官网。
环境搭建
radvd 服务安装
OTBR 需要 radvd 服务,来进行IPV6无状态自动配置。
avahi使用使用
使用RADVD模拟IPv6路由器完成IPv6地址自动配置
-
安装 radvd 服务
sudo apt update sudo apt install radvd
-
创建
/etc/radvd.conf
例如:其中ens33
为网卡名称,根据实际情况修改,运行ifconfig
查看网卡名称,比如我的是ens33
interface ens33 { AdvManagedFlag on; AdvSendAdvert on; MinRtrAdvInterval 30; MaxRtrAdvInterval 60; prefix fd11:33::1/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; }; };
-
重启服务
sudo systemctl restart radvd
OTBR(OpenThread Border Router)的编译运行
Simplicity Studio 5下载Gecko SDK v4.0.0。Gecko SDK位于目录:~/SimplicityStudio/SDKs/gecko_sdk
Gecko SDK中的源代码路径:
- ot-br-posix:
util/third_party/ot-br-posix
- openthread:
util/third_party/openthread
-
创建一个符号链接指向Openthread协议栈:
cd ~/SimplicityStudio/SDKs/gecko_sdk cd util/third_party/ot-br-posix cd third_party/openthread ln -s ../../../openthread repo
-
运行引导脚本(bootstrap)安装所需依赖:
cd ~/SimplicityStudio/SDKs/gecko_sdk cd util/third_party/ot-br-posix chmod +x script/* sudo ./script/bootstrap
-
运行 script/setup 编译otbr-agent
cd ~/SimplicityStudio/SDKs/gecko_sdk cd util/third_party/ot-br-posix sudo INFRA_NAME=ens33 ./script/setup
-
插入USB RCP,并链接到虚拟机,进入
/dev/
查看tty端口号,一般是:/dev/ttyUSB0
-
运行
ifconfig
查看网卡名称,比如我的是ens33
-
编辑文件
/etc/default/otbr-agent
,改变tty端口和主干接口(Backbone interface)sudo vi /etc/default/otbr-agent # 虚拟机 OTBR_AGENT_OPTS="-I wpan0 -B ens33 spinel+hdlc+uart:///dev/ttyUSB0?uart-baudrate=115200"
-
启动otbr-agent服务
sudo systemctl start otbr-agent.service
-
检查:/var/log/syslog输出otbr-agent的运行日志
tail -f /var/log/syslog
如果无法访问8.8.8.8则会打印报错
-
检查主机与RCP的连接状态。
sudo ot-ctl state
-
如果连接正常,命令返回如下:
disabled Done
-
如果连接失败,命令返回如下:
connect session failed: No such file or directory
-
用ot-ctl CLI命令检查ot-br-posix的版本号:
sudo ot-ctl version OPENTHREAD/9f9e63a2-dirty; POSIX; Dec 23 2021 13:57:23 Done
-
用ot-ctl CLI命令检查ot-rcp的固件版本号:
sudo ot-ctl rcp version SL-OPENTHREAD/2.0.0.0_GitHub-9dedd1869; EFR32; Dec 22 2021 14:57:18 Done
-
-
停止otbr-agent服务(optional)
sudo systemctl stop otbr-agent.service
-
访问虚拟机IP地址,即可看到web界面
Matter源代码编译
-
下载源代码的所花费的时间与网络环境有关,可能会耗时30分钟:
git clone https://github.com/project-chip/connectedhomeip.git cd connectedhomeip/ git checkout 2072f8e55133457e8fa5d45d8abf00691eb5e347 git submodule update --init git submodule foreach git reset --hard
-
配置Matter编译环境
引导(bootstrap)过程与网络环境和主机处理器速度有关,可能会耗时50分钟,请耐心等待:
cd connectedhomeip/ source scripts/bootstrap.sh source scripts/activate.sh
-
编译
scripts/examples/gn_build_example.sh examples/chip-tool out/debug/standalone
编译完成后,可以在路径:
connectedhomeip/out/debug/standalone
下发现chip-tool二进制文件。
Matter 演示
-
将蓝牙连接至虚拟机,使用
hciconfig
命令检查是否成功$ hciconfig hci0: Type: Primary Bus: USB BD Address: 7C:B2:7D:C8:5D:8D ACL MTU: 1021:4 SCO MTU: 96:6 UP RUNNING RX bytes:17067 acl:0 sco:0 events:2760 errors:0 TX bytes:678026 acl:0 sco:0 commands:2758 errors:0
使用
hciconfig -a hci0
可以查看更详细的信息$ hciconfig -a hci0 hci0: Type: Primary Bus: USB BD Address: 7C:B2:7D:C8:5D:8D ACL MTU: 1021:4 SCO MTU: 96:6 UP RUNNING RX bytes:17067 acl:0 sco:0 events:2760 errors:0 TX bytes:678026 acl:0 sco:0 commands:2758 errors:0 Features: 0xbf 0xfe 0x0f 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'matter-Training' Class: 0x0c0000 Service Classes: Rendering, Capturing Device Class: Miscellaneous, HCI Version: 5.1 (0xa) Revision: 0x100 LMP Version: 5.1 (0xa) Subversion: 0x100 Manufacturer: Intel Corp. (2)
有
Name
字段存在时连接正常,当下半部分缺失,说明连接不正常,可以和虚拟机断开连接重新接入 -
创建Thread网络,使用如下命令来创建Thread网络:
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
也可以使用web页面创建,点击左侧的
Form
页,输入自己的配置即可。 -
读取Thread网络配置设置
sudo ot-ctl dataset active -x # Eg: # ubuntu@ubuntu:~$ sudo ot-ctl dataset active -x # 0e080000000000010000000300000f35060004001fffe0020811111111222222220708fd08856afb88c6eb051000112233445566778899aabbccddeeff030f4f70656e5468726561642d336136370102123404107ea6bf7d4b38bd96923640e87f6bf71a0c0402a0fff8 #Done
-
出厂重置 efr32 Matter Lighting-app设备
按住 PB1 按钮 6 秒钟:启动设备的出厂重置。 启动恢复出厂设置程序时,LED会同步闪烁。按下并松开 RST 按钮。之后,Matter Light 将进入配置配对模式。
-
使用 POSIX chip-tool CLI 来配置配对 Matter Light 设备
$ chip-tool pairing ble-thread ${node-id} ${operationalDataset} ${setup-pin-code} ${discriminator}
参数说明如下:
\${node-id}
(必须是十进制数或以 0x 为前缀的十六进制 的数字) 是分配给被配置的节点的节点ID号。\${operationalDataset}
是thread 的网络参数,可以通过在OTBR上运行命令sudo ot-ctl dataset active -x
来获取。\${setup-pin-code}
是设备的安装密码 silabs 使用的是73141520
- `${discriminator}
电子标识码, 默认值是
3840`
如我的是:
sudo ./chip-tool pairing ble-thread 1234 hex:0e080000000000010000000300001335060004001fffe0020811111111222203060708fd07c4e870230933051000112233445566771994aabbccddeeff030e4f70656e54687265616444656d6f010260300410e4ec209aa41d3df3d78a2c9fba78608f0c0402a0fff8 73141520 3840
运行网络配对命令后,Matter Lighting-app 设备将加入 Thread 网络。
如果出现mdns错误一般是4个原因:
-
OTBR没有ipv6地址;
-
VM要桥接模式;
-
路由RA广播关闭;
-
确定radvd服务开启
-
使用浏览器打开 OTBR 的 Web UI 查看网络拓扑图:
-
使用POSIX chip-tool 发送ZCL消息来控制Matter Light
在 OTBR 上运行如下命令:
sudo ./chip-tool onoff toggle ${node-id} 1
例如:
ubuntu@ubuntu:~/connectedhomeip/out/debug/standalone$ sudo ./chip-tool onoff toggle 1234 1
Matter Light 设备上的 LED 指示灯将被切换,并显示以下日志:
[1641352365.943927][22589:22594] CHIP:DMG: Received Command Response Status for Endpoint=1 Cluster=0x0000_0006 Command=0x0000_0002 Status=0x0 [1641352365.943992][22589:22594] CHIP:TOO: Default Success Response
-
Matter Multi-Admin/Fabric 演示场景
请观看B站视频
总结
芯科提供了一整套完整的体验套件和开发教程,并且有专人解答,向工作人员道声辛苦。同时也看到了芯科在智能家居领域的领先,不仅代码贡献度高,测试手法和开发者服务都很到位。
虽然资料齐全,但是在搭建的过程中还是遇到了几个问题,尤其是路由器导致的mDNS问题,还有服务依赖安装顺序,前前后后搭建了几次才最终稳定成功。
matter的代码由Apple,Google,Silicon Labs,Amazon等大厂贡献,且由C++编写,阅读大厂的代码相信可以受益匪浅,而且想更深入的理解实现机制是怎样的。所以,后续准备开始阅读源码,并总结到博客上。