使用 OTNS 模擬執行緒網路

1. 簡介

5abd22afa2f2ee9a.png

什麼是 Thread 和 OTNS

Thread 是一種 IP 型低功耗網網路通訊協定,可讓裝置間的通訊成為裝置與雲端之間的通訊。執行緒網路可以適應拓撲變更,避免出現單點故障。

Google 發布的 OpenThread 是開放原始碼的 Thread 實作。儘管其小型程式碼大小和記憶體足跡,OpenThread 仍支援 Thread Spec 中定義的所有功能。

OpenThread Network Simulator (OTNS) 可用於在 posix 平台上執行模擬 OpenThread 節點,藉此模擬 Thread 網路。OTNS 提供簡單易用的網路介面 (OTNS-Web),以視覺化方式呈現與模擬模擬的 Thread 網路。

課程內容

  • 安裝 OTNS 及其依附元件
  • 為 OTNS 建構 OpenThread
  • 如何在 OTNS-Web 中新增/移動/刪除節點
  • 使用 OTNS-Web 的其他實用功能來進行網路模擬
  • 確認 OpenThread 的無單點故障

本程式碼研究室著重於 OTNS-CLI 和 OTNS-Web。OTNS 的其他功能 (例如 Python 指令碼) 不在涵蓋範圍內。

軟硬體需求

  • Linux x86_64 或 Mac OS。
  • Git
  • 前往 1.13 以上版本
  • 網路瀏覽器。OTNS-Web 使用網路瀏覽器顯示模擬結果。
  • Thread Primer。您必須瞭解 Thread 的基本概念,才能瞭解本程式碼研究室學到的內容。

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 安裝到 $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-Web

OT-CLI

OTNS-CLI 提供指令列介面 (CLI),可用於管理 OTNS 模擬。

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

您可以透過 OTNS-CLI 輸入指令。如需完整的指令清單,請參閱 OTNS CLI 參考資料。別擔心,在本程式碼研究室中,您只需要使用其中幾個指令。

OTNS-Web

OTNS-Web 是 OTNS 的網路視覺化與管理工具。這項功能會以視覺化的方式呈現模擬 Thread 網路的節點、訊息和連結。請注意 OTNS-Web 的各種元素:

4c5b43509a2ca0d0.png

6. 新增節點

透過 OTNS-CLI 新增節點

新增這個位置的路由器 (300、100)

> add router x 300 y 100
1
Done

您應該會看到在「OTNS-Web」中建立的節點。節點會啟動為路由器,並在幾秒後成為領導者:

6ca8c2e63ed9818d.png

透過 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.png

OTNS-Web新增節點

您也可以透過 OTNS-Web 新增節點。按一下 Action BarNew Router 按鈕。您應該會在 New Router 按鈕正上方建立節點。將節點拖曳到透過 OTNS-CLI 建立的領導者附近。所有節點最終應合併為一個分區:

420258bb92561146.png

另外,您也可以點選動作列中的 [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.png。這些按鈕會顯示目前的模擬速度,可用來調整模擬速度以及暫停/繼續模擬。

加快模擬速度

如要加快模擬作業的速度,請按一下 39b88331779277ad.png 按鈕,直到速度達到 MAX 為止:f5f460b2586d299b.png

減速模擬

如要減緩模擬速度,請按一下 31cca8d5b52fa900.png 按鈕。

暫停模擬

按一下「46cc2088c9aa7ab6.png」按鈕即可在執行期間暫停模擬。按鈕將變更為 ce25eda3496ffcd4.png

繼續模擬

按一下「ce25eda3496ffcd4.png」按鈕,讓實驗暫停後恢復模擬。這個按鈕會變回 46cc2088c9aa7ab6.png

將模擬速度設為 10X

為了節省時間,建議您使用

OTNS-CLI 將模擬速度調整為

10X 這樣我們就能更快觀察網路中的拓撲變化。

> speed 10
Done

8. 開啟/關閉電台

現在,模擬作業應該會包含 2 個路由器 (六邊形) 和多個子項,並以 10 倍的速度執行。

找出 2 個路由器的目前領導線 (紅線),按一下即可選取:

8c6a2e191cdae0c7.png

關閉無線通訊

按一下動作列上的 7ca085f470491dd4.png 按鈕,即可關閉主管階層節點的無線電:

a3bf58d9d125f95f.png

關閉後,主管就無法收發訊息。

等待約 12 秒 (模擬時間為 120 秒),讓其他路由器成為新的領導者:

e3d32f85c4a1b990.png

Thread 網路是透過新領導者的新型態來形成新的分區,自動從領導者故障時復原。新分區也有新的分區顏色。

開啟無線通訊

選取已關閉無線電的領導者。按一下 Action Bar 上的 2d9cecb8612b42aa.png 按鈕,即可恢復無線電連線:

7370a7841861aa3a.png

領導者應在無線電連線恢復後重新連線至網路。

9. 移動節點

OTNS 可讓使用者透過 OTNS-CLIOTNS-Web 輕鬆移動節點。

透過「OTNS-CLI」移動節點

將節點 5 移至新位置:

> move 5 600 300
Done

由於現在的節點 5 與另一個路由器距離遙遠,因此兩個節點之間應不會失去連線,在大約 12 秒 (模擬時間的 120 秒) 後,兩者都會成為各自分區的領導者:

c06b4d0a4f183299.png

透過 OTNS-Web 移動節點

拖曳節點 5 即可移回原位置。這兩個分區應重新合併為一個分區:

9ba305c4c5a5f892.png

10. 刪除節點

透過 OTNS-CLI 刪除節點

刪除節點 8:

> del 8
Done

模擬中不應出現節點 8:

18156770d9f8bf83.png

透過 OTNS-Web 刪除節點

選取節點 5,然後按一下 Action Bar 上的 7ff6afd565f4eafc.png 按鈕,即可刪除節點 5:

d4079cceea0105f0.png

由於 Node 7 無法連上任何路由器,因此 Node 1 應成為主要分支版本。

清除模擬 (刪除所有節點)

您可以透過 OTNS-Web 刪除所有節點來清除模擬作業。

按一下「Action Bar.」上的「89618191721e79a0.png」按鈕。所有節點都會一次消失。

在繼續之前...

自行在模擬器中新增一些節點,以便繼續進行本教學課程。

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 網路。

後續步驟

查看一些程式碼研究室…

參考文件