運用 ESP32H2 和 ESP Thread 邊界路由器板打造 Thread 網路

1. 簡介

26b7f4f6b3ea0700.png

Google Nest 團隊推出的 OpenThreadThread® 網路通訊協定的開放原始碼實作項目,旨在加快智慧聯網家庭產品的開發速度。Thread 規格針對家用和商業大樓應用程式,定義了以 IPv6 為基礎、安全且低功率無線裝置間通訊通訊協定的通訊協定。

Espressif 已移植以 FreeRTOS 和 LwIP 為基礎的 OpenThread 堆疊,讓開發人員能夠快速建構 Thread 網路。相關原始碼可從 GitHub 取得。同時,Espressif 也實作了以 RTOS 為基礎的 Thread 邊界路由器

在本程式碼研究室中,您將在實際硬體上編寫 OpenThread、建立及管理 Thread 網路,以及在節點之間傳遞訊息。

Espressif_hardware_setup.jpg

課程內容

  • 建構 OpenThread CLI 二進位檔並刷新至 ESP 主面板。
  • 將邊界路由器建構並刷新到 ESP Thread 邊界路由器板板上。
  • 使用 ESP Monitor 和 OpenThread CLI 手動管理 Thread 節點。
  • 在 Thread 邊界路由器上建立 Thread 網路。
  • 保護裝置採用 Thread 網路的安全機制。
  • 對 Thread 節點之間的 IPv6 位址進行連線偵測 (ping)。
  • 在採用 UDP 的 Thread 節點之間傳送訊息。

軟硬體需求

硬體:

  • 2 個含有 IEEE 802.15.4 模組的 ESP。
  • 1 ESP Thread 邊界路由器板。

軟體業:

2. 開始使用

  1. ESP-IDF 安裝。

請按照 ESP-IDF 程式設計指南安裝軟體開發環境。

  1. 複製 ESP Thread 邊界路由器 SDK。

ESP-THREAD-BR 是官方的 ESP Thread 邊界路由器 SDK。這款處理器支援所有基本網路功能,可用來建構 Thread 邊界路由器,並整合豐富的產品層級功能,方便快速完成產品。

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

3. 建構及更新

如欲在採用 IEEE 802.15.4 模組的 ESP-IDF 範例上建構及刷新 ot-cli-ftd 二進位檔案,請參閱 ESP-IDF 範例 ot_cli 以瞭解詳情:

$ cd <your-idf-path>/examples/openthread/ot_cli
$ idf.py set-target <your-board-type>

透過 menuconfig 啟用合併功能:

$ idf.py menuconfig

元件設定 > OpenThread > 啟用彙整器,然後建構並刷新。

$ idf.py -p <your-local-port> build flash monitor

如要在 ESP Thread 邊界路由器板上建構並刷新 ot-br 二進位檔檔案,您必須先建構 RCP 二進位檔檔案。這個 RCP 二進位檔檔案不需要明確更新至 ESP Thread Border Router Board 上的裝置。這會包含在邊界路由器二進位檔檔案中,並在首次啟動 (或 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

透過 menuconfig 啟用佣金工具功能:

$ idf.py menuconfig

元件設定 > OpenThread > 啟用 Commissioner,然後建構並刷新的。

$ idf.py -p <your-local-port> build flash monitor

4. 在 Thread 邊界路由器上建立 Thread 網路

您現在可以在 ESP Thread 邊界路由器委員會 (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. 透過網路金鑰加入 Thread 網路

在本程式碼研究室中,有兩個使用 IEEE 802.15.4 模組的 ESP 主機板已準備好加入巴西格式的網路。在這個工作階段中,我們會將 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
> 

esp_ot_tp_LR.jpg

6. 透過安全佣金加入 Thread 網路

在這個講座中,我們會透過安全性委員會將 Board2 新增到網路:

向巴西委員會 (BR Commissioner) 取得 PSKc 和恐慌:

## 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 Commissioner 上啟動調試者,並指定可加入的裝置的 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 Commissioner 設定的加入者憑證來啟動加入者角色:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

系統一分鐘左右時,你會收到驗證成功的確認通知:

## Board2 Joiner ##
----------------------
>
Join success

接著,你就可以開始並加入巴西委員會 (BR Commissioner) 建立的 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 網路:

esp_ot_tp_LRR.jpg

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 Commissioner 對 Board2 MLE-ID 進行連線偵測 (ping),可以在 BR Commissioner 上執行這項指令:

## 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 裝置之間傳送訊息。舉例來說,請開啟 udp 並繫結至通訊埠 20617,然後監聽 BR 上的所有地址:

## BR Commissioner ##
----------------------
> udp open
Done
> udp bind :: 20617
I (1298739) OPENTHREAD: Platform UDP bound to port 20617
Done

接著,從 Board1 傳送訊息至巴西的 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 網路!

esp_ot_final_topology.jpg

現在,您已瞭解:

  • 建構 OpenThread CLI 二進位檔並刷新至 ESP 主面板。
  • 建構刷新邊界路由器可連接至 ESP Thread 邊界路由器的主機板。
  • 使用 ESP Monitor 和 OpenThread CLI 手動管理 Thread 節點。
  • 在 Thread 邊界路由器上建立 Thread 網路。
  • 保護裝置採用 Thread 網路的安全機制。
  • 對 Thread 節點之間的 IPv6 位址進行連線偵測 (ping)。
  • 在採用 UDP 的 Thread 節點之間傳送訊息。

其他資訊

查看 openthread.ioGitHub 瞭解各種 OpenThread 資源,包括:

參考資料: