1. 簡介

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 裝置。

課程內容
- 如何使用 Silicon Labs Simplicity Studio IDE 建立 OpenThread 專案。
- 如何建構 OpenThread CLI 二進位檔,並將其刷入 Silicon Labs 無線電板。
- 瞭解如何使用 Docker,將 Raspberry Pi 3B+ 以上機型設為 OpenThread 邊界路由器 (OTBR)。
- 如何在 OTBR 上建立 Thread 網路。
- 將裝置透過頻外方式委派至 Thread 網路。
- 如何使用 ping 指令驗證節點之間的 Thread 通訊。
2. 先決條件
硬體:
- 3 個 EFR32MGxx 無線電板,可使用這些裝置的任意組合。本程式碼研究室使用 BRD4166A 做為 RCP,並使用兩個 BRD4168A 做為完整 Thread 裝置。
- EFR32MG12 (BRD4161A、BRD4166A、BRD4170A、BRD4304A)
- EFR32MG13 (BRD4168A)
- EFR32MG21 (BRD4180A、BRD4180B)
- BRD4001A:無線入門主機板 (WSTK),用於裝載無線電板。除了 BRD4166A 以外,所有無線電板都需要一個入門主板。使用 Mini USB 傳輸線連接主機板並供電,或使用 BRD4166A 的 Micro USB 傳輸線。

- Raspberry Pi 3B+ 以上版本,並連上網際網路 (透過乙太網路),且搭載 Raspbian Stretch Lite OS 映像檔或 Raspbian Stretch with Desktop。我們將此設定為 OT 邊界路由器。
- Windows/Linux/Mac 主機系統,至少要有 2 個 USB 連接埠和網際網路連線。請前往 SSv5 查看硬體和作業系統需求。
- 至少一條乙太網路線,用於將 Raspberry Pi 連上網際網路。WSTK 也支援透過 IP 進行偵錯和閃爍,因此您也可以使用額外的乙太網路線,透過乙太網路交換器將 WSTK 連線至主機系統。
軟體:
- 在 Windows/Linux/Mac 主機系統上安裝及更新 Simplicity Studio v5,並
- GNU ARM 工具鍊
- Gecko SDK Suite 3.2.0 以上版本和 Silicon Labs OpenThread SDK。
3. 設定硬體
本程式碼實驗室是使用
- 如左圖所示,EFR32MG12 BRD4166A Thunderboard Sense 2。
- 兩個 EFR32MG13 BRD4168A,如右圖所示。
- 在 macOS Catalina 10.15.7 上安裝 Simplicity Studio v5,並使用
- Gecko SDK 3.2.0
- GNU ARM v7.2.1


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

4. 韌體設定
你可以透過兩種方式開始使用。這兩種方法都能刷入本程式碼研究室所需的韌體。
- 專案:(建議) 建立、建構及刷入範例應用程式。這個選項可讓您自訂專案中的應用程式。或
- 展示:(選用) 直接在無線電板上,為任何範例應用程式閃爍預先建構的展示內容。我們鼓勵使用者嘗試設定 Demos 韌體,做為選用練習。詳情請參閱本程式碼研究室結尾的「選用韌體設定 - 示範」一節。
在本程式碼研究室中,我們將使用專案式方法。
使用範例建立專案
我們將建立兩個專案。BRD4166A 的 ot-rcp 專案,以及兩個 BRD4168A 的 ot-cli-ftd 專案。請按照下列步驟操作,為開發板選取適當的範例應用程式。
- 開啟 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。

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

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

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

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

在本示範中,我們將使用範例應用程式的預設設定。重複上述步驟,為其他開發板建立 ot-rcp 專案。
建構及燒錄專案
建構並刷寫 ot-rcp 和 ot-cli-ftd 專案。
- 設定專案後,按一下頂端工具列中的「Build control」(建構控制項,槌子圖示)。或者,您也可以在專案上按一下滑鼠右鍵,然後點選「建構專案」。

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

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

5. 韌體設定摘要
此時,您應該已在無線電板上建立、編譯及刷入適當的韌體。將 ot-rcp 刷寫至 BRD4166A 後,請將其從主機系統中拔除,然後連接至 Raspberry Pi。
完成本節後,Thread 網路硬體設定會如下所示。

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

您會發現我們尚未提供 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 映像檔。

設定 Raspberry Pi
- 請務必在 SD 卡上刷入 Raspbian Stretch Lite 作業系統映像檔或 Raspbian Stretch with Desktop。
- 您可以透過 SSH 連線至 Raspberry Pi,也可以直接使用 Raspbian Desktop。開啟終端機。
- 請務必先更新本機存放區和套件管理員 (安裝 Docker 前,請執行 apt-get update 和 apt-get upgrade)。
安裝 Docker 映像檔
- 在 RPi 上執行下列指令,安裝 Docker。
curl -sSL https://get.docker.com | sh
- 完成後,您可以修改 Docker 使用者設定,不必在每個指令前加上 sudo。必須重新啟動。
sudo usermod -aG docker $USER
- 發出下列指令來安裝容器。請注意,使用 RCP 時,一次只能執行一個邊界路由器容器。此外,請務必將 Simplicity Studio GSDK 版本與正確的 Docker 映像檔相符。例如
gsdk-4.0.1:docker pull siliconlabsinc/openthread-border-router:gsdk-4.0.1
設定及執行 Docker
- 您必須設定 OTBR 啟動時要用來連線 RCP 的 TTY 連接埠。找出 RCP 裝置的 TTY 連接埠。最簡單的方法是連上 RCP 後,尋找
/tty/dev... 項目。這個代碼通常是/dev/ttyUSB0或/dev/ttyACM0。 - 使用下列指令執行 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 個控制台。
- Simplicity Studio 中的兩個
ot-cli-ftd控制台,設定為完整 Thread 裝置。 - Raspberry Pi 上的
ot-ctl互動式殼層,設定為 OT 邊界路由器。
現在可以開始建立 Thread 網路。
8. 建立 Thread 網路
設定 RCP
如要建立網路,請先在 OTBR 上啟動 ot-ctl 殼層,與 RCP 節點通訊。依下列順序輸入指令:
索引 | 指令 | 指令說明 | 預期的回覆 | ||
1 |
| 建立新的網路設定。 | 完成 | ||
2 |
| 將新資料集提交至「有效作業資料集」。 | 完成 | ||
3 |
| 啟用 Thread 介面。 | 完成 | ||
4 |
| 啟用並附加 Thread 協定作業。 | 完成 | ||
等待 10 秒,讓執行緒介面啟動。 | |||||
5 |
| 檢查裝置狀態。應為領導者。 | 領導者 | ||
6 |
| 查看網路設定。 | Active Timestamp: 1 | ||
我們將使用 ot-cli-ftd 上的頻道號碼和網路金鑰,將兩個 FTD 加入這個執行緒網路。
設定 FTD 並新增至 Thread 網路 (頻外方法)
透過頻外方法,我們可取得所有安全性資訊,並手動新增節點。在 Simplicity 控制台中,使用下列指令依序將兩個 FTD 新增至網路。
索引 | 指令 | 指令說明 | 預期的回覆 | ||
1 |
| 設定 OTBR 使用的頻道。 | 完成 | ||
2 |
| 裝置只要有網路金鑰,就能連上 Thread 網路。 | 完成 | ||
3 |
| 將新資料集提交至「有效作業資料集」。 | 完成 | ||
4 |
| 啟用 Thread 介面。 | 完成 | ||
5 |
| 啟用並附加 Thread 協定作業。 | 完成 | ||
等待 20 秒,讓裝置加入並自行設定。 | |||||
6 |
| 查看網路設定。 | 孩子 | ||
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,包括:
- 支援的平台:瞭解支援 OpenThread 的所有平台
- 建構 OpenThread:建構及設定 OpenThread 的詳細資料
- Thread 基礎知識:涵蓋本程式碼研究室中所有 Thread 概念
- Silicon Labs OpenThread 訓練:介紹 OpenThread、討論委派和邊界路由器,並提供建立 OpenThread 網路的實作練習。
- QSG170:Silicon Labs OpenThread 快速入門指南 - 詳細說明 Silicon Labs Thread 開發的入門程序
- AN1256:搭配 OpenThread 邊界路由器使用 Silicon Labs RCP - Raspberry Pi 邊界路由器主機的建構和安裝說明
10. 選用韌體設定 - 試用版
試用版是預先建構的韌體映像檔,可下載到相容裝置。如要快速查看 Simplicity Studio 中是否有適用於零件的範例,請在「Debug Adapters」檢視畫面中點選零件,然後前往「Launcher Perspective」的「EXAMPLE PROJECTS & DEMOS」分頁。停用「範例專案」篩選器,然後勾選「技術類型」下方的「執行緒」單選方塊。

OpenThread SDK 隨附的預先編譯示範應用程式映像檔與下列開發板相容:
- BRD4161a
- BRD4166a
- BRD4168a
- BRD4180a
- BRD4304a
日後發行的 SDK 版本可能會更新這份清單,納入更多無線電板。如需完整的支援零件清單,請參閱「Documentation」下的 Silicon Labs OpenThread SDK 版本資訊。
在對應的開發板上刷入下列範例。如要燒錄,請在左側的「Debug Adapters」下方選取開發板,然後按一下對應範例應用程式的「RUN」。彈出式視窗會顯示快閃進度。
- BRD4166A:ot-rcp - 這個裝置會做為 OT 邊界路由器的無線電共同處理器。我們將使用這部裝置建立 Thread 網路,並將其他兩部裝置加入 Thread 網路。這部裝置是邊界路由器,因此也能做為閘道,讓 Thread 網路中的裝置透過網際網路通訊。
- 兩個 BRD4168A:ot-cli-ftd - 這兩部裝置會做為完整 Thread 裝置。這些裝置會加入 OTBR 建立的 Thread 網路。