使用 OTNS 模拟线程网络

1. 简介

5abd22afa2f2ee9a

什么是 Thread 和加时赛

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

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

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

学习内容

  • 安装 OTNS 及其依赖项
  • 构建适用于 OTNS 的 OpenThread
  • 如何在 OTNS-Web 中添加/移动/删除节点
  • 使用 OTNS-Web 的其他实用功能进行网络模拟
  • 验证 OpenThread 的无单点故障

此 Codelab 将重点介绍 OTNS-CLI 和 OTNS-Web。不包括 OTNS 的其他功能,例如 Python 脚本。

所需条件

  • Linux x86_64 或 Mac OS。
  • Git
  • Go 1.13 及更高版本
  • 网络浏览器。OTNS-Web 使用网络浏览器显示模拟内容。
  • Thread Primer(线程入门)。您需要了解 Thread 的基本概念,才能理解此 Codelab 中介绍的内容。

2. 安装方式

安装 Go

OTNS 需要使用 Go 1.13+ 才能构建。

  1. https://golang.org/dl/ 安装 Go
  2. $(go env GOPATH)/bin(通常为 $HOME/go/bin)添加到 $PATH
$ export PATH=$PATH:$(go env GOPATH)/bin

获取 OTNS 代码

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

安装依赖项

$ ./script/install-deps
grpcwebproxy installed: /usr/local/google/home/simonlin/go/bin/grpcwebproxy

系统可能会要求您输入“sudo”的密码。

安装 otns

otns 安装到 $GOPATH/bin

$ ./script/install
otns installed: /usr/local/google/home/simonlin/go/bin/otns

我们来看看 otns 是否已正确安装

  1. 运行 which otns 以检查是否可以在 $PATH. 中搜索 otns 可执行文件
  2. 如果未找到 otns 命令,请确认您是否已将 $(go env GOPATH)/bin 添加到 $PATH.

3. 构建适用于 OTNS 的 OpenThread

从 GitHub 获取 OpenThread 代码

$ mkdir -p ~/src
$ git clone https://github.com/openthread/openthread ~/src/openthread

使用 OTNS=1 构建 OpenThread

$ cd ~/src/openthread
$ ./script/cmake-build simulation -DOT_OTNS=ON -DOT_SIMULATION_VIRTUAL_TIME=ON -DOT_SIMULATION_VIRTUAL_TIME_UART=ON -DOT_SIMULATION_MAX_NETWORK_SIZE=999

您可以在 build 目录中找到 OpenThread 可执行文件:

$ ls ~/src/openthread/build/simulation/examples/apps/cli/
ot-cli-ftd        ot-cli-mtd        ot-cli-radio

现在,可以运行 OTNS 了...

4. 运行 OTNS

运行 otns

$ cd ~/src/openthread/build/simulation/examples/apps/cli
$ otns
> ← OTNS-CLI prompt

成功启动后,OTNS 将进入 CLI 控制台 (OTNS-CLI),并启动网络浏览器以进行网络可视化和管理 (OTNS-Web):

a0e05178d66929b1.png

如果您只能看到 OTNS-Web 的空白页,可能是因为您的浏览器未启用 WebGL。请参阅https://superuser.com/a/836833 ,了解如何启用 WebGL。

在以下部分中,您将学习如何通过 OTNS-CLIOTNS-Web 管理 OTNS 模拟。

5. 了解 OTNS-CLI 和OTNS - 网站

OTNS-CLI

OTNS-CLI 提供了一个用于管理 OTNS 模拟的命令行界面 (CLI)。

$ cd ~/src/openthread/build/simulation/examples/apps/cli
$ otns
> ← OTNS-CLI prompt

您可以通过 OTNS-CLI 输入命令。如需查看完整的命令列表,请参阅 OTNS CLI 参考文档。别担心,您在此 Codelab 中只会用到其中的几个命令。

OTNS - 网站

OTNS-Web 是 OTNS 的网络可视化和管理工具。它直观地呈现了模拟 Thread 网络的节点、消息和链接。请注意 OTNS-Web 的各种元素:

4c5b43509a2ca0d0

6. 添加节点

通过 OTNS-CLI 添加节点

在位置 (300, 100) 添加一个路由器

> add router x 300 y 100
1
Done

您应该会看到一个在 OTNS-Web 中创建的节点。该节点最初是路由器,并在几秒钟内成为主要节点:

6ca8c2e63ed9818d

通过 OTNS-CLI 添加更多节点

> add fed x 200 y 100
2
Done
> add med x 400 y 100
3
Done
> add sed x 300 y 200
4
Done

等待几秒钟,让节点合并到一个分区。您应该会看到 OTNS-WEB 中的节点:

3ee67903c01aa612

OTNS-Web之前添加节点

您还可以通过 OTNS-Web 添加节点。点击 Action BarNew Router 按钮。您应该会在 New Router 按钮的正上方看到一个正在创建的节点。将节点拖动到您通过 OTNS-CLI 创建的主节点附近。所有节点最终应合并到一个分区中:

420258bb92561146

另外,点击操作栏上的 FED、MED 和 SED 按钮以创建其他类型的节点。将其拖动到现有节点附近的位置,以将其附加到该 Thread 网络:

fe15d6f9726a099e.png

现在,您已经创建了一个由一个分区组成的 Thread 网络,该分区包含多个节点。在下一部分中,我们将调整模拟速度,以提高模拟的运行速度。

7. 调整速度

目前,模拟应以 1X 的速度运行,这意味着到目前为止已用的模拟时间与我们创建第一个节点后的实际时间相同。

通过OTNS-CLI调整速度

您可以通过 OTNS-CLI 调整模拟速度。

将模拟速度设置为 100X

> speed 100
Done

您应该会看到节点发送消息的频率比以前更高。

将模拟速度设置为 MAX

> speed max
Done

现在,OTNS 正在尝试最好地尽可能快地进行模拟,因此您应该会看到节点发送大量消息。

暂停模拟

> speed 0
Done

将模拟速度设置为 0 会暂停模拟。

以正常速度恢复模拟

> speed 1
Done

将模拟速度设为大于 0 的值可恢复模拟。

通过OTNS-Web调整速度

速度控制按钮

Action Bar上找到速度控制按钮 9329157c1bd12672。这些按钮会显示当前的模拟速度,可用于调整模拟速度和暂停/恢复模拟。

加速模拟

您可以点击 39b88331779277ad 按钮来加快模拟速度,直到速度达到 MAXf5f460b2586d299b.png

放慢模拟速度

您可以点击 31cca8d5b52fa900 按钮减慢模拟速度。

暂停模拟

点击 46cc2088c9aa7ab6.png 按钮可在模拟运行时暂停模拟。该按钮将更改为“ce25eda3496ffcd4.png”。

继续模拟

点击 ce25eda3496ffcd4.png 按钮可在暂停时恢复模拟。该按钮将恢复为“46cc2088c9aa7ab6.png”。

将模拟速度设置为 10X

为了节省时间,请使用

OTNS-CLI 可将模拟速度调整为

10X ,以便我们可以更快地观察网络中的拓扑变化。

> speed 10
Done

8. 打开/关闭无线装置

现在,模拟应该包含 2 个路由器(六边形)和许多子级,并以 10 倍的速度运行。

找到 2 个路由器的当前主要副本(红色边框),点击以将其选中:

8c6a2e191cdae0c7.png

关闭无线通信

点击操作栏上的 7ca085f470491dd4 按钮,关闭“Leader”节点的单选按钮:

a3bf58d9d125f95f.png

主管将无法在关闭无线装置的情况下收发消息。

等待大约 12 秒(模拟时间为 120 秒),让另一个路由器成为新的主要副本:

e3d32f85c4a1b990.png

Thread 网络会自动从主要副本故障中恢复,创建一个包含新的主要副本的新分区。新分区也采用了新的分区颜色。

打开无线通信

选择已关闭无线电的主管。点击 Action Bar 上的 2d9cecb8612b42aa 按钮以恢复无线连接:

7370a7841861aa3a

主要副本应在无线装置连接恢复后重新连接到网络。

9. 移动节点

OTNS 可让用户通过 OTNS-CLIOTNS-Web 轻松移动节点。

通过 OTNS-CLI 移动节点

将节点 5 移动到新位置:

> move 5 600 300
Done

由于现在节点 5 离另一个路由器很远,所以它们应该彼此失去连接,并且大约 12 秒(模拟时间为 120 秒)之后,这两个节点都会成为自己分区的主要节点:

c06b4d0a4f183299.png

通过 OTNS-Web 移动节点

通过拖动将节点 5 移回原始位置。这两个分区应合并回一个分区:

9ba305c4c5a5f892

10. 删除节点

通过 OTNS-CLI 删除节点

删除节点 8:

> del 8
Done

节点 8 应该会从模拟中消失:

18156770d9f8bf83

通过 OTNS-Web 删除节点

选择节点 5,然后点击 Action Bar 上的 7ff6afd565f4eafc.png 按钮以删除节点 5:

d4079cceea0105f0.png

Node 1 应成为主要副本,Node 7 应分离,因为它无法连接到任何路由器。

清除模拟(删除所有节点)

您可以通过 OTNS-Web 删除所有节点来清除模拟。

点击 Action Bar. 上的“89618191721e79a0”按钮。所有节点将立即消失。

继续操作之前...

请自行向模拟添加一些节点,以便继续学习本教程。

11. OTNS-CLI 节点上下文

OTNS-CLI 提供节点上下文模式,支持与节点轻松交互,帮助开发者诊断节点的状态。

进入节点上下文模式

输入节点 1 的节点上下文:

> node 1
Done
node 1>

CLI 提示符已更改为 node 1>,指示当前节点上下文。您可以输入要在节点上执行的 OpenThread CLI 命令,就好像您直接与节点交互一样。

在节点上下文中执行命令

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
OpenThread
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:d800
fdde:ad00:beef:0:2175:8a67:1000:6352
fe80:0:0:0:2075:82c2:e9e9:781d
Done

切换到其他节点上下文

node 1> node 2
Done
node 2> 

退出节点上下文

node 1> exit
Done
>

12. 恭喜

恭喜,您已成功执行您的第一个 OTNS 模拟!

您学习了如何安装 OTNS 及其依赖项。您已为 OTNS 构建了 OpenThread,并使用 OpenThread 模拟实例启动了 OTNS 模拟。您已经学习了如何通过 OTNS-CLIOTNS-Web 以各种方式操纵模拟。

您现在已经知道了 OTNS 是什么,以及如何使用 OTNS 来模拟 OpenThread 网络。

后续操作

查看下列 Codelab…

参考文档