使用 Simply Studio v5 建構 Silicon Labs EFR32 主機板和 OpenThread 網路

1. 簡介

26b7f4f6b3ea0700.png

Google 的 OpenThread (OT) 是 Thread 的開放原始碼實作項目。Google 發布了 OpenThread,讓開發人員能更廣泛地使用 Google Nest 產品採用的網路技術,加速開發智慧聯網家庭和商用建築的產品。OpenThread 具有狹窄的平台抽象層和較小的記憶體用量,因此非常容易移植。支援系統單晶片 (SoC) 和網路協同處理器 (NCP) 設計。

Thread 規格定義了以 IPv6 為基礎的可靠、安全且低功耗的無線裝置對裝置通訊協定,適用於住家和商業建築應用程式。

Silicon Labs 已強化 OpenThread,可與 Silicon Labs 硬體搭配運作。這個原始碼可在 GitHub 上取得,也可以透過軟體開發套件 (SDK) 安裝 Simplicity Studio 5 (SSv5)。SDK 包含 GitHub 原始碼的完整測試快照。這個版本支援的硬體範圍比 GitHub 版本更廣,而且包含 GitHub 上沒有的說明文件和範例應用程式。

本指南說明如何使用 Silicon Labs OpenThread SDK 和 Simplicity Studio 5,著手開發 OpenThread 應用程式。下圖顯示開發板 (BRD) 和硬體設定,其中包含 OT 邊界路由器 (OTBR) 和 Codelab 中使用的兩個 Thread 裝置。

EFR32MG 硬體設定

課程內容

  • 如何使用 Silicon Labs Simplicity Studio IDE 建立 OpenThread 專案。
  • 如何建構 OpenThread CLI 二進位檔並刷入 Silicon Labs 無線電板。
  • 瞭解如何使用 Docker,將 Raspberry Pi 3B+ 以上機型設為 OpenThread 邊界路由器 (OTBR)。
  • 如何在 OTBR 上建立 Thread 網路。
  • 將裝置帶外委託至 Thread 網路。
  • 如何使用 ping 指令驗證節點之間的 Thread 通訊。

2. 先決條件

硬體:

  1. 3 個 EFR32MGxx 無線電板 - 可使用這些裝置的任意組合。本程式碼研究室使用 BRD4166A 做為 RCP,並使用兩個 BRD4168A 做為完整 Thread 裝置。
    • EFR32MG12 (BRD4161A、BRD4166A、BRD4170A、BRD4304A)
    • EFR32MG13 (BRD4168A)
    • EFR32MG21 (BRD4180A、BRD4180B)
    如果從頭開始,可以取得其中一個 EFR32 Thread 入門套件,內含上述開發板。
  2. BRD4001A:無線入門主機板 (WSTK),用於裝載無線電路板。除了 BRD4166A 以外,所有無線電板都需要一個入門主板。使用 Mini USB 傳輸線連接主機板並供電,或使用 BRD4166A 的 Micro USB 傳輸線。

WSTK AEM

  1. Raspberry Pi 3B+ 以上版本,搭載 Raspbian Stretch Lite OS 映像檔或Raspbian Stretch with Desktop,並透過乙太網路連上網際網路。我們將此設定為 OT 邊界路由器。
  2. Windows/Linux/Mac 主機系統,至少要有 2 個 USB 連接埠和網際網路連線。請前往 SSv5 查看硬體和作業系統需求。
  3. 至少一條乙太網路線,用於將 Raspberry Pi 連上網際網路。WSTK 也支援透過 IP 進行偵錯和閃爍,因此您也可以使用額外的乙太網路線,透過乙太網路交換器將 WSTK 連線至主機系統。

軟體:

  • 在 Windows/Linux/Mac 主機系統上安裝及更新 Simplicity Studio v5,並
    • GNU ARM 工具鍊
    • Gecko SDK Suite 3.2.0 以上版本和 Silicon Labs OpenThread SDK。

3. 設定硬體

本程式碼研究室是使用

  1. 如左圖所示,EFR32MG12 BRD4166A Thunderboard Sense 2。
  2. 兩個 EFR32MG13 BRD4168A,如右圖所示。
  3. 在 macOS Catalina 10.15.7 上安裝 Simplicity Studio v5,並使用
    1. Gecko SDK 3.2.0
    2. GNU ARM v7.2.1

BRD4168A

如下圖所示,使用 USB 將每個無線入門套件主機板連接至主機電腦。這些連線可讓您對 RCP 和終端裝置進行程式設計和網路分析。我們會先使用主機電腦,以 ot-rcp 韌體程式設計 BRD4166A,最後再將其連線至 Raspberry Pi。(選用) 終端裝置可透過一般乙太網路交換器連線至主機電腦。入門套件也支援透過 IPv4 進行程式設計和網路分析。

連線

4. 設定韌體

你可以透過以下兩種方式快速起步:無論選擇哪個選項,都能刷入本程式碼研究室所需的韌體。

  1. 專案:(建議) 建立、建構及刷寫範例應用程式。這個選項可讓您自訂專案中的應用程式。或
  2. 示範:(選用) 在無線電板上直接閃爍任何範例應用程式的預建示範。我們鼓勵使用者嘗試設定 Demos 韌體,做為選用練習。詳情請參閱本程式碼研究室結尾的「選用韌體設定 - 示範」一節。

在本程式碼研究室中,我們將使用專案式方法。

使用範例建立專案

我們將建立兩個專案。BRD4166A 的 ot-rcp 專案,以及兩個 BRD4168A 的 ot-cli-ftd 專案。請按照下列步驟操作,為開發板選取適當的範例應用程式。

  1. 開啟 Studio 的「File」選單,然後選取「New」>「Silicon Labs Project Wizard」。系統會開啟「Target, SDK, and Toolchain Selection」對話方塊。請勿變更 OpenThread 支援的預設 Simplicity IDE / GNU 工具鍊。按一下「下一步」。
    • 目標開發板:顯示所選無線電開發板 (BRD4168A) 和主開發板 (BRD4001A)
    • 目標裝置:這個欄位會顯示板載微控制器晶片 (MCU)。BRD4168A 內建 EFR32MG13 MCU。
    • SDK:您可以在這裡選取要使用的 OT SDK 版本。套件資訊包括 SDK 標記和 Silicon Labs 建構的 OpenThread,例如 Platform 4.0.1.0 和 OpenThread 2.0.1.0 (GitHub-55af6ce2c)。
    • IDE/ 工具鍊:用於編譯 OT 專案的工具鍊。我們使用 GNU ARM。

新增專案精靈

  1. 「Example Project Selection」對話方塊隨即開啟。系統會列出範例專案。使用「Thread 技術類型」和關鍵字篩選器,搜尋特定範例。請務必記下 Gecko SDK Suite 版本號碼。將 Raspberry Pi 設為邊界路由器時,需要這個版本標記。選取「ot-cli-ftd」,然後點選「NEXT」。

新增專案精靈步驟 2

  1. 「專案設定」對話方塊隨即開啟。您可以在這裡重新命名專案、變更預設專案檔案位置,以及決定要連結或複製專案檔案。連結的專案檔案會指向 SDK,您所做的任何修改最終都會在 SDK 中完成,並用於日後的專案。複製專案來源後,您就能編輯專案本機副本,SDK 檔案則會保持不變。「連結 SDK 並複製專案來源」是預設選項,也是建議的選擇。按一下「完成」。

新增專案精靈步驟 3

  1. Simplicity IDE Perspective 隨即開啟,並顯示「Project Configurator」的「OVERVIEW」分頁。

專案總覽

您可以透過「Software Components」(軟體元件) 分頁安裝及解除安裝元件,並設定已安裝的元件,藉此設定專案。系統會檢查已安裝的元件。按一下「Installed Components」(已安裝的元件),即可查看範例應用程式安裝的元件清單 (已篩選)。系統會自動儲存您所做的任何變更,並自動產生專案檔案。進度會顯示在 Simplicity IDE 觀點的右下角。

軟體元件

在本示範中,我們將使用範例應用程式的預設設定。重複上述步驟,為其他開發板建立 ot-rcp 專案。

建構及燒錄專案

建構並刷寫 ot-rcp 和 ot-cli-ftd 專案。

  1. 設定專案後,按一下頂端工具列中的「建構控制項」(鐵鎚圖示)。或者,您也可以在專案上按一下滑鼠右鍵,然後點選「建構專案」。

「建構專案」按鈕

  1. 進度會顯示在控制台和右下角的進度列中。與專案相關的任何錯誤或警告也會顯示在這個輸出視窗中。

專案建構輸出視窗

  1. 專案建構成功後,系統會產生二進位檔映像檔。您可以從專案瀏覽器檢視畫面刷入二進位映像檔。在編譯器子目錄中找出 .bin、.hex 或 .s37 檔案。在檔案上按一下滑鼠右鍵,然後選取「Flash to Device」。如果已連線多部裝置,請選取要設定的裝置,然後按一下「確定」。Flash Programmer 隨即開啟,並填入檔案路徑。按一下「計畫」。

Flash

5. 韌體設定摘要

此時,您應該已在無線電板上建立、編譯及刷入適當的韌體。將 ot-rcp 刷寫至 BRD4166A 後,請將其從主機系統中拔除,然後連接至 Raspberry Pi。

完成本節後,Thread 網路硬體設定會如下所示。

設定 EFR32MG

6. 為 ot-cli-ftd 裝置設定序列埠控制台

如要啟動控制台介面,請在 Simplicity IDE 觀點中在 J-Link 裝置上按一下滑鼠右鍵,然後選取「Devices View」/「Debug Adapters Window」。選擇「啟動主控台」。如要在控制台上取得提示,請選擇「Serial 1」分頁標籤,然後按下 Enter 鍵。檢查 FTD 節點的狀態。

FTD Studio 控制台檢視畫面

您會發現我們尚未提供 ot-rcp 的控制台。在下一個步驟中,我們會將 Raspberry Pi 設定為 OT 邊界路由器,並設定 ot-rcp 的控制台。

7. 將 Raspberry Pi 設為邊界路由器

Silicon Labs 建議使用 OTBR 部署公司的 Docker 容器。在容器中執行 OTBR 可輕鬆建立可部署的構件,並快速開發原型和測試。

Silicon Labs OTBR 映像檔託管於 siliconlabsinc DockerHub,並附有標記。每個標記都對應至 GSDK 版本:

https://hub.docker.com/r/siliconlabsinc/openthread-border-router/tags

Docker 容器必須搭配使用以 Simplicity Studio 5 建構的 RCP,才能用於特定版本。請務必讓容器代碼版本與您測試的 GSDK 版本相符。舉例來說,如果您在「Example Project Selection」(範例專案選取) 視窗中選取 ot-rcp 時,GDSK 版本為 Gecko SDK Suite v4.0.1 (140),請使用 siliconlabsinc/openthread-border-router:gsdk-4.0.1 圖片。

GSDK 版本

設定 Raspberry Pi

  1. 請務必在 SD 卡上刷入 Raspbian Stretch Lite 作業系統映像檔或 Raspbian Stretch with Desktop。
  2. 您可以透過 SSH 連線至 Raspberry Pi,也可以直接使用 Raspbian Desktop。開啟終端機。
  3. 請務必先更新本機存放區和套件管理員 (安裝 Docker 前,請執行 apt-get update 和 apt-get upgrade)。

安裝 Docker 映像檔

  1. 在 RPi 上執行下列指令,安裝 Docker。
    curl -sSL https://get.docker.com | sh
    
  2. 完成後,您可以修改 Docker 使用者設定,不必在每個指令前加上 sudo。必須重新啟動裝置。
    sudo usermod -aG docker $USER
    
  3. 發出下列指令來安裝容器。請注意,使用 RCP 時,一次只能執行一個邊界路由器容器。此外,請務必將 Simplicity Studio GSDK 版本與正確的 Docker 映像檔相符。例如 gsdk-4.0.1:
    docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
    

設定及執行 Docker

  1. 您必須設定 OTBR 啟動時要用來連線 RCP 的 TTY 連接埠。找出 RCP 裝置的 TTY 連接埠。最簡單的方法是連上 RCP 後,尋找 /tty/dev... 項目。這個代碼通常是 /dev/ttyUSB0 或 /dev/ttyACM0。
  2. 使用下列指令執行 Docker 安裝作業。請務必將 Docker 映像檔名稱替換為相符的 GSDK 版本。例如 gsdk-4.0.1:
    docker run -d --name "otbr" \
     --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" \
     -p 8080:80 --dns=127.0.0.1 -it \
     --volume /dev/ttyACM0:/dev/ttyACM0 \
     --privileged siliconlabsinc/openthread-border-router:gsdk-4.0.1 \
     --radio-url spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800 \
     --backbone-interface eth0
    
    • -d 可確保容器以分離模式執行。
    • 您隨時可以使用 docker logs 指令查看容器的執行記錄。
    • --name 會持續存在,直到 Docker 容器正確關閉 (或移除) 為止。
    • 通訊埠 8080 表示代管 Border Router 管理網頁的網路伺服器通訊埠。
    • 無線電網址選項中必須有 ?uart-baudrate=460800,才能解決 UART 上的片段化 / 重組問題,以及 DTLS 等耗費資源的作業 (使用長 IPv6 封包)。

與 RCP 節點互動

Docker 執行後,您可以使用此指令,透過互動式殼層與 RCP 節點通訊。檢查 RCP 節點的狀態。

$ docker exec -ti otbr sh -c "sudo ot-ctl"
> state 
disabled
Done

您可以取得正在執行的容器 ID 清單

$ docker ps -aq

您可以檢查執行 OTBR Docker 容器的視窗,查看邊界路由器執行記錄的輸出內容,或按照下列步驟追蹤容器記錄:

$ docker logs [container-id] -f

如果 Docker 容器已正確載入,您可以選擇停止、移除或終止映像檔。

$ docker stop otbr
$ docker rm otbr
$ docker kill otbr

選用:如要退出殼層,請按下 CNTL + C。

此時,您應該會有 3 個控制台。

  1. Simplicity Studio 中的兩個 ot-cli-ftd 控制台,設定為完整 Thread 裝置。
  2. Raspberry Pi 上的 ot-ctl 互動式殼層,設定為 OT 邊界路由器。

現在可以建立 Thread 網路了。

8. 建立 Thread 網路

設定 RCP

如要建立網路,請先在 OTBR 上啟動 ot-ctl 殼層,與 RCP 節點通訊。依下列順序輸入指令:

索引

指令

指令說明

預期的回覆

1

dataset init new

建立新的網路設定。

完成

2

dataset commit active

將新資料集提交至「有效作業資料集」。

完成

3

ifconfig up

啟用 Thread 介面。

完成

4

thread start

啟用並附加 Thread 協定作業。

完成

等待 10 秒,讓執行緒介面啟動。

5

state

檢查裝置狀態。應為領導者。
其他可能狀態:離線、已停用、已卸離、
子項、路由器或領導者

領導者
完成

6

dataset

查看網路設定。
您的值會與本程式碼研究室不同。
請記下頻道、網路金鑰、
網路名稱和 PAN ID。

Active Timestamp: 1
Channel: 20
Channel Mask: 0x07fff800
Ext PAN ID: 39ba71f7fc367160
Mesh Local Prefix: fd5c:c6b:3a17:40b9::/64
Network Key: 81ae2c2c17368d585dee71eaa8cf1e90
Network Name: OpenThread-008c
PAN ID: 0x008c
PSKc: c98f0193d4236025d22dd0ee614e641f
Security Policy: 0, onrcb
Done

我們會使用 ot-cli-ftd 上的頻道號碼和網路金鑰,將兩個 FTD 加入這個執行緒網路。

設定 FTD 並新增至 Thread 網路 (頻外方法)

透過頻外方法,我們可掌握所有安全性資訊,並手動新增節點。在 Simplicity 控制台中,使用下列指令依序將兩個 FTD 新增至網路。

索引

指令

指令說明

預期的回覆

1

dataset channel 20

設定 OTBR 使用的頻道。

完成

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

裝置只要有網路金鑰,就能連上 Thread 網路。

完成

3

dataset commit active

將新資料集提交至「有效作業資料集」。

完成

4

ifconfig up

啟用 Thread 介面。

完成

5

thread start

啟用並附加 Thread 協定作業。

完成

等待 20 秒,讓裝置加入並自行設定。

6

state

查看網路設定。

孩子
完成

Thread 裝置之間的通訊

我們會使用 ping 指令,檢查裝置是否可以彼此通訊。如要使用 ping 指令,我們需要裝置的 IPv6 位址。這些憑證可使用 ipaddr 指令取得。

> ipaddr
fd5c:c6b:3a17:40b9:0:ff:fe00:fc00		# Leader Anycast Locator (ALOC)
fd5c:c6b:3a17:40b9:0:ff:fe00:1800		# Routing Locator (RLOC)
fd5c:c6b:3a17:40b9:84e2:bae8:bd5b:fa03		# Mesh-Local EID (ML-EID)
fe80:0:0:0:c449:ca4a:101f:5d16			# Link-Local Address (LLA)

從兩個 FTD 使用 OTBR 的 RLOC 位址,對 OTBR 執行 ping 作業。

> ping fd5c:c6b:3a17:40b9:0:ff:fe00:1800
Done
> 
> 16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=30ms
16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=52ms

回應表示已收到酬載,且通訊成功。重複上述程序,從 OTBR Ping FTD。

9. 恭喜

你已建立 Thread 網路!

您現在瞭解:

  • 如何使用 Silicon Labs Simplicity Studio IDE 建立 OpenThread 專案。
  • 如何建構 OpenThread CLI 二進位檔並刷入 Silicon Labs 無線電板。
  • 瞭解如何使用 Docker,將 Raspberry Pi 3B+ 以上機型設為 OpenThread 邊界路由器 (OTBR)。
  • 如何在 OTBR 上建立 Thread 網路。
  • 將裝置帶外委託至 Thread 網路。
  • 如何使用 ping 指令驗證節點之間的 Thread 通訊。

延伸閱讀

如需各種 OpenThread 資源,請前往 openthread.io 和 GitHub,包括:

10. 選用韌體設定 - 試用版

試用版是預先建構的韌體映像檔,可下載到相容裝置。如要快速查看 Simplicity Studio 中是否有適用於零件的範例,請在「Debug Adapters」檢視畫面中點選零件,然後前往「Launcher Perspective」的「EXAMPLE PROJECTS & DEMOS」分頁。停用「範例專案」篩選器,然後勾選「技術類型」下方的「執行緒」單選方塊。

Studio 示範

OpenThread SDK 隨附的預先編譯示範應用程式映像檔與下列開發板相容:

  1. BRD4161a
  2. BRD4166a
  3. BRD4168a
  4. BRD4180a
  5. BRD4304a

日後發行的 SDK 版本可能會更新這份清單,納入更多無線電板。如需完整的支援零件清單,請參閱「Documentation」下的 Silicon Labs OpenThread SDK 版本資訊。

在對應的開發板上刷入下列範例。如要燒錄,請在左側的「Debug Adapters」下方選取開發板,然後按一下對應範例應用程式的「RUN」。彈出式視窗會顯示快閃進度。

  1. BRD4166A:ot-rcp - 這個裝置會做為 OT 邊界路由器的無線電共同處理器。我們將使用這部裝置建立 Thread 網路,並將其他兩部裝置加入 Thread 網路。這部裝置是邊界路由器,因此也能做為閘道,讓 Thread 網路中的裝置透過網際網路通訊。
  2. 兩部 BRD4168A:ot-cli-ftd - 這兩部裝置會做為完整 Thread 裝置。這些裝置會加入 OTBR 建立的 Thread 網路。