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::),说明尚未完成地址注册,可等待数秒或检查数据集是否一致。
连通性验证与结果判读
在终端设备 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% | 通过 | |
完成上述步骤后,一个最小的 Thread 网络即告建立:边界路由器作为 Leader 维护网络,终端设备作为 Child 加入并获取全局 IPv6 地址,双向 ping 成功即证明 Thread 网状网与主机侧 IP 通道均已打通。后续可在此基础上增加第二个终端设备,观察 Thread 的 Mesh 路由与多跳转发行为。