1. 简介
Google 的 OpenThread (OT) 是 Thread 的开源实现。Google 发布了 OpenThread,旨在让开发者能够更广泛地使用 Google Nest 产品中使用的网络技术,从而加快智能互联家居和商业建筑产品的开发。OpenThread 的平台抽象层较窄,占用的内存较少,因此具有高度可移植性。它同时支持系统芯片 (SoC) 和网络协处理器 (NCP) 设计。
线程规范针对家用和商用建筑应用,定义了基于 IPv6 的可靠、安全、低功耗的无线设备到设备通信协议。
Silicon Labs 增强了 OpenThread,可与 Silicon Labs 硬件配合使用。我们在 GitHub 上提供了此源代码,同时还提供了与 Simplicity Studio 5 (SSv5) 一起安装的软件开发套件 (SDK)。该 SDK 包含经过全面测试的 GitHub 源代码快照。与 GitHub 版本相比,该版本支持的硬件更加广泛,并且包含 GitHub 上没有的文档和示例应用。
本指南介绍如何开始使用 Silicon Labs OpenThread SDK 和 Simplicity Studio 5 开发 OpenThread 应用。下图显示了通过 OT 边界路由器 (OTBR) 和在此 Codelab 中使用的两个 Thread 设备设置的板 (BRD) 和硬件。
学习内容
- 如何使用 Silicon Labs Simplicity Studio IDE 创建 OpenThread 项目。
- 如何构建 OpenThread CLI 二进制文件并将其刷写到 Silicon Labs 无线电板。
- 如何使用 Docker 将 Raspberry Pi 3B 或更高版本设置为 OpenThread 边界路由器 (OTBR)。
- 如何在 OTBR 上创建 Thread 网络。
- 带外调试设备到 Thread 网络。
- 如何使用 ping 命令验证节点之间的线程通信。
2. 前提条件
硬件:
- 3 个 EFR32MGxx 无线电板 - 可以使用这些设备的任意组合。此 Codelab 使用一个 BRD4166A 作为 RCP,使用两个 BRD4168A 作为全线程设备。
- EFR32MG12(BRD4161A、BRD4166A、BRD4170A、BRD4304A)
- EFR32MG13 (BRD4168A)
- EFR32MG21(BRD4180A、BRD4180B)
- BRD4001A:用于托管无线电板的无线启动板主板 (WSTK)。除了 BRD4166A 之外,每个无线电板都需要一个启动主板。用于连接主板并为其供电的迷你 USB 线或 BRD4166A 的 Micro USB 线。
- 搭载 Raspbian Stretch Lite OS 映像或 Raspbian Stretch with Desktop 且已通过以太网连接到互联网的 Raspberry Pi 3B 或更高版本。我们将该设备配置为 OT 边界路由器。
- 具有至少 2 个 USB 端口和互联网连接的 Windows/Linux/Mac 主机系统。查看 SSv5 中的硬件和操作系统要求。
- 至少一根以太网网线,用于将 Raspberry Pi 连接到互联网。WSTK 还支持通过 IP 进行调试和刷写,因此可以根据需要使用其他以太网电缆,通过以太网交换器将 WSTK 连接到主机系统。
软件:
- 使用
- GNU ARM 工具链
- Gecko SDK Suite 3.2.0 或更高版本以及 Silicon Labs OpenThread SDK。
3. 硬件设置
此 Codelab 是使用
- EFR32MG12 BRD4166A Thunderboard Sense 2(如左侧所示)。
- 两个 EFR32MG13 BRD4168A,如右图所示。
- Simply Studio v5 安装在具有
- 的 macOS Catalina 10.15.7 上
- Gecko SDK 3.2.0
- GNU ARM 7.2.1 版
通过 USB 将每个无线新手套件的主板连接到主机,如下图所示。通过这些连接,可以对 RCP 和终端设备进行编程和网络分析。我们将首先使用主机通过 ot-rcp 固件对 BRD4166A 进行编程,最后将其连接到 Raspberry Pi。(可选)终端设备可通过公共以太网交换器连接到主机。入门套件还支持通过 IPv4 进行编程和网络分析。
4. 固件设置
您可以通过以下两种方式开始创建:这两个选项都允许您刷写此 Codelab 所需的固件。
- 项目:(推荐)创建、构建和刷写示例应用。通过此选项,您可以在项目中自定义应用。
- 演示:(可选)将预编译演示直接刷写到任何示例应用的无线电板上。我们建议用户尝试将演示固件设置为可选练习。请参阅“可选固件设置 - 演示”部分。
在此 Codelab 中,我们将使用基于项目的方法。
使用示例创建项目
我们将创建两个项目。用于 BRD4166A 的 ot-rcp
项目和用于两个 BRD4168A 的 ot-cli-ftd
项目。请按照下列步骤操作,并为您的主板选择适当的示例应用。
- 打开 Studio 的文件菜单,然后选择新建 >Silicon Labs 项目向导。系统随即会打开“目标、SDK 和工具链选择”对话框。不更改 OpenThread 支持的默认 Simplicity IDE / GNU 工具链。点击“下一步”。
- 目标板:显示选定的无线电板 (BRD4168A) 和主板 (BRD4001A)
- 目标设备:此字段显示板载微控制器芯片 (MCU)。BRD4168A 板载 EFR32MG13 MCU。
- SDK:您可以在此处选择您要使用的 OT 的 SDK 版本。套件信息包括 SDK 标记和 Silicon Labs build 的 OpenThread,例如
Platform 4.0.1.0
和OpenThread 2.0.1.0 (GitHub-55af6ce2c)
。 - IDE/ 工具链:将用于编译 OT 项目的工具链。我们使用 GNU ARM。
- 系统随即会打开“示例项目选择”对话框。您会看到一列示例项目。您可以使用 Thread 技术类型和关键字过滤条件搜索特定示例。请务必记下 Gecko SDK Suite 版本号。将 Raspberry Pi 设置为边界路由器时,您需要使用此版本标记。选择 ot-cli-ftd,然后点击下一步。
- 系统随即会打开“项目配置”对话框。您可以在此处重命名项目,更改默认项目文件位置,以及确定是否要链接到或复制项目文件。关联的项目文件指向 SDK,并且您所做的任何修改最终会在 SDK 中进行,并用于未来的项目。复制项目来源后,您可以修改项目本地副本,使 SDK 文件保持不变。“关联 SDK 并复制项目来源”是默认选项,也是推荐的选项。点击完成。
- Simplicity IDE Perspective API 随即会打开,同时 Project Configurator 打开并转到 OVERVIEW 标签页。
您可以通过软件组件标签通过安装和卸载组件以及配置已安装的组件来配置该项目。检查已安装的组件。点击已安装的组件可查看示例应用所安装组件的过滤列表。系统会自动保存您所做的任何更改,并自动生成项目文件。进度显示在 Simplicity IDE 透视图的右下角。
在此演示中,我们将使用示例应用的默认配置。重复上述步骤,为您的另一个开发板创建 ot-rcp
项目。
构建并刷写项目
构建并刷写 ot-rcp
和 ot-cli-ftd
项目。
- 配置项目后,点击顶部工具栏中的 Build 控件(锤子图标)。或者,您也可以右键点击项目,然后点击“build 项目”。
- 进度显示在控制台中,右下角有一个进度条。与项目相关的任何错误或警告也会显示在此输出窗口中。
- 二进制文件映像会在项目构建成功后生成。您可以从 Project Explorer 视图刷写二进制映像。在编译器子目录中找到 .bin、.Hex 或 .s37 文件。右键点击该文件,然后选择 Flash to Device。如果您连接了多个设备,然后选择一个设备进行编程,然后点击确定。系统将打开 Flash Programmer,其中填充了文件路径。点击计划。
5. 固件设置摘要
此时,您应该已在无线电板上创建并编译了相应的固件,并刷写了相应的固件。将 ot-rcp
刷写到 BRD4166A 后,将其与主机系统断开连接,然后将此开发板连接到 Raspberry Pi。
完成本部分后,您的 Thread 网络硬件设置将如下所示。
6. 为以下对象设置串行控制台: ot-cli-ftd 设备
要启动控制台界面,请在 Simplicity IDE 透视图下,在“Devices”视图/“Debug Adapters”窗口中右键点击您的 J-Link 设备。选择启动控制台。如需在控制台上获取提示,请选择序列号 1 标签页,然后按 Enter 键。检查 FTD 节点的状态。
您会发现,我们还没有 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 版本一致。例如,如果您从 Example Project Selection 窗口中选择了 ot-rcp
,但 GDSK 版本为 Gecko SDK Suite v4.0.1 (140)
,请使用 siliconlabsinc/openthread-border-router:gsdk-4.0.1
映像。
Raspberry Pi 设置
- 确保在 SD 卡上刷写 Raspbian Stretch Lite OS 映像或 Raspbian Stretch with Desktop。
- 您可以通过 SSH 连接到 Raspberry Pi,也可以选择直接使用 Raspbian Desktop。打开终端。
- 请务必在安装 Docker 之前更新您的本地代码库和软件包管理器(apt-get update 和 apt-getupgrade)。
安装 Docker 映像
- 在您的 RPi 上使用以下命令安装 Docker。
curl -sSL https://get.docker.com | sh
- 完成后,您可以修改 Docker 用户设置,使每个命令前都不需要 sudo。需要重新启动。
sudo usermod -aG docker $USER
- 发出以下命令以安装容器。请注意,使用 RCP 时,一次只能运行一个边界路由器容器。此外,请确保将您的 Simplicity Studio GSDK 版本与正确的 Docker 映像相匹配。例如
gsdk-4.0.1
:docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
配置并运行 Docker
- 您需要配置要用于 OTBR 的 TTY 端口,以便在启动时连接 RCP。查找 RCP 设备的 TTY 端口。最简单的方法是在连接 RCP 后查找
/tty/dev
... 条目。通常应为/dev/ttyUSB0
或/dev/ttyACM0
。 - 使用以下命令运行 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
命令查看容器的运行日志。 - 在 Docker 容器正确关闭(或移除)之前,
--name
会一直保持有效状态。 - 端口 8080 表示托管边界路由器管理网页的网络服务器的端口。
- 在无线装置网址选项中需要使用
?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 个控制台。
- Simplicity Studio 中的两个
ot-cli-ftd
控制台,设置为 Full Thread 设备。 - 在 Raspberry Pi 上有一个
ot-ctl
交互式 shell,它被设置为 OT 边界路由器。
现在,我们已经准备好构建 Thread 网络。
8. 创建 Thread 网络
设置 RCP
为了创建网络,我们先在 OTBR 上启动 ot-ctl
shell,该 shell 用于与 RCP 节点通信。按如下所示的顺序输入以下命令:
索引 | 命令 | 命令说明 | 预期响应 | ||
1 |
| 创建新的网络配置。 | 完成 | ||
2 |
| 将新数据集提交到活跃运营数据集。 | 完成 | ||
3 |
| 启用 Thread 接口。 | 完成 | ||
4 |
| 启用并连接 Thread 协议操作。 | 完成 | ||
等待 10 秒钟,让线程接口启动。 | |||||
5 |
| 检查设备状态。它应该是主要副本。 | Leader | ||
6 |
| 查看网络配置。 |
我们将使用 ot-cli-ftd
上的通道号和网络键将两个 FTD 加入此线程网络。
设置 FTD 并将其添加到我们的 Thread 网络(带外方法)
使用带外方法,我们可以了解所有安全信息,并手动添加节点。在简单控制台中,使用以下命令按照下方所示的顺序将两个 FTD 添加到我们的网络中。
索引 | 命令 | 命令说明 | 预期响应 | ||
1 |
| 设置 OTBR 使用的频道。 | 完成 | ||
2 |
| 只有网络密钥才需要设备连接到 Thread 网络。 | 完成 | ||
3 |
| 将新数据集提交到活跃运营数据集。 | 完成 | ||
4 |
| 启用 Thread 接口。 | 完成 | ||
5 |
| 启用并连接 Thread 协议操作。 | 完成 | ||
等待 20 秒,让设备加入并自行配置。 | |||||
6 |
| 查看网络配置。 | 孩子 |
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 地址对 OTBR 进行 ping 操作。
> 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 对 FTD 执行 ping 操作。
9. 恭喜
您已创建 Thread 网络!
您现在已了解:
- 如何使用 Silicon Labs Simplicity Studio IDE 创建 OpenThread 项目。
- 如何构建 OpenThread CLI 二进制文件并将其刷写到 Silicon Labs 无线电板。
- 如何使用 Docker 将 Raspberry Pi 3B 或更高版本设置为 OpenThread 边界路由器 (OTBR)。
- 如何在 OTBR 上创建 Thread 网络。
- 带外调试设备到 Thread 网络。
- 如何使用 ping 命令验证节点之间的线程通信。
深入阅读
您可以访问 openthread.io 和 GitHub,获取各种 OpenThread 资源,包括:
- 支持的平台 - 探索支持 OpenThread 的所有平台
- 构建 OpenThread - 进一步详细了解如何构建和配置 OpenThread
- Thread Primer - 介绍了此 Codelab 中介绍的所有 Thread 概念
- Silicon Labs OpenThread 培训 - 对 OpenThread 的介绍,讨论了调试和边界路由器,以及创建 OpenThread 网络的实操练习。
- QSG170:Silicon Labs OpenThread 快速入门指南 - 详细介绍了 Silicon Labs Thread 开发入门流程
- AN1256:将 Silicon Labs RCP 与 OpenThread 边界路由器搭配使用 - 适用于 Raspberry Pi 边界路由器主机的构建和安装说明
10. 可选固件设置 - 演示
演示版是预构建的固件映像,可下载到兼容设备。若要确定您的角色在 Simplicity Studio 中是否有相应演示,最快的方法是在“Debug Adapters”视图下点击“您的”部分,然后前往“Example PROJECTS &Launcher Perspective API 中的“演示”标签页。停用“示例项目”过滤条件,并选中“技术类型”下的“线程”单选复选框。
随 OpenThread SDK 提供的预编译演示应用映像与以下开发板兼容:
- BRD4161a
- BRD4166a
- BRD4168a
- BRD4180a
- BRD4304a
在未来的 SDK 版本中,此列表可能会更新,以纳入更多无线电开发板。如需查看受支持部分的完整列表,请参阅“文档”下的“Silicon Labs OpenThread SDK 版本说明”。
在相应开发板上刷写以下演示。若要刷写,请在左侧的“Debug Adapters”下选择您的开发板,然后点击“RUN”查看相应的示例应用。系统会显示一个弹出式窗口,其中会显示刷写进度。
- BRD4166A:ot-rcp - 此设备将用作 OT 边界路由器的无线电协同处理器。我们将使用此设备创建 Thread 网络,并将其他两部设备添加到 Thread 网络中。作为边界路由器,此设备也充当 Thread 网络中的设备通过互联网进行通信的网关。
- 两个 BRD4168A:ot-cli-ftd - 这两个设备将用作全线程设备。他们将加入 OTBR 创建的 Thread 网络。