使用 Texas Instruments SimpleLink F3 和 OpenThread 构建 Thread 网络

1. 简介

OpenThread 徽标

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

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

Texas Instruments 已为 SimpleLink™ CC27xx 设备系列实现 OpenThread。GitHub 上的 ot-ti 代码库包含在 Texas Instruments SimpleLink Connected MCU 上运行 OpenThread 所需的平台驱动程序和示例应用。CC2745R10-Q1 是 TI SimpleLink CC27xx 系列中一款汽车级(符合 AEC-Q100 标准)、通过 Thread 认证的 IEEE 802.15.4 无线 MCU。

此 Codelab 介绍了如何使用 LP-EM-CC2745R10-Q1 LaunchPad 评估板和 ot-ti 代码库开始开发 OpenThread 应用。下图显示了此 Codelab 中使用的硬件设置,包括一个 OT 边界路由器 (OTBR) 和两个 Thread 全 Thread 设备 (FTD)。

CC2745R10 硬件设置

学习内容

  • 如何设置 Texas Instruments ot-ti 构建环境。
  • 如何构建 OpenThread CLI 二进制文件并将其刷写到 LP-EM-CC2745R10-Q1 板。
  • 如何使用 ot-br-posix 将 Raspberry Pi 设置为 OpenThread 边界路由器 (OTBR)。
  • 如何在 OTBR 上创建 Thread 网络。
  • 将设备带外调试到 Thread 网络。
  • 如何使用 ping 命令验证节点之间的 Thread 通信。

2. 前提条件

硬件

  1. 3 个 LP-EM-CC2745R10-Q1 LaunchPad 板:一个配置为连接到边界路由器的 RCP,两个配置为完整 Thread 设备 (FTD)。 LP-EM-CC2745R10-Q1 倾斜视图CC2745R10-Q1 是 TI SimpleLink CC27xx 系列中一款汽车级(符合 AEC-Q100 标准)Thread 认证的 IEEE 802.15.4 无线 MCU。LP-EM-CC2745R10-Q1 是对应的 LaunchPad 评估模块,支持 RCP、FTD、MTD 和 NCP Thread 角色。LP-EM-CC2340R5 LaunchPad 上的 CC2340R5 是一款内存较低的选项,只能用作 RCP。不支持 FTD、MTD 或 NCP 角色。如果您将 LP-EM-CC2340R5 替换为板 1 (RCP),则两个 FTD 板必须仍为 LP-EM-CC2745R10-Q1。
  2. 3 个 LP-XDS110ET 调试探针:每个 LaunchPad 板一个,用于通过 USB 进行编程和调试。 LP-XDS110ET 斜视图LP-XDS110ET 是一款单独的 USB 调试探头,LP-EM 规格的 LaunchPad 需要使用该探头。它包含用于功耗分析的 EnergyTrace 支持。LP-XDS110 是一种低成本替代方案,可提供相同的编程和调试功能,但不包含 EnergyTrace。作为另一种替代方案,您可以使用带有板载 XDS110 调试探针(例如 LAUNCHXL-CC26X2R1)的 LaunchPad 完全取代 LP-EM 板和单独的调试探针。如需了解详情,请参阅 LaunchPad 调试连接指南
  3. 3 根 micro-USB 线,用于连接 LaunchPad 板和调试探针并为其供电。
  4. Raspberry Pi 4B 或更高版本,搭载 Raspberry Pi OS,通过以太网连接到互联网。此设备将配置为 OT 边界路由器主机。Raspberry Pi 4
  5. Linux 或 macOS 主机系统,至少具有 2 个 USB 端口且可访问互联网。构建环境需要与 Bash 兼容的 shell。Windows 用户应使用 WSL2(适用于 Linux 的 Windows 子系统 2)搭配 Ubuntu。
  6. 至少一根以太网网线,用于将 Raspberry Pi 连接到互联网。或者,您也可以将 Raspberry Pi 连接到 Wi-Fi,并使用 wlan0 作为基础架构接口 - 详情请参阅 OTBR 设置步骤。

软件

  • TI ot-ti 代码库https://github.com/TexasInstruments/ot-ti
  • GNU ARM Embedded Toolchain 12.2(由引导脚本自动安装)
  • SysConfig 1.27.0(由引导脚本自动安装)
  • TI UniFlash:用于将固件刷写到 LaunchPad 板

3. 硬件设置

此 Codelab 使用三个 LP-EM-CC2745R10-Q1 板:

  • 主板 1 (RCP):运行 ot-rcp 固件。通过 USB 连接到 Raspberry Pi,作为边界路由器的无线电协处理器。
  • 主板 2 (FTD 1):以完整 Thread 设备身份运行 ot-cli-ftd 固件。
  • 主板 3 (FTD 2):以完整 Thread 设备身份运行 ot-cli-ftd 固件。

LP-EM-CC2745R10-Q1 俯视图

通过 micro-USB 将每个 LaunchPad 连接到主机。USB 连接通过板载 XDS110 调试探针提供电源和调试/编程功能。

每个 LP-EM-CC2745R10-Q1 在通过 USB 连接时显示为两个虚拟串行端口:一个用于 XDS110 调试接口,另一个用于应用 UART。打开串行控制台时,请连接到应用/用户 UART 端口,而不是辅助数据端口。

硬件连接图

4. 代码库设置和构建

ot-ti 构建系统使用 CMake,并且需要 Bash shell。本部分中的所有命令均在 Linux 或 macOS 主机(或 Windows 上的 WSL2)上运行。

1. 克隆存储库

$ git clone https://github.com/TexasInstruments/ot-ti.git
$ cd ot-ti
$ git submodule update --init

2. 运行引导脚本

引导脚本会安装所需的依赖项,包括 GNU ARM 工具链和 SysConfig:

$ ./script/bootstrap

引导加载程序脚本需要 cmakegitwget 和标准 build 工具。在 Ubuntu/Debian 上,使用以下命令安装必备项:sudo apt-get install -y cmake git make wget tar ninja-build

3. 为 LP_EM_CC2745R10_Q1 构建固件

为 LP-EM-CC2745R10-Q1 板构建所有固件映像:

$ ./script/build LP_EM_CC2745R10_Q1

LP_EM_CC2745R10_Q1 build 目标对应于 CC27xx SimpleLink 系列中的 CC2745R10-Q1 设备(Arm Cortex-M33F 核心)。如需查看所有受支持的板,请运行不带参数的 ./script/build

成功构建后,ELF 二进制文件位于 build/bin/ 中:

$ ls build/bin/
ot-cli-ftd.out  ot-cli-mtd.out  ot-ncp-ftd.out  ot-rcp.out

此 Codelab 中使用的两张图片如下所示:

  • ot-rcp.out:边框路由器板的无线电协处理器固件。
  • ot-cli-ftd.out:两个 FTD 板的完整 Thread 设备 CLI 固件。

可选的 Minimal Thread 设备:如果您想探索休眠的终端设备,而不是 Full Thread 设备,可以在 Board 2 和 3 上刷写 ot-cli-mtd.out 来代替 ot-cli-ftd.out。MTD 不会路由 Thread 流量,并且可以进入低功耗睡眠状态,因此非常适合电池供电的应用。本 Codelab 中的 Thread 网络形成步骤对于这两种设备类型都是相同的。

可选的网络协处理器 (NCP)ot-ncp-ftd.out 二进制文件实现了 NCP 架构,其中 OpenThread 堆栈在设备上运行,主机处理器通过 Spinel 协议驱动它。NCP 用法不在本 Codelab 的范围内,请参阅 NCP 自述文件了解详情。

5. 刷写固件

使用 TI UniFlash 将 ELF 映像刷写到 LaunchPad 板。

使用 UniFlash 刷写

  1. 打开 UniFlash。由于具有自动设备检测功能,已连接的 LaunchPad 板会显示在 Detected Devices 下。如果系统未自动检测到您的板,请点击 New Configuration,选择 LP-EM-CC2745R10-Q1 目标,然后选择 XDS110 USB 调试探针。UniFlash 检测到的设备
  2. 选择主板 1(将刷写 ot-rcp.out),然后点击开始
  3. 点击浏览按钮,然后导航到 ot-ti/build/bin/ot-rcp.outUniFlash 闪存页面
  4. 点击 Load Image 以刷写固件。日志区域会显示进度并确认完成情况。
  5. 针对面板 2面板 3 重复执行第 2 步到第 4 步,并为每个面板选择 ot-ti/build/bin/ot-cli-ftd.out

替代方案:使用 Code Composer Studio (CCS) 进行刷写

Code Composer Studio 可用作 UniFlash 的替代方案,此外还提供完整的调试环境:

  1. 下载并安装 Code Composer Studio
  2. 使用 XDS110 调试器为 LP-EM-CC2745R10-Q1 创建目标连接 (CCXML)。请参阅 CCS 用户指南:手动方法
  3. 按照 CCS 用户指南:手动启动中的说明启动无项目调试会话。
  4. 连接到 Arm Cortex-M33 核心,然后点击 Load 加载 ELF 映像。

默认 CCXML 配置使用 2 线 cJTAG 来匹配默认的 LP-EM-CC2745R10-Q1 跳线配置。通过 JTAG 进行编程后,请对电路板进行电源循环,以清除启动时暂停标志。

6. 对 HSM 进行编程

CC2745R10-Q1 包含一个硬件安全模块 (HSM),必须先对其进行配置,然后才能运行 Thread 或其他安全应用固件。如果您的 LP-EM-CC2745R10-Q1 板尚未完成 HSM 编程,请立即完成此步骤。

使用 UniFlash 对 HSM 进行编程:

  1. 打开 UniFlash,然后从 Detected Devices 中选择 LP-EM-CC2745R10-Q1 板。
  2. 前往 HSM 编程面板,然后加载 HSM 固件映像,如下所示。

UniFlash HSM 编程

  1. 按照屏幕上的提示完成 HSM 配置。该操作会记录在 UniFlash 输出控制台中。

如需了解完整的 HSM 编程流程(包括 SimpleLink 低功耗 F3 SDK 中的所需固件映像路径),请参阅 TI 资源管理器中的 CC2745R10-Q1 快速入门指南

7. 固件摘要

此时,应已刷写所有三个板:

  • 板 1: ot-rcp.out:断开与主机之间的连接,并通过 USB 连接到 Raspberry Pi。
  • 主板 2: ot-cli-ftd.out:保持与主机连接。
  • 主板 3: ot-cli-ftd.out:保持与主机连接。

您的硬件设置将如下图所示。板 1 连接到 Raspberry Pi,作为 OTBR 的无线电协处理器,而板 2 和 3 仍连接到主机,用于串行控制台访问。

使用 FTD 的 CC2745R10 硬件设置

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

LP-EM-CC2745R10-Q1 通过 USB 以 921600 波特的速率公开应用 UART。

使用以下设置,为每个 FTD 板打开一个连接到应用 UART COM 端口 (Windows) 或 /dev/ttyACM* 设备 (Linux/macOS) 的串行终端:

参数

速度(波特)

921600

数据位

8

停止位

1

对等

None

流控制

None

提示(Linux/macOS):在插入电路板之前和之后运行 ls /dev/ttyACM*,并记下出现的条目,以确定正确的设备节点。每个 LP-EM-CC2745R10-Q1 会创建两个条目:编号较小的端口是 XDS110 调试 UART,编号较大的端口是应用 UART。例如,如果电路板创建了 /dev/ttyACM0/dev/ttyACM1,请使用 /dev/ttyACM1

提示(Windows):打开设备管理器,在插入开发板后,在端口 (COM 和 LPT) 下查找两个新的 COM 端口。XDS110 调试数据端口通常会先显示,请使用第二个(编号较高的)COM 端口作为应用控制台。

在终端中按 Enter 键,获取 OpenThread CLI 提示符 (>)。如需查看可用命令的完整列表,请参阅 OpenThread CLI 参考文档。验证 FTD 是否正常运行:

> state
disabled
Done

串行终端 FTD

您将不会为 RCP 板设置串行控制台。Raspberry Pi 上的 OTBR 直接与 RCP 通信。在下一步中,您将 Raspberry Pi 配置为 OpenThread 边界路由器。

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

OTBR 基于 ot-br-posix(开源 OpenThread 边界路由器项目)构建。边界路由器在 Raspberry Pi 上运行,并通过 USB 使用 Board 1 (RCP) 作为其 802.15.4 无线电。

Raspberry Pi 设置

  1. 使用 Raspberry Pi ImagerRaspberry Pi OS(64 位 Lite 或桌面版)刷写到 SD 卡。
  2. 启动 Raspberry Pi 并打开终端(通过 SSH 或直接打开)。
  3. 更新软件包管理器并升级已安装的软件包:
    $ sudo apt-get update
    $ sudo apt-get upgrade -y
    

在继续操作之前,请在更新后重启 Raspberry Pi:sudo reboot

将板 1 (RCP) 连接到 Raspberry Pi

通过 micro-USB 将板 1(已刷入 ot-rcp)连接到 Raspberry Pi。连接后,验证设备节点是否显示:

$ ls /dev/ttyACM*
/dev/ttyACM0
/dev/ttyACM1

RCP 板的应用 UART 通常为 /dev/ttyACM1(XDS110 调试 UART 为 /dev/ttyACM0)。请检查应用 UART 是否在后续步骤中启动 OTBR 代理时做出响应,以验证哪个端口是应用 UART。如果连接了其他 USB 串行设备,设备节点编号可能会有所不同。相应地调整 OTBR 配置中的路径。

构建并安装 ot-br-posix

在 Raspberry Pi 上,克隆并构建 ot-br-posix:

$ git clone https://github.com/openthread/ot-br-posix.git
$ cd ot-br-posix
$ ./script/bootstrap

运行设置脚本,将以太网接口指定为主干(基础设施)接口:

$ INFRA_IF_NAME=eth0 ./script/setup

eth0 是有线以太网接口的典型名称。如果您是通过 Wi-Fi 而不是以太网连接 Raspberry Pi,请将 eth0 替换为 wlan0(并确保 Pi 已连接到您的 Wi-Fi 网络)。使用 ip link show 验证有效接口名称。

设置脚本从源代码构建 ot-br-posix,安装 otbr-agentotbr-web 系统服务,并配置网络堆栈。此过程在 Raspberry Pi 4B 上通常需要 10-20 分钟。

配置 OTBR 代理

修改 OTBR 代理配置文件,以指定 RCP 设备路径和波特率:

$ sudo nano /etc/default/otbr-agent

找到 OTBR_AGENT_OPTS 行,并将其更新为引用 RCP 应用 UART:

OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

如果您的 Raspberry Pi 是通过 Wi-Fi 连接的,请将 eth0 替换为 wlan0

OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

LP-EM-CC2745R10-Q1 RCP 应用 UART 以 921600 波特的速率运行。验证设备路径(本例中为 /dev/ttyACM1)是否与 RCP 板的应用 UART 匹配。

重启 OTBR 代理以应用配置:

$ sudo systemctl restart otbr-agent
$ sudo systemctl enable otbr-agent

验证代理是否正在运行:

$ sudo systemctl status otbr-agent

与 RCP 节点互动

使用 ot-ctl 工具与 RCP 节点通信:

$ sudo ot-ctl state
disabled
Done

您可以监控 OTBR 代理日志,以查看连接和状态消息:

$ sudo journalctl -u otbr-agent -f

(可选)OTBR Web 界面可在 http://:80 中找到,并提供 Thread 网络的图形视图。

如需停止或重启 OTBR 代理,请执行以下操作:

$ sudo systemctl stop otbr-agent
$ sudo systemctl start otbr-agent

此时,您应该有三个有效控制台:

  1. 主机上板 2 (ot-cli-ftd 1) 的串行终端。
  2. 主机上主板 3 (ot-cli-ftd 2) 的串行终端。
  3. Raspberry Pi 上用于 ot-ctl (OTBR/RCP) 的 SSH 或终端会话。

您现在可以组建 Thread 网络了。

10. 创建 Thread 网络

设置 RCP (OTBR)

从 Raspberry Pi 上的 ot-ctl shell 创建新的 Thread 网络。按顺序输入以下命令:

索引

命令

说明

预期响应

1

dataset init new

创建新的网络配置。

完成

2

dataset commit active

将新数据集提交到有效操作数据集。

完成

3

ifconfig up

启用 Thread 接口。

完成

4

thread start

启用并附加 Thread 协议操作。

完成

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

5

state

检查设备状态。应为 leader。其他可能的状态:离线、已停用、已分离、子设备、路由器或主设备。

leader
完成

6

dataset

查看网络配置。您的值会有所不同。记下信道、网络密钥、网络名称和 PAN ID,这些信息是让 FTD 加入网络所必需的。

有效时间戳:1
渠道:20
渠道掩码:0x07fff800
扩展 PAN ID:39ba71f7fc367160
网状本地前缀:fd5c:c6b:3a17:40b9::/64
网络密钥:81ae2c2c17368d585dee71eaa8cf1e90
网络名称:OpenThread-008c
PAN ID:0x008c
PSKc:c98f0193d4236025d22dd0ee614e641f
安全政策:0,onrcb
完成

将 FTD 添加到 Thread 网络(带外方法)

使用带外调试方法时,您可以直接提供网络凭据。在每个 FTD 板的串行终端中,使用上述 OTBR 数据集输出中的信道和网络密钥输入以下命令:

索引

命令

说明

预期响应

1

dataset channel 20

将频道设置为与 OTBR 匹配。将 20 替换为 OTBR 的信道值。

完成

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

设置网络密钥。替换为 OTBR 的网络密钥。只需提供此密钥即可附加。

完成

3

dataset commit active

将新数据集提交到有效操作数据集。

完成

4

ifconfig up

启用 Thread 接口。

完成

5

thread start

启用并附加 Thread 协议操作。

完成

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

6

state

检查设备状态。

儿童
完成

由于 Thread 网络具有自配置特性,并且这些设备是完整 Thread 设备,因此一个或两个 FTD 最终都可能会成为路由器。您可以使用 state 命令随时验证当前角色。

Thread 设备之间的通信

使用 ping 命令验证设备是否可以通信。使用 ipaddr 获取每个设备的 IPv6 地址:

> 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)
Done

从两个 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

成功的响应会确认 Thread 网络正在运行,并且设备可以通信。重复此过程,从 OTBR (sudo ot-ctl ping ) ping 每个 FTD。

11. 恭喜

您已使用 TI CC2745R10-Q1 板创建了 Thread 网络!

您现在已了解:

  • 如何设置 Texas Instruments ot-ti 构建环境。
  • 如何构建 OpenThread CLI 二进制文件并将其刷写到 LP-EM-CC2745R10-Q1 LaunchPad。
  • 如何使用 ot-br-posix 将 Raspberry Pi 设置为 OpenThread 边界路由器 (OTBR)。
  • 如何在 OTBR 上创建 Thread 网络。
  • 将设备带外调试到 Thread 网络。
  • 如何使用 ping 命令验证节点之间的 Thread 通信。

延伸阅读

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