4. nRF54 Thread网络基础实验

Thread 网络的最小可用形态由两类角色构成:边界路由器(Border Router)负责把 Thread 网状网与外部 IPv6 网络(通常是 Wi-Fi 或以太网)连接起来,终端设备(End Device)则作为网内节点加入网络并获取 IPv6 地址。本节以 nRF54 系列开发板为硬件平台,使用 nRF Connect SDK 提供的 OpenThread 示例,搭建一个“边界路由器 + 终端设备”的双节点实验环境,并通过 ping 与 ot 命令验证连通性。

实验目标与硬件准备

本实验需要两块 nRF54 开发板(例如 nRF54L15 DK 或 nRF54H20 DK),一块烧录边界路由器固件,另一块烧录终端设备固件。边界路由器需要同时具备 Thread 射频和一条对外 IP 通道,因此通常采用“DK 通过 USB 连接主机,主机侧运行 otbr-agent 或使用 nRF Connect SDK 的 ot_br 示例”的方式;若使用 RCP(Radio Co-Processor)架构,则 DK 运行 ot_rcp 固件,主机侧运行 OpenThread Border Router。终端设备直接运行 ot_cli 示例,通过串口命令行控制。

实验前请确认:nRF Connect SDK 版本(建议 v2.6 及以上)已安装,工具链可用,两块 DK 的串口设备号已识别。下面给出一个典型的构建与烧录命令示例,具体路径请按本机环境替换。

# 构建 RCP 固件(边界路由器侧 DK)
west build -b nrf54l15dk/nrf54l15/cpuapp \
  nrf/samples/openthread/coprocessor -d build_rcp

# 构建终端设备 CLI 固件
west build -b nrf54l15dk/nrf54l15/cpuapp \
  nrf/samples/openthread/cli -d build_cli

# 烧录
west flash -d build_rcp
west flash -d build_cli

边界路由器侧:启动 RCP 与 OTBR

RCP 固件烧录完成后,DK 通过 USB 暴露一个串口,主机侧 otbr-agent 通过该串口与 RCP 通信。在 Linux 主机上,先确认串口设备(如 /dev/ttyACM0),然后启动 otbr-agent。关键参数包括:-B 指定 Thread 网络接口名(如 wpan0),-v 指定 RCP 串口,-I 指定对外网络接口(如 eth0 或 wlan0)。

sudo otbr-agent -I wpan0 -B eth0 -v spinel+hdlc+uart:///dev/ttyACM0

启动后,otbr-agent 会自动创建 Thread 网络接口并尝试形成网络。此时可在另一个终端使用 ot-ctl 查看状态:

sudo ot-ctl state
# 期望输出:leader 或 router
sudo ot-ctl dataset active -x
# 查看当前活动数据集(十六进制),后续终端设备需要用它入网

若 state 返回 disabled,说明 Thread 接口未启动,可执行 sudo ot-ctl ifconfig up 与 sudo ot-ctl thread start。边界路由器形成网络后,会拥有一个 RLOC 地址(如 fd00:0:0:0:0:0:0:1 形式的网内地址)以及一个由前缀派生的全局 IPv6 地址。这个全局地址就是终端设备需要 ping 的目标。

终端设备侧:入网与地址获取

终端设备运行 ot_cli 后,通过串口终端(如 screen /dev/ttyACM1 115200)进入 OpenThread CLI。入网有两种常用方式:一是使用与边界路由器相同的网络密钥和 PAN ID 手动配置;二是直接使用边界路由器导出的活动数据集。推荐后者,可避免参数不一致。

# 在边界路由器侧导出数据集
sudo ot-ctl dataset active -x
# 得到类似:0e080000000000010000... 的长十六进制串

# 在终端设备 CLI 中设置并启动
dataset set active 0e080000000000010000...
ifconfig up
thread start
state
# 期望输出:child 或 router

终端设备成功入网后,会通过 Thread 的地址自动配置机制获得 IPv6 地址。使用 ipaddr 命令可查看:其中 fd00:... 为网内 RLOC 或 ML-EID,2001:... 或其它全局前缀地址为可被外部访问的地址。若终端设备只显示链路本地地址(fe80::),说明尚未完成地址注册,可等待数秒或检查数据集是否一致。

Thread 边界路由器 + 终端设备连通性验证拓扑 Linux 主机 otbr-agent ot-ctl 对外接口 eth0 / wlan0 IPv6 前缀下发 nRF54 DK(RCP) ot_rcp 固件 IEEE 802.15.4 射频 角色:Leader / Router RLOC + 全局 IPv6 nRF54 DK(终端) ot_cli 固件 角色:Child / Router 串口 CLI 控制 获取全局 IPv6 USB/串口 802.15.4 Thread 网状 连通性验证关键步骤与判据 ① 确认 BR 状态 ot-ctl state leader / router ② 终端入网 dataset set active thread start ③ 查看地址 ipaddr 全局 IPv6 存在 ④ ping 验证 ping BR 全局地址 64 bytes 回显 成功判据:终端设备 ping 边界路由器全局 IPv6 地址,收到连续回显且丢包率为 0; 同时 BR 侧 ot-ctl neighbor table 可看到该终端设备条目。

连通性验证与结果判读

在终端设备 CLI 中,先确认已获得全局 IPv6 地址,然后 ping 边界路由器的全局地址。假设边界路由器全局地址为 2001:db8:1:2:0:0:0:1(示例地址,实际以 ot-ctl ipaddr 输出为准),终端设备执行:

ping 2001:db8:1:2:0:0:0:1
# 期望输出:
# 64 bytes from 2001:db8:1:2:0:0:0:1: icmp_seq=1 hlim=64 time=28ms
# 64 bytes from 2001:db8:1:2:0:0:0:1: icmp_seq=2 hlim=64 time=22ms

若 ping 不通,按以下顺序排查:第一,确认终端设备 state 是否为 child 或 router,若为 detached 说明未入网;第二,确认双方数据集一致,可用 dataset active -x 对比十六进制串;第三,确认边界路由器已启动 thread start 且 ifconfig up;第四,检查信道是否一致,Thread 默认信道为 11,若数据集指定了其它信道需保持一致。此外,若终端设备只拿到 RLOC 而没有全局地址,通常是边界路由器未正确下发前缀,可检查 otbr-agent 的 -I 参数是否指向了正确的对外接口。

实验记录表

为便于复现和对比,建议按下表记录关键参数与结果。表中“示例值”为教学假设,实际请以本机输出为准。

记录项 边界路由器侧 终端设备侧 示例值
固件示例 ot_rcp / otbr-agent ot_cli nRF Connect SDK v2.6
角色状态 leader / router child / router leader + child
信道 由数据集决定 与 BR 一致 11
PAN ID 数据集内 数据集内 0x1234
全局 IPv6 2001:db8:1:2::1 2001:db8:1:2::a1b2 示例地址
ping 结果 64 bytes,time < 50ms,丢包 0% 通过
若使用 nRF54H20 双核平台,注意将 OpenThread 示例构建到正确的核心(cpuapp),RCP 与 CLI 的构建目标需分别指定,避免烧录到错误核心导致串口无输出。
otbr-agent 需要 root 权限访问串口和网络接口,实验时请使用 sudo;同时确保主机防火墙未拦截 Thread 接口与对外接口之间的 IPv6 转发,否则终端设备虽能入网但无法访问外部网络。

完成上述步骤后,一个最小的 Thread 网络即告建立:边界路由器作为 Leader 维护网络,终端设备作为 Child 加入并获取全局 IPv6 地址,双向 ping 成功即证明 Thread 网状网与主机侧 IP 通道均已打通。后续可在此基础上增加第二个终端设备,观察 Thread 的 Mesh 路由与多跳转发行为。