使用 OTNS 模擬 Thread 網路

程式碼研究室簡介
schedule30 分鐘
subject上次更新時間:2025年5月15日
account_circle作者:Simon Lin, Colin Tan, Esko Dijk

1. 簡介

Thread 網狀網路拓撲的曝光

什麼是 Thread 和 OTNS

Thread 是一種 IP 架構的低耗電無線網狀網路通訊協定,可實現安全的裝置對裝置和裝置對雲端通訊。Thread 網路可因應拓樸結構變更,避免單點故障。

Google 發布的 OpenThread 是 Thread 的開放原始碼實作項目。雖然 OpenThread 的程式碼大小和記憶體占用空間較小,但仍支援 執行緒規格中定義的所有功能。

OpenThread Network Simulator (OTNS) 可在 POSIX 平台上執行模擬的 OpenThread 節點,用於模擬 Thread 網路。OTNS 提供簡單易用的網頁介面 (OTNS-Web),可用於模擬 Thread 網路的視覺化和操作。您也可以使用 Python 指令碼進行模擬。

課程內容

  • 安裝 OTNS 及其依附元件
  • 瞭解 OTNS-CLI 的基本概念
  • 如何在 OTNS-Web 中新增/移動/刪除 OpenThread 節點
  • 使用 OTNS-Web 的其他實用功能控管網路模擬
  • 驗證 OpenThread 的無單一故障點
  • 在 Wireshark 中查看 OpenThread 節點之間的資料流量

本程式碼研究室著重於 OTNS-CLI 和 OTNS-Web 的互動使用方式。但不包括 OTNS 的其他功能,例如 Python 指令碼。

軟硬體需求

  • 建議使用 Linux x86_64,或 Mac OS 搭配 Homebrew。Windows WSL2 中的 Ubuntu 22/24 也應該可以運作,但可能需要手動調整設定。
  • Git
  • 網路瀏覽器。OTNS-Web 會使用網路瀏覽器顯示模擬作業。
  • 執行緒入門。您必須瞭解 Thread 的基本概念,才能理解本程式碼研究室的內容。

術語

「Router」一詞是 Thread Mesh Extender 的技術術語,最初稱為 Thread Router。「節點」是指 OTNS 模擬中任何模擬的 OpenThread 裝置。

2. 安裝

取得 OTNS 驗證碼

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

本程式碼研究室中後續的所有主控台指令,都是從 otns 目錄執行。

啟動載入和安裝

bootstrap 指令碼會安裝依附元件 (包括 Python 3 和 Go/Golang,視需要而定),並安裝 OTNS。它也會建構各種可直接在模擬中使用的 OT 節點類型,並執行一些基本測試。由於節點會進行建構,因此可能需要幾分鐘的時間。

$ ./script/bootstrap
....
....
OTNS installed - use 'otns' to start it.
$

系統可能會要求您輸入 sudo 的密碼。

如果未正確安裝 otns

指令碼可能會回報以下錯誤:

....
OTNS installed - please add ~/go/bin to your PATH variable first, to use it.
$

在這種情況下,您需要在 $PATH. 中新增 $(go env GOPATH)/bin

如果發生其他錯誤,您可以建立 GitHub 問題

3. 首次執行 OTNS

執行 otns

$ otns
>_ ← OTNS-CLI prompt

成功啟動後,OTNS 會進入 CLI 主控台 (OTNS-CLI),並啟動網路視覺化和管理的網路瀏覽器 (OTNS-Web):

啟動時的 OTNS-Web 視窗

如果您只看到 OTNS-Web 的空白頁面,表示瀏覽器可能未啟用 WebGL。如要瞭解如何啟用 WebGL,請參閱 https://superuser.com/a/836833

在後續章節中,您將瞭解如何透過 OTNS-CLIOTNS-Web 管理 OTNS 模擬資料。

4. 瞭解 OTNS-CLI 和 OTNS-Web

OTNS-CLI

OTNS-CLI 是用於管理 OTNS 模擬資料的指令列介面 (CLI)。

$ otns
>_ ← OTNS-CLI prompt

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

輸入 help 指令,即可查看 CLI 指令的概覽。這份清單與 CLI 參考資料相同。

> help
add             Add a node to the simulation and get the node ID.
....
....
Done
> 

如要進一步瞭解特定指令,請使用指令名稱,例如:

> help add
add
  Add a node to the simulation and get the node ID.
  
Definition:
....
....
> 

OTNS-Web

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

OTNS-Web 元素說明

5. 新增節點

透過 OTNS-CLI 新增節點

在模擬中加入 Thread Router:

> add router
1
Done

您應該會在 OTNS-Web 中看到已建立的節點。節點一開始是 Router,幾秒後就會成為 Leader:

領導者角色中的一個節點

為了讓您能輕鬆以互動方式啟動模擬,每個新的 OpenThread 節點預設會使用標準的網路參數組合進行調試。

透過 OTNS-CLI 新增更多節點

接下來,我們將新增不同類型的節點。

> add fed
2
Done
> add med
3
Done
> add sed
4
Done

請稍待片刻,讓節點合併為一個區隔。您應該會在 OTNS-Web 中看到節點:

包含 4 個節點的 Thread 網路

OTNS-Web 中,您也可以選取任一節點,取得該節點的詳細資訊面板。舉例來說,在下圖中,系統選取了節點 1。面板中的「角色」項目確認這是領導者。

包含 4 個節點的 Thread 網路,已選取節點 1

透過 OTNS-Web 新增節點

您也可以透過 OTNS-Web 新增節點。按一下 Action BarNew Router 按鈕。您應該會在所選節點的右側看到一個新建立的節點。新路由器應加入現有的 Thread 分割區:

新增路由器,總共 5 個節點

您也可以按一下「動作列」中的 FED、MED、SSED 和 BR 按鈕,建立其他類型的節點。目前應該共有 9 個節點。如有需要,您可以將部分節點拖曳到其他位置,建立不同的實體網路拓撲。

新增多個節點,總計 9 個節點

您現在已建立了包含多個節點的一個區隔的 Thread 網路。在下一節中,我們將調整模擬速度,讓模擬作業執行得更快。

6. 調整速度

目前,模擬作業應以 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 上找出速度控制按鈕 速度控制按鈕。這些按鈕會顯示目前的模擬速度,並可用於調整模擬速度,以及暫停/繼續模擬。

加快模擬速度

您可以按一下 調高速度按鈕 按鈕,直到速度達到 MAX模擬速度指標 (MAX) 為止,加快模擬作業速度。

減慢模擬速度

您可以按一下 降低速度按鈕 按鈕,放慢模擬速度。

暫停模擬

按一下 暫停按鈕 按鈕,即可在模擬作業執行時暫停。按鈕會變更為 「播放」按鈕

繼續模擬

點選 「播放」按鈕 按鈕,即可在模擬作業暫停時繼續執行。按鈕會變更回 暫停按鈕

將模擬速度設為 10X

為了節省時間,請使用

OTNS-CLI 將模擬速度調整為

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

> speed 10
Done

7. 開啟/關閉廣播電台

模擬器現在應包含至少 2 個 Router (六邊形)、可能有邊界 Router (方形) 和許多子項,並以 10 倍速度執行。

找出 2 個路由器目前的領導者 (紅色邊框),然後按一下選取:

已選取領導節點 1 的 Thread Network

關閉無線通訊

按一下動作列的 圓形按鈕 按鈕,關閉領導者節點的無線電。關閉無線電後,隊長就無法傳送或接收訊息。

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

新分割區已建立,節點 9 為新的領導節點

Thread 網路會使用新的領導裝置建立新的分區,自動復原領導裝置故障的問題。新分區也有新的分區顏色。

開啟無線通訊

選取無線電已關閉的領隊。按一下 Action Bar 上的 開啟圓形按鈕 按鈕,即可恢復無線電連線:

節點 1 在無線電重新開啟後加入分區

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

8. 移動節點

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

透過 OTNS-CLI 移動節點

將邊界路由器節點 9 移至新位置:

> move 9 50 50
Done

透過 OTNS-Web 移動節點

將節點 5 拖曳至右下方。由於節點 5 已超出其他路由器的無線範圍,因此會使用新的 Partition ID 建立自己的分區。只要點選節點,即可在節點資訊面板上查看分區 ID。

節點 5 已從其他節點移出,並形成新的分區

請注意,節點 5 和節點 9 之間仍會繪製單一綠色線條。這通常是因為子項的資訊過時,仍保留在前一個父項的子項資料表中。或者,這可能是節點 9 和節點 5 之間先前路由器對路由器連結的舊資訊。(或者,在這種情況下,甚至是轉譯錯誤)。在適當的逾時後,節點會清除過時的資訊。

9. 刪除節點

透過 OTNS-CLI 刪除節點

刪除節點 5:

> del 5
Done

節點 5 應該會從模擬中消失:

從模擬中刪除節點 5

透過 OTNS-Web 刪除節點

選取邊界路由器節點 9,然後按一下 Action Bar 上的 「刪除」按鈕 按鈕,即可刪除節點 9:

邊界路由器節點 9 已刪除

Node 1 應成為新分割區的領導節點,所有剩餘的節點都會以子節點的形式附加至節點 1。

10. 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
otns
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:b400
fd00:f00d:cafe:0:2505:8719:3685:ebfb
fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb
fe80:0:0:0:e86a:e07:ec97:777
Done

切換至其他節點內容

node 1> node 2
Done
node 2> 

退出節點內容

node 1> exit
Done
>

node 0 指令是另一種退出節點內容的方式。

11. 查看節點記錄和封包擷取內容

OpenThread 節點記錄檔

根據預設,OTNS 會為所有模擬的 OpenThread 節點產生詳細記錄檔案。您可以在 ./tmp 目錄中查看這些檔案。檔案名稱為 0_.log。例如,以下是記錄檔摘錄:

7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-:     src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6    | ..&..!.eSZCN.Y.  |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-:     src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---:     12 0x3000 - me - leader

左側顯示以微秒為單位的絕對模擬時間。hh:mm:ss 時間戳記會顯示 OpenThread 節點本身的記錄時間戳記,可能與絕對模擬時間不同。

Wireshark 封包擷取

根據預設,所有傳送的 IEEE 802.15.4 影格都會擷取至 PCAP 檔案 current.pcap。在模擬期間或之後,Wireshark 可以讀取這個檔案。由於 Thread 採用連結層加密,因此必須在 Wireshark 中執行一次性設定動作,才能正確設定 OTNS 的解密金鑰。根據預設,系統會使用一個眾所皆知的網路金鑰,讓 Wireshark 輕鬆解密影格。

請參閱下方螢幕截圖,瞭解 Wireshark 中 OpenThread 封包檢查的範例。

Wireshark 中 OpenThread 封包分析的螢幕截圖

如要設定解密金鑰,請在選單中依序選取「Edit」->「Preferences」。接著,在偏好設定視窗中,依序選取「Protocols」->「IEEE 802.15.4」。按一下「解密金鑰」旁的「編輯...」按鈕。按一下 + 建立新的項目,然後輸入鍵 00112233445566778899aabbccddeeff (32 個字元),並在「Key hash」欄位中選取「Thread hash」。「解密金鑰索引」可保留為 0。接著按一下「確定」,再按一下「確定」。這樣一來,OTNS PCAP 檔案在載入時應可正確解密。

「時間」欄中顯示的時間戳記 (以秒為單位) 會對應至 OpenThread 節點記錄中的絕對模擬時間值。這樣一來,您就能更輕鬆地將記錄訊息與傳送或接收的無線電資料框建立關聯。不過,值通常不會精確到毫秒:在 OpenThread 堆疊要求傳送無線電資料幀後,模擬的 IEEE 802.15.4 無線電硬體可能會增加一些延遲。

12. 恭喜

恭喜,您已成功執行第一個 OTNS 模擬!

您已瞭解如何安裝 OTNS 及其依附元件。您已使用 OpenThread 模擬節點啟動 OTNS 模擬。您已瞭解如何透過 OTNS-CLIOTNS-Web 以各種方式操控模擬資料。

您現在已瞭解 OTNS 為何物,以及如何使用 OTNS 模擬 OpenThread 網路。

後續步驟

查看一些程式碼研究室…

參考文件