OpenThread 的协议栈是用 C++ 编写的。本文通过分析 nRF connect SDK 中的例程代码 OpenThread Command Line Interface,来分享一些 C++ 的基础知识。目的在帮助大家更好的理解 OpenThread 的源代码。
OpenThread Architectures下面是 OpenThread 网络的描述,它有几个关特性:IPv6,低功耗,IEEE 802.15.4,mesh network
- Thread® is an IPv6-based networking protocol designed for low-power Internet of Things devices
- IEEE 802.15.4-2006 wireless mesh network, commonly called a Wireless Personal Area Network (WPAN)

OpenThread网络中的设备类型分为以下几种。CLI 例程中默认的设备类型是 FTD。
- Full Thread Device (FTD) Router 是一种 FTD 设备。 Leader 是一个特殊的 Router, 它是整个 Thread 网络的中心,同一个网络中只能有一个 Leader。
- Minimal Thread Device (MTD)
- Minimal End Device (MED)
- Sleepy End Device (SED)
- Synchronized Sleepy End Device (SSED)
OpenThread stack architecturenRF connect SDK 中 OpenThread 的代码框架如下图。PHY 层是 Nordic 提供的 IEEE 802.15.4 的驱动。中间层是 google 提供的 OpenThread 的 MAC 层和 网络层。上层有 Zephyr 提供的 BSD socket 接口和各种应用层网络协议。

下面是 OpenThread 的数据发送的流程图。后面我们会在 UDP 数据通讯演示部分具体分析。
OpneThread CLI Example我们分析的代码位于 nRF connect SDK 2.6.0 的目录 nrf\samples\openthread\cli 下。它支持的开发板如下:
Hardware Platforms PCA Board name Build target |
|
|
|
nRF5340 DK PCA10095 nrf5340dk_nrf5340 nrf5340dk_nrf5340_cpuapp_ns nrf5340dk_nrf5340_cpuapp |
|
|
|
nRF52840 PCA10059 nrf52840dongle_nrf52840 nrf52840dongle_nrf52840 Dongle |
|
|
|
nRF52840 DK PCA10056 nrf52840dk_nrf52840 nrf52840dk_nrf52840 |
|
|
|
nRF21540 DK PCA10112 nrf21540dk_nrf52840 nrf21540dk_nrf52840 |
|
|
|
这里我们选用 nRF52840 DK。我们可以通过下面的命令编译
west build -p -b nrf52840dk_nrf52840
编译结束后我们可以看到整个代码占用的 flash 和 RAM 的大小,如下图:
[td]
| Memory region Used Size Region Size %age Used |
|
|
|
| FLASH 463928 B 1MB 44.24% |
|
|
|
| RAM 104360 B 256KB 39.81% |
|
|
|
| |
|
|
|
下面的命令用来烧写代码
west flash
烧写完成后,连接串口终端。然后输入下面的指令启动 OpenThread 网络:
uart:~$ *** Booting nRF Connect SDK v3.5.99-ncs1 ***> ot channel 11ot channel 11Doneuart:~s> ot panid0 xabcoot panid OxabcdDoneuart:~$>ot networkkey 00112233445566778899aabbccddeeffot networkkey 00112233445566778899aabbccddeeffDoneuart:~$> ot ifconfig upot ifconfig upDoneuart: ~$> ot thread startot thread startDoneuart: ~$
当启动网络后,可以使用下面的命令来查看网络状态和IP地址。我们可以看到这台设备的角色是 leader。任何一台 FTD 都可以成为 leader. 当一台设备使能了 thread 网络后,它会首先试图加入一个已有的 Thread 网络。当搜索了一段时间,发现没有可加入的网络后,FTD 设备会构建一个 Thread 网络,自己成为 leader。一个设备可以有多个IP地址。
uart: ~$ ot stateot stateleaderDoneuart:~$ > ot ipaddrot ipaddrfdde: ad00: beef: 0: 0: ff: fe00: fc00fdde: ad00: beef: 0: 0: ff: fe00: 8c00fdde: ad00: beef: 0 : 8b97 : a8be: 52b3 : a367fe80: 0: 0: 0: a0cc: 601b: ea6b: 4ba1Doneuart:~$