使用 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.0OpenThread 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」分頁。

專案總覽

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

軟體元件

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

建構及燒錄專案

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

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

「建構專案」按鈕

  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 updateapt-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 容器的視窗,查看 Border Router 的執行記錄輸出內容,也可以按照下列步驟追蹤容器記錄:

$ 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.ioGitHub,包括:

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 網路。