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 $ ./bootstrap
使用 Windows
如果你想使用 Windows,建議你試用這個程式碼研究室的 Docker 版本。
3. 建構 OpenThread 應用程式
安裝完成後,請建構 OpenThread 應用程式範例。本程式碼研究室使用的是模擬範例。
$ cd ~/src/openthread $ make -f examples/Makefile-simulation
現在建構 OpenThread Daemon:
$ cd ~/src/openthread $ make -f src/posix/Makefile-posix DAEMON=1
4. 模擬 Thread 網路
您將使用這個程式碼研究室的範例應用程式示範一個最低的 OpenThread 應用程式,透過基本指令列介面 (CLI) 來公開 OpenThread 設定和管理介面。
本練習將帶你完成幾個基本步驟,從另一個模擬的 Thread 裝置對已連線的 Thread 裝置進行連線偵測 (ping)。
下圖說明基本的 Thread 網路拓撲。在這個練習中,我們將模擬綠色圓圈內的兩個節點:Thread 領袖和 Thread 路由器。
對節點進行連線偵測 (ping)
1. 啟動節點 1
前往 openthread
目錄,使用 ot-cli-ftd
二進位檔為模擬的 Thread 裝置啟動 CLI 程序。
$ cd ~/src/openthread $ ./output/simulation/bin/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
稍等幾秒鐘,確認裝置已成為 Thread 領導者。「領導者」是指負責處理路由器 ID 指派作業的裝置。
> state leader Done
查看分配到 Node 1's 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,並記下該 ID 供日後使用。在上述範例輸出中,EID 為:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. 啟動節點 2
開啟新的終端機,然後前往 openthread
目錄並產生 CLI 程序。這是您第二部模擬的 Thread 裝置:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 2
注意:如果在執行指令後沒有看到 >
提示,請按下 enter
。
使用與 Node 1's 作業資料集相同的值來設定執行緒網路金鑰和 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
在 Node 1 上,檢查 Node 2's 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 |
表格中有 0xa800
的節點 1 的 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 stop Done
切換至節點 2 並查看狀態。在兩分鐘內,節點 2 偵測到主要節點 (節點 1) 處於離線狀態,您應該會看到節點 2 的轉場效果是網路的 leader
:
> state router Done ... > state leader Done
確認後,請停止 Thread 並將節點 2 恢復原廠設定以結束作業。手機已恢復原廠設定,以確保這項練習作業所使用的 Thread 網路憑證不會移轉至下一個練習階段。
> thread stop Done > factoryreset > > exit
一併將節點恢復原廠設定並結束節點 1:
> factoryreset > > exit
請參閱 OpenThread CLI 參考資料來探索所有可用的 CLI 指令。
5. 使用佣金驗證節點
在先前的練習中,您建立了 Thread 網路,其中包含兩部模擬裝置和經過驗證的連線。不過,這種做法只會允許未經驗證的 IPv6 連結本機流量在裝置之間傳送。如要在兩者之間傳輸全域 IPv6 流量 (並透過 Thread 邊界路由器進行網際網路),您必須驗證節點。
只有一部裝置可以做為佣金,才能進行驗證。委員是目前選擇的新 Thread 裝置驗證伺服器,以及提供裝置加入網路所需的網路憑證的授權服務供應商。
在本練習中,我們會採用與之前相同的雙節點拓撲。驗證時,執行緒主管將擔任顧問,是 Thread 路由器中的一員。
1. 建立網路
如果要繼續進行先前的練習,您應該已經開啟兩個終端機視窗。如果沒有,請確認兩張已開啟且可供使用。其中一個將做為節點 1,另一個則用於節點 2。
在節點 1 中,啟動 CLI 程序:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
注意:如果在執行指令後沒有看到 >
提示,請按下 enter
。
建立新的作業資料集,將其視為使用中的資料集並啟動 Thread:
> 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. 啟動「主持人」角色
在 Node 1 上,啟動啟動器角色:
> commissioner start Done
允許具有 J01NME
聯結憑證的所有加入者 (使用 *
萬用字元) 連線至網路。「人機」是一種由真人管理員新增至已委託 Thread Network 的裝置。
> commissioner joiner add * J01NME Done
3. 啟動「加入者」角色
在第二個終端機視窗中,請產生新的 CLI 程序。這是 Node 2。
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 2
在節點 2 上,使用 J01NME
連接者憑證啟用彙整者角色。
> ifconfig up Done > joiner start J01NME Done
... 請稍候片刻確認 ...
Join success
As a Joiner, the device (Node 2) has successfully authenticated itself with the Commissioner (Node 1) and received the Thread Network credentials.
由於節點 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
在 factoryreset
指令過後,您可能需要按 enter
幾次才能恢復顯示 >
提示。
6. 使用 OpenThread Daemon 管理網路
在本練習中,我們將模擬一個 CLI 執行個體 (單一內嵌 SoC Thread 裝置) 和一個無線電輔助處理器 (RCP) 執行個體。
ot-daemon
是 OpenThread Posix 應用程式的模式,使用 UNIX 通訊端做為輸入和輸出方式,讓 OpenThread 以服務形式執行。用戶端可以使用 OpenThread CLI 做為通訊協定,來連線至通訊端。
ot-ctl
是由 ot-daemon
提供的 CLI,可管理及設定 RCP。使用這項功能時,我們會將 RCP 連接到 Thread 裝置所建立的網路。
使用 Dam-ememon
這個運動將使用三個終端機視窗,對應的內容如下:
- 模擬 Thread 裝置的 CLI 執行個體 (節點 1)
ot-daemon
項程序ot-ctl
個 CLI 執行個體
如果要繼續進行先前的練習,您應該已經開啟兩個終端機視窗。開啟第三點,確定這個運動視窗有三個終端機視窗。
1. 啟動節點 1
在第一個終端機視窗中,為模擬的 Thread 裝置產生 CLI 程序:
$ cd ~/src/openthread $ ./output/simulation/bin/ot-cli-ftd 1
注意:如果在執行指令後沒有看到 >
提示,請按下 enter
。
建立新的作業資料集,將其視為使用中的資料集並啟動 Thread:
> 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
查看分配到 Node 1's 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 >
如模擬執行緒網路一節所述,一個位址是連結本機 (fe80
),而三個位址是網狀本機 (fd
)。EID 是網狀位址中,地址中不包含 ff:fe00
。這個範例輸出中的 EID 為 fd55:cf34:dea5:7994:460:872c:e807:c4ab
。
找出 ipaddr
輸出內容中用於指定與節點通訊的特定 EID。
2. 啟動 Da-ememon
在第二個終端機視窗中,瀏覽至 openthread
目錄,然後為 RCP 節點啟動 ot-daemon
,也就是所謂的節點 2。使用 -v
詳細標記以便查看記錄輸出內容並確認執行中:
$ cd ~/src/openthread $ ./output/posix/bin/ot-daemon -v \ 'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'
如果成功,詳細模式中的 ot-daemon
會產生類似以下的輸出內容:
ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15 ot-daemon[228024]: Thread version: 2 ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08
將這個終端機保持開啟,在背景中執行。因此,請勿在其中輸入其他指令。
3. 使用 ot-ctl 加入網路
我們尚未將節點 2 (ot-daemon
RCP) 委任給任何 Thread 網路。這時「ot-ctl
」就能派上用場。ot-ctl
使用與 OpenThread CLI 應用程式相同的 CLI。因此,您可以控制 ot-daemon
節點,方法與其他模擬的 Thread 裝置相同。
在第三個終端機視窗中,啟動 ot-ctl
:
$ ./output/posix/bin/ot-ctl >
您將使用這個第三個終端機視窗中的 ot-ctl
,管理您在 ot-daemon
與第二個終端機視窗中開始的節點 2 (RCP 節點)。檢查節點 2 的 state
:
> state disabled Done
取得節點 2 的 eui64
,以限制合併到特定彙整器:
> eui64 18b4300000000001 Done
在 Node 1(第一端子窗口)上,啟動 Commissioner,限制只為那 eui64 加入:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
在節點 2 (第三個終端機視窗) 中,開啟網路介面並加入網路:
> ifconfig up Done > joiner start J01NME Done
... 請稍候片刻確認 ...
Join success
As a Joiner, the RCP (Node 2) has successfully authenticated itself with the Commissioner (Node 1) and received the Thread Network credentials.
現在將 Node 2 加入 Thread 網路:
> thread start Done
4. 驗證網路驗證
請查看節點 2 上的 state
,以驗證節點是否已加入該網路。節點 2 會在兩分鐘內從 child
轉換到 router
:
> state child Done ... > state router Done
5. 驗證連線
使用 Ctrl+D 或 exit
指令退出 ot-ctl
,然後在主機機器的指令列 1 上使用節點的 EID 搭配 ping6
指令執行連線偵測 (ping) 1。如果 ot-daemon
RCP 執行個體已成功加入並與 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 模擬第一個執行緒網路。太棒了!
在這個程式碼研究室中,您已學到以下內容:
- 設定 OpenThread 建構工具鍊
- 模擬 Thread 網路
- 驗證 Thread 節點
- 透過 OpenThread Daemon 管理 Thread 網路
如要瞭解詳情,請參閱以下參考資料: