使用可视化测试 Thread 网络

1. 简介

5abd22afa2f2ee9a

什么是 Thread、OpenThread、OTNS 和 Silk?

Thread 是一种基于 IP 的低功耗无线网状网络协议,可实现设备间以及设备间的安全通信。线程网络可以适应拓扑变化,以避免单点故障。

Google 发布的 OpenThread 是 Thread 的开源实现。尽管其代码大小和内存占用量较小,但 OpenThread 支持线程规范中定义的所有功能。

OpenThread Network Simulator (OTNS) 可用于通过在 posix 平台上运行模拟的 OpenThread 节点来模拟 Thread 网络。OTNS 提供了一个简单易用的网页界面 (OTNS-Web),用于直观呈现和操作模拟 Thread 网络。

Silk 是一个完全自动化的测试平台,用于在真实设备上验证 OpenThread 的功能、功能和系统性能。

学习内容

  • OpenThread 的功能验证框架:Silk
  • 在启用了 OTNS 功能的情况下为真实设备构建 OpenThread
  • 使用 OTNS-Web 接口监控通过运行 Silk 测试用例形成的 Thread 网络的状态

此 Codelab 重点介绍如何将 Silk 与 OTNS 结合使用。Silk 和 OTNS 的其他功能不在涵盖范围内。

所需条件

硬件:

  • 6 块 Nordic Semiconductor nRF52840 开发板
  • 6 根 USB 转 Micro-USB 线缆用于连接开发板
  • USB 集线器

软件:

  • Linux x86_64。
  • Git
  • Go 1.11+
  • 网络浏览器。OTNS-Web 使用网络浏览器显示模拟内容。

前提条件:

2. 前提条件

完成之前的基本 Codelab

检查软件包前提条件

让我们来确保满足所有前提条件。

  1. 运行 which otns 以检查 otns 可执行文件是否可以在 $PATH 中搜索。
  2. 运行 which wpantund 以确保 wpantund 可用。
  3. 确保 ARM GNU 工具链、J-Link 和 nrfjprog 软件包都可用。

注意:如需设置指南,请参阅链接的文档。前提条件 1 来自 Simulate Thread Networks using OTNS,其他技术来自 Build a Thread network with nRF52840 开发板和 OpenThread

3. 丝绸设置

如需克隆 Silk 并设置环境,请在源目录下运行以下命令:

$ git clone https://github.com/openthread/silk.git
$ cd silk
$ ./bootstrap.sh
$ sudo make install-cluster

定义硬件配置文件

如需允许 Silk 收集连接到计算机的可用测试硬件资源,请按以下格式定义 hwconfig.ini 文件:

[DEFAULT]
ClusterID: 0
LayoutCenter: 300, 300
LayoutRadius: 100

[Dev-8A7D]
HwModel: Nrf52840
HwRev: 1.0
InterfaceSerialNumber: E1A5012E8A7D
USBInterfaceNumber: 1
DutSerial: 683536778

Silk 中安装了一个名为 usbinfo 的工具,该工具可用于查找接口序列号和 USB 接口编号。DutSerial 是芯片上印刷的序列号或由 usbinfo 为 J-Link 产品显示的序列号。

[DEFAULT] 部分中的 LayoutCenterLayoutRadius 字段定义了在网页界面中呈现设备时的布局形状。不妨从将其设为此处显示的值作为切入点。

随后,它会为每个测试设备定义一个部分,并提供相关硬件信息。

4. 在启用 OTNS 的情况下编译 OpenThread

构建映像和刷写

默认情况下,OpenThread 设备不会发出 OTNS 相关消息。若要允许开发板发出状态消息以记录对 OTNS 可视化至关重要的接口,请在 OpenThread 源目录下运行以下命令,以构建 FTD 映像,并将其转换为十六进制格式。

$ git clone https://github.com/openthread/ot-nrf528xx.git --recursive
$ cd ot-nrf528xx
$ ./script/bootstrap
$ ./script/build nrf52840 USB_trans -DOT_COMMISSIONER=ON -DOT_JOINER=ON -DOT_OTNS=ON
$ cd ./build/bin
$ arm-none-eabi-objcopy -O ihex ot-ncp-ftd ot-ncp-ftd.hex

如需刷写开发板,请按照“构建 Thread 网络”Codelab 的第 4 步中的说明使用 nrfjprog。然后,通过 nRF USB 端口将所有开发板连接到宿主机。您可以从 J-Link 端口拔下同一组 USB 转 Micro-USB 线,然后连接到 nRF52840 开发板的 nRF USB 端口。因此,只需这 6 根数据线即可运行测试。为避免这种麻烦,请使用 12 根数据线并连接到两个端口。

5. 在实际模式下运行 OTNS 服务器

通过使用默认参数运行 OTNS,用户可以模拟 Thread 网络。如需将其用作实际物理网络的可视化工具,请使用以下命令运行它:

otns -raw -real -ot-cli otns-silk-proxy

这些参数会指示 OTNS 接收描述应如何可视化 Thread 网络的 gRPC 和 UDP 消息,而不是运行多个 ot-cli 进程来模拟网络。您的浏览器应该会自动打开包含空白画布的可视化页面。

4dd5b41bf7e71334

6. 运行支持 OTNS 的 Silk 测试用例

Silk 是一个完全自动化的测试平台,用于在真实设备上验证 OpenThread 的功能、功能和系统性能。项目 README 中的说明介绍了如何使用它。

位于 silk/unit_testssilk_run_test.py 文件可让您先行一步。Silk 在运行测试用例时提供 OTNS 支持。由于 OTNS 实际模式服务已在本地运行,因此我们只需修改 silk_run_test.py 文件,使其包含输出日志文件、输入测试脚本和 hwconfig.ini 文件的所需位置。-s localhost 参数会告知 Silk 将 OTNS 消息发送到 localhost

例如,您可以对 silk_run_test.py 文件进行以下修改来运行名为 ot_test_form_network.py 的测试。/opt/openthread_test/ 是 Silk 用于日志输出和配置文件的默认路径,但您可以使用任何路径。

silk_run_test.py

import datetime
import os

from silk.tests import silk_run

RESULT_LOG_PATH = '/opt/openthread_test/results/' + 'silk_run_' + \
                  datetime.datetime.today().strftime('%m-%d') + '/'
CONFIG_PATH = '/opt/openthread_test/'

os.chdir('~/src/silk/silk/tests/')

timestamp = datetime.datetime.today().strftime('%m-%d-%H:%M')

run_log_path = RESULT_LOG_PATH + 'test_run_on_' + timestamp + '/'

argv = [
    'tests/silk_run.py',
    '-v2',
    '-c', CONFIG_PATH + 'hwconfig.ini',
    '-d', run_log_path,
    '-s', 'localhost',
    'ot_test_form_network.py'
]

silk_run.SilkRunner(argv=argv)

所形成网络的拓扑可视化将显示在 OTNS 网页界面中。

ee443b66e0a6620b.png

左上角显示了可视化统计信息、OT 版本和测试标题。左下角具有日志窗口的控件,该窗口显示在右侧。最初,添加了节点,但没有形成网络。随着测试的进行,每个节点的模式和角色会发生变化,并且会形成链接。

5c38e2c72519e620

7. 恭喜

恭喜,您已成功在物理 Thread 设备上运行 Silk 测试,并使用 OTNS 将其可视化!

您使用刷入了支持 OTNS 的固件的开发板执行了 Silk 测试。这些开发板将其状态报告给 Silk 服务器,Sillk 服务器会监控和聚合所有板,然后将这些板与其他测试信息一起发送到 OTNS 服务。在实际模式下运行的 OTNS 可在网页界面上直观呈现 Thread 网络。

后续操作

尝试运行 Silk 软件包中包含的其他 OpenThread 测试用例。

深入阅读

您可以访问 openthread.ioSilk,获取各种 OpenThread 资源。

参考文档