1. 簡介
什麼是 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 的空白頁面,表示瀏覽器可能未啟用 WebGL。如要瞭解如何啟用 WebGL,請參閱 https://superuser.com/a/836833。
在後續章節中,您將瞭解如何透過 OTNS-CLI
和 OTNS-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
的各種元素:
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
中看到節點:
在 OTNS-Web
中,您也可以選取任一節點,取得該節點的詳細資訊面板。舉例來說,在下圖中,系統選取了節點 1。面板中的「角色」項目確認這是領導者。
透過 OTNS-Web
新增節點
您也可以透過 OTNS-Web
新增節點。按一下 Action Bar
的 New Router
按鈕。您應該會在所選節點的右側看到一個新建立的節點。新路由器應加入現有的 Thread 分割區:
您也可以按一下「動作列」中的 FED、MED、SSED 和 BR 按鈕,建立其他類型的節點。目前應該共有 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
: 為止,加快模擬作業速度。
減慢模擬速度
您可以按一下 按鈕,放慢模擬速度。
暫停模擬
按一下 按鈕,即可在模擬作業執行時暫停。按鈕會變更為
。
繼續模擬
點選 按鈕,即可在模擬作業暫停時繼續執行。按鈕會變更回
。
將模擬速度設為 10X
為了節省時間,請使用
OTNS-CLI
將模擬速度調整為
10X
這樣我們就能更快觀察網路中的拓撲變更。
> speed 10 Done
7. 開啟/關閉廣播電台
模擬器現在應包含至少 2 個 Router (六邊形)、可能有邊界 Router (方形) 和許多子項,並以 10 倍速度執行。
找出 2 個路由器目前的領導者 (紅色邊框),然後按一下選取:
關閉無線通訊
按一下動作列的 按鈕,關閉領導者節點的無線電。關閉無線電後,隊長就無法傳送或接收訊息。
等待約 12 秒 (模擬時間為 120 秒),讓其他路由器或邊界路由器成為新的領導者:
Thread 網路會使用新的領導裝置建立新的分區,自動復原領導裝置故障的問題。新分區也有新的分區顏色。
開啟無線通訊
選取無線電已關閉的領隊。按一下 Action Bar
上的 按鈕,即可恢復無線電連線:
無線電連線恢復後,領導者應重新連結網路。
8. 移動節點
OTNS 可讓使用者透過 OTNS-CLI
或 OTNS-Web
輕鬆移動節點。
透過 OTNS-CLI
移動節點
將邊界路由器節點 9 移至新位置:
> move 9 50 50 Done
透過 OTNS-Web 移動節點
將節點 5 拖曳至右下方。由於節點 5 已超出其他路由器的無線範圍,因此會使用新的 Partition ID 建立自己的分區。只要點選節點,即可在節點資訊面板上查看分區 ID。
請注意,節點 5 和節點 9 之間仍會繪製單一綠色線條。這通常是因為子項的資訊過時,仍保留在前一個父項的子項資料表中。或者,這可能是節點 9 和節點 5 之間先前路由器對路由器連結的舊資訊。(或者,在這種情況下,甚至是轉譯錯誤)。在適當的逾時後,節點會清除過時的資訊。
9. 刪除節點
透過 OTNS-CLI
刪除節點
刪除節點 5:
> del 5 Done
節點 5 應該會從模擬中消失:
透過 OTNS-Web
刪除節點
選取邊界路由器節點 9,然後按一下 Action Bar
上的 按鈕,即可刪除節點 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_
。例如,以下是記錄檔摘錄:
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 封包檢查的範例。
如要設定解密金鑰,請在選單中依序選取「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-CLI
和 OTNS-Web
以各種方式操控模擬資料。
您現在已瞭解 OTNS 為何物,以及如何使用 OTNS 模擬 OpenThread 網路。
後續步驟
查看一些程式碼研究室…
- 使用 OpenThread 模擬 Thread 網路
- 在 Docker 中使用 OpenThread 模擬 Thread 網路
- 使用 nRF52840 板和 OpenThread 建構 Thread 網路