1. 簡介
OpenThread 是由 Google Nest 團隊發布,是採用 Thread® 網路通訊協定的開放原始碼實作項目,可加快智慧聯網家庭產品的開發速度。Thread 規格:為住家和商業建構應用程式定義採用 IPv6 的可靠安全無線裝置對裝置通訊協定。
Espressif 已根據 FreeRTOS 和 LwIP 移植 OpenThread 堆疊,方便開發人員快速建構 Thread 網路。您可以從 GitHub 取得相關原始碼。同時,Espressif 也根據 RTOS 實作 Thread 邊界路由器。
在本程式碼研究室中,您將在實際硬體上編寫 OpenThread、建立及管理 Thread 網路,以及在節點之間傳遞訊息。
課程內容
- 建構 OpenThread CLI 二進位檔,並刷新至 ESP 板。
- 為 ESP Thread 邊界路由器電路建構及刷新邊界路由器。
- 使用 ESP 監控器和 OpenThread CLI 手動管理 Thread 節點。
- 在 Thread 邊界路由器上建立 Thread 網路。
- 確保裝置佈建至 Thread 網路的安全。
- 在 Thread 節點之間對 IPv6 位址進行連線偵測 (ping)。
- 使用 UDP 在 Thread 節點之間傳遞訊息。
軟硬體需求
硬體:
軟體:
2. 開始使用
- ESP-IDF 安裝。
請按照 ESP-IDF 程式設計指南的指示安裝軟體開發環境。
- 複製 ESP Thread 邊界路由器 SDK。
ESP-THREAD-BR 是官方的 ESP Thread Border Router SDK。它支援所有基礎網路功能,用於建構 Thread 邊界路由器,並整合豐富的產品層級功能,以便快速完成產品化。
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. 建構及刷新
如要使用 IEEE 802.15.4 模組在 ESP 機台上建構及刷新 ot-cli-ftd 二進位檔案,請參考 ESP-IDF 範例 ot_cli,瞭解詳情:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
透過選單設定啟用彙整功能:
$ idf.py menuconfig
元件設定 >OpenThread >啟用 Joiner,然後建構並閃爍。
$ idf.py -p <your-local-port> build flash monitor
如要在 ESP Thread 邊界路由器 Board 上建構及刷新 ot-br 二進位檔案,您必須先建構 RCP 二進位檔案。這個 RCP 二進位檔案不需要在 ESP Thread 邊界路由器電路板上明確刷新至裝置。它會包含在邊界路由器二進位檔案內,並在首次啟動 (或 RCP 韌體變更) 時刷新至 ESP32-H2 晶片。詳情請參閱 ESP Thread BR 文件:
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
透過選單設定啟用佣金器功能:
$ idf.py menuconfig
元件設定 >OpenThread >請啟用 Commissioner,然後建構並刷新。
$ idf.py -p <your-local-port> build flash monitor
4. 在 Thread 邊界路由器上建立 Thread 網路
您現在可以使用 ESP Thread 邊界路由器 Board (BR Commissioner) 的 OpenThread 指令列,建立 Thread 網路:
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
將這個資料集提交為使用中的資料集:
> dataset commit active Done
開啟 IPv6 介面:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
啟動 Thread 通訊協定作業:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
稍候片刻,然後檢查裝置狀態。他應該是領導者。
> state leader Done >
5. 透過 networkkey 加入 Thread 網路
在本程式碼研究室中,有兩個帶有 IEEE 802.15.4 模組的 ESP 主機板,準備加入 BR 形成的網路。在這場講座中,我們會將 Board1 新增至網路。
從 BR 取得網路金鑰:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
透過 IEEE 802.15.4 模組,將這個網路金鑰設為一個 ESP 主機板 (Board1 聯結器):
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
將這個資料集提交為使用中的資料集:
> dataset commit active Done
開啟 IPv6 介面:
> ifconfig up Done I (20308) OT_STATE: netif up
啟動 Thread 通訊協定作業:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
稍候片刻,然後檢查裝置狀態。資源應為兒童。
> state child Done
將角色設為路由器。
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
6. 透過安全調控功能加入 Thread 網路
在這個講座中,我們會透過安全性調校功能將 Board2 新增至網路:
取得 BR 委員會提供的 PSKc 和 panid:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
將網路資訊設為 Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
將這個資料集提交為使用中的資料集:
## Board2 Joiner ## ---------------------- > dataset commit active Done
開啟 IPv6 介面:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
從 Board2 取得 eui64:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
在「BR 委員會」中啟動佣金器,並指定可彙整的裝置 eui64
,以及彙整者憑證,例如 J01NME
。彙整憑證是裝置專屬字串,由所有大寫英數字元 (0 至 9 和 A-Y 組成,但不包括 I、O、Q 和 Z),長度介於 6 至 32 個字元。
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
切換至 Board2 加入器。使用剛剛在 BR 委員會設定的彙整者憑證建立彙整角色:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
大約一分鐘內,您會收到驗證成功的確認訊息:
## Board2 Joiner ## ---------------------- > Join success
接著,您就可以啟動並加入由 BR 委員會組成的 Thread 網路。
啟動 Thread 通訊協定作業:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
將角色設為路由器。
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
現在,您可以使用下列拓撲的 Thread 網路:
7. 對 Thread 節點之間的 IPv6 位址進行連線偵測 (ping)
您可以使用連線偵測 (ping) 指令在任兩個 Jamboard 之間進行通訊。使用 ipaddr
指令顯示每個主機板的 IPv6 位址:
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
例如,如要從 BR 委員會對 Board2 MLE-ID 進行連線偵測 (ping),您可以在 BR 委員會執行這個指令:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
8. 使用 UDP 在 Thread 節點之間傳遞訊息
在這個工作階段中,您將瞭解如何在兩部 Thread 裝置之間傳送訊息。例如,您可以在通訊埠 20617
上開啟 udp 並繫結,然後監聽 BR 上的所有位址:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
接著,從 Board1 將訊息傳送至 BR MLE-ID 地址和通訊埠 20617
:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
您可以在 BR 查看收到的訊息:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. 恭喜!
你已使用 ESP 面板建立實體 Thread 網路!
您已經知道:
- 建構 OpenThread CLI 二進位檔,並刷新至 ESP 板。
- 為 ESP Thread 邊界路由器電路打造閃爍的邊界路由器。
- 使用 ESP 監控器和 OpenThread CLI 手動管理 Thread 節點。
- 在 Thread 邊界路由器上建立 Thread 網路。
- 確保裝置佈建至 Thread 網路的安全。
- 在 Thread 節點之間對 IPv6 位址進行連線偵測 (ping)。
- 使用 UDP 在 Thread 節點之間傳遞訊息。
延伸閱讀
歡迎前往 openthread.io 和 GitHub 查看各種 OpenThread 資源,包括:
- 支援平台 - 找出所有支援 OpenThread 的平台
- 建構 OpenThread - 進一步瞭解建構及設定 OpenThread
- Thread Primer - 涵蓋本程式碼研究室介紹的所有 Thread 概念
參考資料: