matter初体验

前言

去年开始就一直传出matter的消息,其在概念和标准上的先进让各位开发者和公司一直关注,现在我们终于看到了实质性的进展。这篇文章介绍了matter的前世今生:连接标准联盟、Matter 协议——它们的「前世今生」和「未来」

前两天报名参加了芯科的matter培训,并且很幸运的获得了开发套件,可以亲自动手体验一下。强烈推荐去 B站芯科科技主页 观看这次的培训,满满的干货,可以更加深入了解matter。具体流程B站上已经有视频可以观看,故本文主要针对matter的环境搭建和运行编译过程进行总结。

体验套件

补充资料

Matter (CHIP) 从入门到入土

Matter 中的 Thread 边界路由器

边界路由(Border Router)

必备条件

  1. 支持 IPV6 的路由器

    因为matter基于IPV6,所以路由器必须具备IPV6地址分配的能力(DHCPV6或者可以分配地址前缀信息),否则matter运行过程中mDNS会报错。我自己的普通路由器一直都有问题,当换成家里的软路由才工作正常;

  2. 梯子

    在环境拉取的时候会访问Apple的开源社区,在OTBR运行的时候会使用Google的8.8.8.8 DNS,然而国内并不能直接访问;

  3. 电脑

    支持蓝牙,或者可以使用USB蓝牙适配器。安装Linux (Ubuntu 20.04 Desktop LTS 64-bit),虚拟机安装后,一张网卡设置为桥接模式,第二张网卡设置为仅主机模式。因为matter中会把第二张网卡当作wifi接口使用;

  4. 可做RCP的USB转接板

    连接虚拟机,用作RCP;

  5. 被控子设备

    使用efr32 Matter Lighting-app设备

  6. 依赖安装:

    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
  1. 创建一个符号链接指向Openthread协议栈:

    cd ~/SimplicityStudio/SDKs/gecko_sdk
    cd util/third_party/ot-br-posix
    cd third_party/openthread
    ln -s ../../../openthread repo
    
  2. 运行引导脚本(bootstrap)安装所需依赖:

    cd ~/SimplicityStudio/SDKs/gecko_sdk
    cd util/third_party/ot-br-posix
    chmod +x script/*
    sudo ./script/bootstrap
    
  3. 运行 script/setup 编译otbr-agent

    cd ~/SimplicityStudio/SDKs/gecko_sdk
    cd util/third_party/ot-br-posix
    sudo INFRA_NAME=ens33 ./script/setup
    
  4. 插入USB RCP,并链接到虚拟机,进入/dev/查看tty端口号,一般是:/dev/ttyUSB0

  5. 运行ifconfig查看网卡名称,比如我的是ens33

  6. 编辑文件 /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"
    
  7. 启动otbr-agent服务

    sudo systemctl start otbr-agent.service
    
  8. 检查:/var/log/syslog输出otbr-agent的运行日志

    tail -f /var/log/syslog
    

    如果无法访问8.8.8.8则会打印报错

  9. 检查主机与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     
      
  10. 停止otbr-agent服务(optional)

    sudo systemctl stop otbr-agent.service
    
  11. 访问虚拟机IP地址,即可看到web界面

OTBR Web界面

Matter源代码编译

  1. 下载源代码的所花费的时间与网络环境有关,可能会耗时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
    
  2. 配置Matter编译环境

    引导(bootstrap)过程与网络环境和主机处理器速度有关,可能会耗时50分钟,请耐心等待:

    cd connectedhomeip/
    source scripts/bootstrap.sh
    source scripts/activate.sh
    
  3. 编译

    scripts/examples/gn_build_example.sh examples/chip-tool out/debug/standalone
    

    编译完成后,可以在路径:connectedhomeip/out/debug/standalone下发现chip-tool二进制文件。

Matter 演示

  1. 将蓝牙连接至虚拟机,使用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字段存在时连接正常,当下半部分缺失,说明连接不正常,可以和虚拟机断开连接重新接入

  2. 创建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页,输入自己的配置即可。

  3. 读取Thread网络配置设置

    sudo ot-ctl dataset active -x
    # Eg:
    # ubuntu@ubuntu:~$ sudo ot-ctl dataset active -x
    # 0e080000000000010000000300000f35060004001fffe0020811111111222222220708fd08856afb88c6eb051000112233445566778899aabbccddeeff030f4f70656e5468726561642d336136370102123404107ea6bf7d4b38bd96923640e87f6bf71a0c0402a0fff8
    #Done
    
  4. 出厂重置 efr32 Matter Lighting-app设备

    按住 PB1 按钮 6 秒钟:启动设备的出厂重置。 启动恢复出厂设置程序时,LED会同步闪烁。按下并松开 RST 按钮。之后,Matter Light 将进入配置配对模式。

  5. 使用 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
    

    commissioning 成功

    运行网络配对命令后,Matter Lighting-app 设备将加入 Thread 网络。

    如果出现mdns错误一般是4个原因:

    • OTBR没有ipv6地址;

    • VM要桥接模式;

    • 路由RA广播关闭;

    • 确定radvd服务开启

  6. 使用浏览器打开 OTBR 的 Web UI 查看网络拓扑图:

    网络拓扑

  7. 使用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
    

    控制成功

  8. Matter Multi-Admin/Fabric 演示场景

    请观看B站视频

总结

芯科提供了一整套完整的体验套件和开发教程,并且有专人解答,向工作人员道声辛苦。同时也看到了芯科在智能家居领域的领先,不仅代码贡献度高,测试手法和开发者服务都很到位。

虽然资料齐全,但是在搭建的过程中还是遇到了几个问题,尤其是路由器导致的mDNS问题,还有服务依赖安装顺序,前前后后搭建了几次才最终稳定成功。

matter的代码由Apple,Google,Silicon Labs,Amazon等大厂贡献,且由C++编写,阅读大厂的代码相信可以受益匪浅,而且想更深入的理解实现机制是怎样的。所以,后续准备开始阅读源码,并总结到博客上。

posted @ 2023-02-19 21:17  小满的博客  阅读(139)  评论(0编辑  收藏  举报