使用 Simply Studio v5 构建采用 Silicon Labs EFR32 开发板和 OpenThread 的 Thread 网络

1. 简介

26b7f4f6b3ea0700.png

Google 的 OpenThread (OT) 是 Thread 的开源实现。Google 发布了 OpenThread,以便开发者更广泛地使用 Google Nest 产品中使用的网络技术,从而加快开发适用于智能互联家居和商业建筑的产品。凭借窄平台抽象层和较小的内存占用空间,OpenThread 具有高度的可移植性。它同时支持系统芯片 (SoC) 和网络协处理器 (NCP) 设计。

Thread 规范定义了一种基于 IPv6 的可靠、安全且低功耗的无线设备到设备通信协议,适用于住宅和商业建筑应用。

Silicon Labs 增强了 OpenThread,使其能够与 Silicon Labs 硬件搭配使用。此源代码可在 GitHub 上获取,也可作为随 Simplicity Studio 5 (SSv5) 一起安装的软件开发套件 (SDK) 获取。该 SDK 包含经过全面测试的 GitHub 源代码快照。它支持比 GitHub 版本更广泛的硬件,并且包含 GitHub 上没有的文档和示例应用。

本指南介绍了如何开始使用 Silicon Labs OpenThread SDK 和 Simplicity Studio 5 开发 OpenThread 应用。下图显示了在 Codelab 中使用的板 (BRD) 和硬件设置,包括一个 OT 边界路由器 (OTBR) 和两个 Thread 设备。

EFR32MG 硬件设置

学习内容

  • 如何使用 Silicon Labs Simplicity Studio IDE 创建 OpenThread 项目。
  • 如何构建 OpenThread CLI 二进制文件并将其刷写到 Silicon Labs 无线电板。
  • 如何使用 Docker 将 Raspberry Pi 3B+ 或更高版本设置为 OpenThread 边界路由器 (OTBR)。
  • 如何在 OTBR 上创建 Thread 网络。
  • 将设备带外调试到 Thread 网络。
  • 如何使用 ping 命令验证节点之间的 Thread 通信。

2. 前提条件

硬件:

  1. 3 个 EFR32MGxx 无线电板 - 可以使用这些设备的任意组合。此 Codelab 使用 BRD4166A 作为 RCP,并使用两个 BRD4168A 作为完整 Thread 设备。
    • EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
    • EFR32MG13 (BRD4168A)
    • EFR32MG21(BRD4180A、BRD4180B
    如果您是新手,可以购买EFR32 Thread 入门套件,其中包含上述开发板。
  2. BRD4001A:用于托管无线电板的无线入门套件主板 (WSTK)。除了 BRD4166A 之外,所有无线电板都需要一个启动器主板。用于连接和供电主板的 Mini USB 线,或用于 BRD4166A 的 Micro USB 线。

WSTK AEM

  1. 已连接到互联网的 Raspberry Pi 3B+ 或更高版本,并安装了 Raspbian Stretch Lite 操作系统映像Raspbian Stretch with Desktop。我们将此设备配置为 OT 边界路由器。
  2. 具有至少 2 个 USB 端口和互联网连接的 Windows/Linux/Mac 主机系统。如需查看硬件和操作系统要求,请访问 SSv5
  3. 至少一根以太网线缆,用于将 Raspberry Pi 连接到互联网。WSTK 还支持通过 IP 进行调试和刷写,因此您可以选择使用额外的以太网电缆通过以太网交换机将 WSTK 连接到主机系统。

软件:

  • 在 Windows/Linux/Mac 主机系统上安装并更新了 Simplicity Studio v5,但
    • GNU ARM 工具链
    • Gecko SDK Suite 3.2.0 或更高版本和 Silicon Labs OpenThread SDK。

3. 硬件设置

此 Codelab 是使用以下工具创建的

  1. EFR32MG12 BRD4166A Thunderboard Sense 2,如左图所示。
  2. 两个 EFR32MG13 BRD4168A,如右图所示。
  3. 在 macOS Catalina 10.15.7 上安装的 Simplicity Studio v5,
    1. Gecko SDK 3.2.0
    2. GNU ARM v7.2.1

BRD4168A

使用 USB 将每个无线入门套件主板连接到主机,如下图所示。这些连接将允许对 RCP 和终端设备进行编程和网络分析。我们将首先使用主机通过 ot-rcp 固件对 BRD4166A 进行编程,然后将其连接到 Raspberry Pi。(可选)终端设备可以通过通用以太网交换机连接到主机。入门套件还支持通过 IPv4 进行编程和网络分析。

连接

4. 固件设置

您可以通过以下两种方式开始使用。这两种方式都允许您刷写本 Codelab 所需的固件。

  1. 项目:(推荐)创建、构建和刷写示例应用。此选项可让您自定义项目中的应用。OR
  2. 演示:(可选)直接在无线电板上为任何示例应用刷写预构建的演示。建议用户尝试设置演示固件,作为一项可选练习。有关详情,请参阅本 Codelab 末尾的“可选固件设置 - 演示”部分。

在此 Codelab 中,我们将使用基于项目的方法。

使用示例创建项目

我们将创建两个项目。BRD4166A 的 ot-rcp 项目和两个 BRD4168A 的 ot-cli-ftd 项目。请按照以下步骤操作,并为您的开发板选择合适的示例应用。

  1. 打开 Studio 的 File 菜单,然后选择 New > Silicon Labs Project Wizard。系统会打开“目标、SDK 和工具链选择”对话框。请勿更改 OpenThread 支持的默认 Simplicity IDE / GNU 工具链。点击“下一步”
    • 目标板:显示所选的无线电板 (BRD4168A) 以及主板 (BRD4001A)
    • 目标设备:此字段显示板载微控制器芯片 (MCU)。BRD4168A 具有板载 EFR32MG13 MCU。
    • SDK:您可以在此处选择正在使用的 OT 的 SDK 版本。套件信息包括 SDK 标记和 Silicon Labs 的 OpenThread build,例如 Platform 4.0.1.0OpenThread 2.0.1.0 (GitHub-55af6ce2c)
    • IDE/ 工具链:将用于编译 OT 项目的工具链。我们使用 GNU ARM。

新建项目向导

  1. 系统随即会打开“示例项目选择”对话框。您会看到一个示例项目列表。使用 Thread 技术类型和关键字过滤条件搜索特定示例。请务必记下 Gecko SDK Suite 版本号。将 Raspberry Pi 设置为边界路由器时,您需要使用此版本标记。选择 ot-cli-ftd,然后点击 NEXT

“新建项目”向导第 2 步

  1. 系统随即会打开“项目配置”对话框。您可以在此处重命名项目、更改默认项目文件位置,并确定是链接到项目文件还是复制项目文件。关联的项目文件指向 SDK,您所做的任何修改最终都会在 SDK 中进行,并用于未来的项目。复制项目源文件后,您可以修改项目本地副本,而 SDK 文件保持不变。“关联 SDK 并复制项目源”是默认值,也是推荐的选择。点击完成

新建项目向导第 3 步

  1. Simplicity IDE 透视图随即打开,并显示“项目配置器”的 OVERVIEW(概览)标签页。

项目概览

通过在软件组件标签页中安装和卸载组件,以及配置已安装的组件,可以配置项目。系统会检查已安装的组件。点击已安装的组件,查看示例应用安装的组件的过滤列表。您所做的任何更改都会自动保存,并且项目文件会自动生成。进度显示在 Simplicity IDE 透视图的右下角。

软件组件

在此演示中,我们将使用示例应用的默认配置。重复上述步骤,为其他开发板创建 ot-rcp 项目。

构建和刷写项目

构建并刷写 ot-rcpot-cli-ftd 两个项目。

  1. 配置项目后,点击顶部工具栏中的构建控件(锤子图标)。或者,您也可以右键点击项目,然后点击“构建项目”。

“构建项目”按钮

  1. 进度会显示在控制台中,右下角还会显示一个进度条。与项目相关的任何错误或警告也会显示在此输出窗口中。

项目 build 输出窗口

  1. 二进制映像是在项目成功构建后生成的。您可以从“项目资源管理器”视图刷写二进制映像。在编译器子目录中找到 .bin、.hex 或 .s37 文件。右键点击该文件,然后选择 Flash to Device。如果您连接了多部设备,请选择要编程的设备,然后点击 OK。Flash Programmer 随即会打开,并填充文件路径。点击计划

闪光灯

5. 固件设置摘要

此时,您应该已在无线电板上创建、编译并刷写了相应的固件。将 ot-rcp 刷写到 BRD4166A 后,将其与主机系统断开连接,然后将此板连接到 Raspberry Pi。

完成本部分后,您的 Thread 网络硬件设置将如下所示。

EFR32MG 设置

6. 为 ot-cli-ftd 设备设置串行控制台

如需启动控制台界面,请在 Simplicity IDE 透视图中右键点击 J-Link 设备(位于“设备”视图/“调试适配器”窗口中)。选择启动控制台。如需在控制台上获取提示,请选择 Serial 1 标签页,然后按 Enter 键。检查 FTD 节点的状态。

FTD Studio 控制台视图

您会注意到,我们尚未为 ot-rcp 提供控制台。在下一步中,我们将 Raspberry Pi 配置为 OT 边界路由器,并为 ot-rcp 设置控制台。

7. 将 Raspberry Pi 设置为边界路由器

Silicon Labs 建议使用 OTBR 部署该公司的 Docker 容器。在容器中运行 OTBR 可轻松创建可部署的制品,并快速进行开发原型设计和测试。

Silicon Labs OTBR 映像托管在 siliconlabsinc DockerHub 上,并带有标记。每个标记都对应一个 GSDK 版本:

https://hub.docker.com/r/siliconlabsinc/openthread-border-router/tags

Docker 容器必须与使用 Simplicity Studio 5 为给定版本构建的 RCP 搭配使用。请务必将容器代码版本与您正在测试的 GSDK 版本相匹配。例如,如果您在示例项目选择窗口中选择 ot-rcp 时,GDSK 版本为 Gecko SDK Suite v4.0.1 (140),请使用 siliconlabsinc/openthread-border-router:gsdk-4.0.1 映像。

GSDK 版本

Raspberry Pi 设置

  1. 在 SD 卡上,确保刷写 Raspbian Stretch Lite 操作系统映像Raspbian Stretch with Desktop
  2. 您可以 SSH 到 Raspberry Pi 上,也可以选择直接使用 Raspbian 桌面。打开终端。
  3. 请务必先更新本地代码库和软件包管理系统(在安装 Docker 之前运行 apt-get updateapt-get upgrade)。

安装 Docker 映像

  1. 在 RPi 上使用以下命令安装 Docker。
    curl -sSL https://get.docker.com | sh
    
  2. 完成后,您可以修改 Docker 用户设置,以便在每次执行命令之前无需使用 sudo。需要重新启动。
    sudo usermod -aG docker $USER
    
  3. 运行以下命令以安装容器。请注意,使用 RCP 时,一次只能运行一个 Border Router 容器。另请务必将 Simplicity Studio GSDK 版本与正确的 Docker 映像相匹配。例如,gsdk-4.0.1
    docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
    

配置并运行 Docker

  1. 您需要配置希望用于 OTBR 的 TTY 端口,以便在启动时连接 RCP。找到 RCP 设备的 TTY 端口。最简单的方法是在 RCP 连接后查找 /tty/dev... 条目。一般应为 /dev/ttyUSB0/dev/ttyACM0
  2. 使用以下命令运行 Docker 安装。请务必将您的 Docker 映像名称替换为匹配的 GSDK 版本。例如 gsdk-4.0.1
    docker run -d --name "otbr" \
     --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \
     -p 8080:80 --dns=127.0.0.1 -it \
     --volume /dev/ttyACM0:/dev/ttyACM0 \
     --privileged siliconlabsinc/openthread-border-router:gsdk-4.0.1 \
     --radio-url spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800 \
     --backbone-interface eth0
    
    • -d 可确保容器以分离模式运行。
    • 您可以使用 docker logs 命令随时查看容器的运行日志。
    • --name 在 Docker 容器正确关闭(或移除)之前一直处于粘滞状态。
    • 端口 8080 表示托管边框路由器管理网页的 Web 服务器的端口。
    • 在无线电网址选项中,需要 ?uart-baudrate=460800 来解决通过 UART 传输长 IPv6 数据包时出现的碎片化 / 重组问题,这些问题会带来高昂的 DTLS 操作成本。

与 RCP 节点互动

Docker 运行后,您可以使用此命令通过交互式 shell 与 RCP 节点通信。检查 RCP 节点的状态。

$ docker exec -ti otbr sh -c "sudo ot-ctl"
> state 
disabled
Done

您可以获取正在运行的容器 ID 的列表

$ docker ps -aq

您可以检查运行 OTBR Docker 容器的窗口,查看边框路由器的运行日志输出,也可以按如下方式跟踪容器日志:

$ docker logs [container-id] -f

(可选)如果 Docker 容器已正确加载,您可以停止、移除或终止映像。

$ docker stop otbr
$ docker rm otbr
$ docker kill otbr

可选:如需退出 shell,请按 CNTL + C。

此时,您应该有 3 个控制台。

  1. Simplicity Studio 中的两个 ot-cli-ftd 控制台,设置为完整 Thread 设备。
  2. 一个 ot-ctl 交互式 shell,位于设置为 OT 边界路由器的 Raspberry Pi 上。

现在,我们已准备好组建 Thread 网络。

8. 创建 Thread 网络

设置 RCP

为了创建网络,我们首先在 OTBR 上启动 ot-ctl shell,该 shell 用于与 RCP 节点通信。按以下所示的顺序输入以下命令:

索引

命令

命令说明

预期响应

1

dataset init new

创建新的网络配置。

完成

2

dataset commit active

将新数据集提交到有效运行数据集。

完成

3

ifconfig up

启用 Thread 接口。

完成

4

thread start

启用并附加 Thread 协议操作。

完成

等待 10 秒,直到线程接口启动。

5

state

检查设备状态。应该是领导者。
其他可能的状态:离线、已停用、已分离、
子设备、路由器或领导者

Leader
完成

6

dataset

查看网络配置。
您的值将与此 Codelab 中的值不同。
记下频道、网络密钥、
网络名称和 PAN ID。

Active Timestamp: 1
Channel: 20
Channel Mask: 0x07fff800
Ext PAN ID: 39ba71f7fc367160
Mesh Local Prefix: fd5c:c6b:3a17:40b9::/64
Network Key: 81ae2c2c17368d585dee71eaa8cf1e90
Network Name: OpenThread-008c
PAN ID: 0x008c
PSKc: c98f0193d4236025d22dd0ee614e641f
Security Policy: 0, onrcb
Done

我们将使用 ot-cli-ftd 上的频道号和网络密钥,将两个 FTD 加入此 Thread 网络。

设置 FTD 并将其添加到我们的 Thread 网络(带外方法)

通过带外方法,我们了解所有安全信息并手动添加节点。在 Simplicity 控制台中,使用以下命令按所示顺序将两个 FTD 添加到我们的网络。

索引

命令

命令说明

预期响应

1

dataset channel 20

设置 OTBR 使用的信道。

完成

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

设备只需使用网络密钥即可连接到 Thread 网络。

完成

3

dataset commit active

将新数据集提交到有效运行数据集。

完成

4

ifconfig up

启用 Thread 接口。

完成

5

thread start

启用并附加 Thread 协议操作。

完成

等待 20 秒,让设备加入并自行配置。

6

state

查看网络配置。

儿童
完成

Thread 设备之间的通信

我们将使用 ping 命令来检查设备是否可以相互通信。如需使用 ping 命令,我们需要设备的 IPv6 地址。您可以使用 ipaddr 命令获取这些信息。

> ipaddr
fd5c:c6b:3a17:40b9:0:ff:fe00:fc00		# Leader Anycast Locator (ALOC)
fd5c:c6b:3a17:40b9:0:ff:fe00:1800		# Routing Locator (RLOC)
fd5c:c6b:3a17:40b9:84e2:bae8:bd5b:fa03		# Mesh-Local EID (ML-EID)
fe80:0:0:0:c449:ca4a:101f:5d16			# Link-Local Address (LLA)

从两个 FTD 使用 OTBR 的 RLOC 地址 ping OTBR。

> ping fd5c:c6b:3a17:40b9:0:ff:fe00:1800
Done
> 
> 16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=30ms
16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=52ms

该响应表示已收到载荷,并且通信成功。重复此过程,以从 OTBR ping FTD。

9. 恭喜

您已创建 Thread 网络!

您现在已了解:

  • 如何使用 Silicon Labs Simplicity Studio IDE 创建 OpenThread 项目。
  • 如何构建 OpenThread CLI 二进制文件并将其刷写到 Silicon Labs 无线电板。
  • 如何使用 Docker 将 Raspberry Pi 3B+ 或更高版本设置为 OpenThread 边界路由器 (OTBR)。
  • 如何在 OTBR 上创建 Thread 网络。
  • 将设备带外调试到 Thread 网络。
  • 如何使用 ping 命令验证节点之间的 Thread 通信。

深入阅读

如需各种 OpenThread 资源,请访问 openthread.ioGitHub,其中包括:

10. 可选固件设置 - 演示

演示版是预构建的固件映像,可随时下载到兼容的设备。在 Simplicity Studio 中,如需快速了解您的芯片是否有可用的演示,请在“调试适配器”视图下点击您的芯片,然后前往“启动器”透视图中的“示例项目和演示”标签页。停用“示例项目”过滤条件,然后选中“技术类型”下的“Thread”单选复选框。

Studio 演示

OpenThread SDK 随附的预编译演示应用映像与以下开发板兼容:

  1. BRD4161a
  2. BRD4166a
  3. BRD4168a
  4. BRD4180a
  5. BRD4304a

此列表可能会在未来的 SDK 版本中更新,以包含更多无线电板。如需查看受支持的部件的完整列表,请参阅“文档”下的 Silicon Labs OpenThread SDK 版本说明。

在相应板上刷写以下演示。如需刷写,请在左侧的“调试适配器”下选择您的开发板,然后点击相应示例应用的“运行”。系统随即会显示一个弹出式窗口,其中会显示闪存进度。

  1. BRD4166A:ot-rcp - 此设备将作为无线电协处理器运行,为 OT 边界路由器提供支持。我们将使用此设备创建 Thread 网络,并将其他两部设备加入到该 Thread 网络中。作为边界路由器,此设备还充当 Thread 网络中设备通过互联网进行通信的网关。
  2. 两个 BRD4168A:ot-cli-ftd - 这两个设备将充当完整的 Thread 设备。它们将加入由 OTBR 创建的 Thread 网络。