1. 簡介
Google 發布的 OpenThread 是 Thread 網路通訊協定的開放原始碼實作。Google Nest 已發布 OpenThread,開放開發人員廣泛使用 Nest 產品中的技術,加快智慧聯網家庭產品的開發速度。
Thread 規格定義了適用於家用應用程式的 IPv6 型可靠、安全低功率無線裝置對裝置通訊協定。OpenThread 實作所有 Thread 網路層,包括 IPv6、6LoWPAN、IEEE 802.15.4,以及 MAC 安全性、網狀連結建立和網格轉送。
本程式碼研究室會逐步引導您在模擬裝置上模擬 Thread 網路。
課程內容
- 如何設定 OpenThread 建構工具鍊
- 如何模擬 Thread 網路
- 如何驗證 Thread 節點
- 如何使用 OpenThread Daemon 管理 Thread 網路
軟硬體需求
- Git
- Linux、網路轉送的基本知識
2. 設定建構系統
Git
必須要有 Git 才能完成這個程式碼研究室。請先下載並安裝,再繼續操作。
安裝完成後,請按照特定作業系統的操作說明下載及建構 OpenThread。
Mac OS X 適用的 XCode
如要在 Mac OS X 上安裝及建構 OpenThread,需要 XCode。
安裝 XCode 後,安裝 XCode 指令列工具:
$ xcode-select --install
在 Linux / Mac OS X 上建構
這些安裝操作說明已在 Ubuntu Server 14.04 LTS 和 Mac OS X Sierra 10.12.6 上經過測試。
安裝 OpenThread。bootstrap
指令會確保工具鍊已安裝,且環境設定正確:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
使用 Windows
如果您偏好 Windows,建議您試用本程式碼研究室的 Docker 版本。
3. 建構 OpenThread 應用程式
安裝完成後,請建構 OpenThread 範例應用程式。在本程式碼研究室中,使用的是模擬範例。
$ cd ~/src/openthread $ ./script/cmake-build simulation
現在建構 OpenThread Daemon:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. 模擬 Thread 網路
在這個程式碼研究室中,您會使用的範例應用程式示範最小的 OpenThread 應用程式,讓應用程式透過基本指令列介面 (CLI) 公開 OpenThread 設定和管理介面。
本練習會逐步引導你使用另一個模擬的 Thread 裝置,對一部模擬的 Thread 裝置進行連線偵測 (ping)。
下圖說明基本的 Thread 網路拓撲。在本練習中,我們會模擬綠色圓圈內的兩個節點:Thread 領導人和 Thread 路由器,這兩者之間使用單一連線。
對節點進行連線偵測 (ping)
1. 啟動節點 1
前往 openthread
目錄,使用 ot-cli-ftd
二進位檔產生模擬 Thread 裝置的 CLI 程序。
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
注意:如果在執行這個指令後沒有看到 >
提示,請按下 enter
。
這個二進位檔會在 POSIX 上方實作模擬的 OpenThread 裝置。IEEE 802.15.4 無線電驅動程式是在 UDP 之上實作 (IEEE 802.15.4 影格會在 UDP 酬載中傳遞)。
1
的引數是檔案描述元,代表「原廠指派」中最低位元的模擬裝置 IEEE EUI-64。將這個值繫結至 IEEE 802.15.4 無線電模擬的 UDP 通訊埠 (通訊埠 = 9000 + 檔案描述元) 時,也會使用這個值。本程式碼研究室中模擬 Thread 裝置的每個執行個體都會使用不同的檔案描述元。
注意:只有在為模擬裝置產生程序時,才能使用 1
以上的檔案描述元。0
的檔案描述元已保留供其他用途使用。
建立新的作業資料集,並修訂為有效資料集。作業資料集是您正在建立的 Thread 網路的設定。
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
將這個資料集提交為使用中的資料集:
> dataset commit active Done
開啟 IPv6 介面:
> ifconfig up Done
啟動 Thread 通訊協定作業:
> thread start Done
等待幾秒鐘,然後確認該裝置已成為執行緒領導者。領導者是負責管理路由器 ID 指派作業的裝置,
> state leader Done
查看指派給節點 1 Thread 介面的 IPv6 位址 (輸出內容會有所不同):
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
請注意特定的 IPv6 位址類型:
- 開頭為
fd
= Mesh-local - 開頭為
fe80
= link-local
網狀本機位址類型會進一步區分:
- 包含
ff:fe00
= 路由器定位器 (RLOC) - 不包含
ff:fe00
= 端點 ID (EID)
在控制台輸出內容中找出 EID,請記下這個 EID 供日後使用。以上範例的輸出內容中的 EID 為:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. 啟動節點 2
開啟新的終端機並前往 openthread
目錄,然後產生 CLI 程序。這是第二部模擬 Thread 裝置:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
注意:如果在執行這個指令後沒有看到 >
提示,請按下 enter
。
使用與 Node 1 作業資料集相同的值,設定 Thread 網路金鑰和 PAN ID:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
將這個資料集提交為使用中的資料集:
> dataset commit active Done
開啟 IPv6 介面:
> ifconfig up Done
啟動 Thread 通訊協定作業:
> thread start Done
裝置會自行初始化為子項。Thread Child 則等同於終端裝置,這種 Thread 裝置僅會透過上層裝置傳輸及接收單點傳播流量。
> state child Done
2 分鐘內,狀態應該就會從 child
切換為 router
。Thread 路由器能在 Thread 裝置之間轉送流量。也稱為「父項」。
> state router Done
驗證網路
確認網狀網路的簡單方法,就是查看路由器表。
1. 請檢查連線狀態
請在節點 2 上取得 RLOC16。RLOC16 是裝置 RLOC IPv6 位址的最後 16 位元。
> rloc16 5800 Done
在節點 1 上,查看節點 2 的 RLOC16 路由器表格。確認節點 2 已先切換至路由器狀態。
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
資料表中發現節點 1 的 0xa800
的 RLOC,表示其已連線至網格。
2. 來自節點 2 的連線偵測節點 1
驗證兩部模擬 Thread 裝置之間的連線。在節點 2 中,ping
指派給節點 1 的 EID:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
按下 enter
即可返回 >
CLI 提示。
測試網路
現在,您已能在兩部模擬的 Thread 裝置之間順利進行連線偵測 (ping),請將其中一個節點離線測試網狀網路。
返回節點 1 並停止 Thread:
> thread stop Done
切換至節點 2 並檢查狀態。節點 2 會在兩分鐘內偵測到主要版本 (Node 1) 處於離線狀態,您應該會看到 Node 2 轉換至網路的 leader
:
> state router Done ... > state leader Done
確認後,請停止 Thread 並將 Node 2 恢復原廠設定,再退出。系統已恢復原廠設定,確保我們在此練習中使用的 Thread 網路憑證不會轉移到下一次練習。
> thread stop Done > factoryreset > > exit
一併恢復原廠設定並結束節點 1:
> factoryreset > > exit
請參閱 OpenThread CLI 參考資料,探索所有可用的 CLI 指令。
5. 透過調校功能驗證節點
在先前的練習中,您設定了包含兩部模擬裝置和已驗證連線的 Thread 網路。不過,這項設定只允許未經驗證的 IPv6 連結本機流量在裝置之間傳遞。如要在節點之間轉送全域 IPv6 流量 (透過 Thread 邊界路由器和網際網路),必須驗證節點。
必須有一部裝置擔任委員會驗證者,才能進行驗證。委員會是目前為新 Thread 裝置選取的驗證伺服器,以及授權者提供裝置加入網路所需的網路憑證。
在本練習中,我們將使用和之前一樣使用相同的雙節點拓撲。在驗證方面,Thread 主管會擔任委員會 (Commissioner),Thread Router 做為彙整者。
1. 建立網路
如果繼續之前的運動,您應該已經開啟兩個終端機視窗。如果沒有,請確認兩個已開啟且可供使用。其中一個用做節點 1,另一個當做節點 2。
在節點 1 中,產生 CLI 程序:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
注意:如果在執行這個指令後沒有看到 >
提示,請按下 enter
。
建立新的作業資料集,將其修訂為有效資料集,並啟動執行緒:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
將這個資料集提交為使用中的資料集:
> dataset commit active Done
開啟 IPv6 介面:
> ifconfig up Done
啟動 Thread 通訊協定作業:
> thread start Done
稍候片刻,然後確認裝置已成為 Thread 領導者:
> state leader Done
2. 啟動「佣金」角色
在節點 1 中,啟動「佣金」角色:
> commissioner start Done
允許所有加入者 (使用*
萬用字元) 搭配J01NME
彙整憑證,以允許加入網路。「彙整者」是指由系統管理員新增至受委託 Thread 網路中的裝置。
> commissioner joiner add * J01NME Done
3. 啟動彙整角色
在第二個終端機視窗中,產生新的 CLI 程序。此為節點 2。
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
在節點 2 上,使用 J01NME
彙整者憑證啟用彙整角色。
> ifconfig up Done > joiner start J01NME Done
... 請稍待片刻的確認 ...
Join success
作為彙整器,裝置 (Node 2) 已成功透過 Commissioner (Node 1) 驗證本身,並收到 Thread 網路憑證。
節點 2 已通過驗證,可以啟動 Thread:
> thread start Done
4. 驗證網路驗證
檢查節點 2 上的 state
,驗證是否已加入網路。節點 2 會在兩分鐘內從 child
轉換至 router
:
> state child Done ... > state router Done
5. 重新設定
如要為下一次練習做好準備,請重設設定。在每個節點上停止 Thread、恢復原廠設定,然後退出模擬的 Thread 裝置:
> thread stop Done > factoryreset > > exit
您可能需要多次按下 enter
,才能在執行 factoryreset
指令後再次顯示 >
提示。
6. 使用 OpenThread Daemon 管理網路
在這個練習中,我們將模擬一個 CLI 執行個體 (一個嵌入式 SoC Thread 裝置) 和一個無線電合作處理器 (RCP) 執行個體。
ot-daemon
是 OpenThread Posix 應用程式的模式,使用 UNIX 通訊端做為輸入和輸出內容,因此 OpenThread 核心能以服務形式執行。用戶端可以使用 OpenThread CLI 做為通訊協定連線至通訊端,藉此與這項服務通訊。
ot-ctl
是 ot-daemon
提供的 CLI,用於管理及設定 RCP。這樣就能將 RCP 連線到 Thread 裝置建立的網路。
使用 ot-daemon
這項練習會使用三個終端機視窗,對應以下項目:
- 模擬 Thread 裝置的 CLI 執行個體 (節點 1)
ot-daemon
處理節點ot-ctl
個 CLI 執行個體
如果繼續之前的練習,您應該已經開啟兩個終端機視窗。請開三分之一,確保有三個終端機視窗可用於此練習。
1. 啟動節點 1
在第一個終端機視窗中,為模擬 Thread 裝置產生 CLI 程序:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
注意:如果在執行這個指令後沒有看到 >
提示,請按下 enter
。
建立新的作業資料集,將其修訂為有效資料集,並啟動執行緒:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
將這個資料集提交為使用中的資料集:
> dataset commit active Done
開啟 IPv6 介面:
> ifconfig up Done
啟動 Thread 通訊協定作業:
> thread start Done
查看指派給節點 1 Thread 介面的 IPv6 位址:
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
如「模擬 Thread 網路」步驟所述,一個是連結本機位址 (fe80
),而三個位址為「網狀本機」(fd
)。EID 是位址中不含 ff:fe00
的網狀本機位址。在此輸出範例中,EID 為 fd55:cf34:dea5:7994:460:872c:e807:c4ab
。
從 ipaddr
輸出內容中找出特定 EID,這會用來與節點通訊。
2. 開始 ot-daemon
在第二個終端機視窗中,前往 openthread
目錄,然後針對 RCP 節點啟動 ot-daemon
(我們將呼叫 Node 2)。使用 -v
詳細標記,即可查看記錄輸出並確認該輸出內容正在運作,並確認使用 sudo
:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty://build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
如果成功,詳細模式中的 ot-daemon
會產生類似以下的輸出內容:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
請讓這個終端機保持開啟,並在背景中執行。您不必再輸入任何指令。
3. 使用 ot-ctl 加入網路
我們尚未將節點 2 (ot-daemon
RCP) 委託到任何 Thread 網路。這時 ot-ctl
就能派上用場。ot-ctl
使用與 OpenThread CLI 應用程式相同的 CLI。因此,您可以採用與其他模擬的 Thread 裝置相同的方式控制 ot-daemon
節點。
在第三個終端機視窗中,啟動 ot-ctl
:
$ sudo ./build/posix/src/posix/ot-ctl >
注意:如果在執行這個指令後沒有看到 >
提示,請按下 enter
。
您將在第三個終端機視窗中使用 ot-ctl
,管理透過 ot-daemon
在第二個終端機視窗中啟動的節點 2 (RCP 節點)。檢查節點 2 的 state
:
> state disabled Done
取得節點 2 的 eui64
,限制只能加入特定彙整器:
> eui64 18b4300000000001 Done
在節點 1 (第一個終端機視窗) 中,啟動 Agenter,然後限制只有該 eui64 能加入會議:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
在節點 2 (第三個終端機視窗) 上,開啟網路介面並加入網路:
> ifconfig up Done > joiner start J01NME Done
... 請稍待片刻的確認 ...
Join success
RCP (Node 2) 作為彙整工具,已成功透過委員會 (Node 1) 驗證自身,並收到 Thread 網路憑證。
現在將節點 2 加入 Thread 網路:
> thread start Done
4. 驗證網路驗證
檢查節點 2 上的 state
,驗證是否已加入網路。節點 2 會在兩分鐘內從 child
轉換至 router
:
> state child Done ... > state router Done
5. 驗證連線能力
如要結束 ot-ctl
,請使用 Ctrl+D 或 exit
指令,並在主機機器的指令列 (對節點 1 連線偵測 (ping)) 中搭配使用 ping6
指令。如果 ot-daemon
RCP 執行個體已成功加入 Thread 網路並與 Thread 網路通訊,連線偵測 (ping) 成功:
$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
7. 恭喜!
您已成功使用 OpenThread 模擬第一個 Thread 網路。太棒了!
在本程式碼研究室中,您已瞭解如何:
- 設定 OpenThread 建構工具鍊
- 模擬 Thread 網路
- 驗證 Thread 節點
- 使用 OpenThread Daemon 管理 Thread 網路
如要瞭解詳情,請參閱下列參考資料: