使用 Texas Instruments SimpleLink F3 和 OpenThread 建構 Thread 網路

1. 簡介

OpenThread 標誌

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

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

德州儀器已為 SimpleLink™ CC27xx 裝置系列導入 OpenThread。GitHub 上的 ot-ti 存放區包含在 Texas Instruments SimpleLink Connected MCU 上執行 OpenThread 時所需的平台驅動程式和範例應用程式。CC2745R10-Q1 是 TI SimpleLink CC27xx 系列的車用級 (通過 AEC-Q100 認證) IEEE 802.15.4 無線 MCU,並通過 Thread 認證。

本程式碼研究室說明如何使用 LP-EM-CC2745R10-Q1 LaunchPad 評估板和 ot-ti 存放區,開始開發 OpenThread 應用程式。下圖顯示本程式碼研究室使用的硬體設定,包括 OT 邊界路由器 (OTBR) 和兩個 Thread 完整 Thread 裝置 (FTD)。

CC2745R10 硬體設定

課程內容

  • 如何設定 Texas Instruments ot-ti 建構環境。
  • 如何建構 OpenThread CLI 二進位檔並刷入 LP-EM-CC2745R10-Q1 開發板。
  • 如何使用 ot-br-posix 將 Raspberry Pi 設為 OpenThread 邊界路由器 (OTBR)。
  • 如何在 OTBR 上建立 Thread 網路。
  • 將裝置帶外委託至 Thread 網路。
  • 如何使用 ping 指令驗證節點之間的 Thread 通訊。

2. 先決條件

硬體

  1. 3 個 LP-EM-CC2745R10-Q1 LaunchPad 開發板:一個設定為 RCP,並連線至邊界路由器;兩個設定為完整 Thread 裝置 (FTD)。 LP-EM-CC2745R10-Q1 傾斜視角CC2745R10-Q1 是 TI SimpleLink CC27xx 系列的車用級 (通過 AEC-Q100 認證) Thread 認證 IEEE 802.15.4 無線 MCU。LP-EM-CC2745R10-Q1 是對應的 LaunchPad 評估模組,支援 RCP、FTD、MTD 和 NCP Thread 角色。CC2340R5 搭配 LP-EM-CC2340R5 LaunchPad 是記憶體較小的選項,只能做為 RCP。這項服務不支援 FTD、MTD 或 NCP 角色。如果以 LP-EM-CC2340R5 取代主機板 1 (RCP),這兩個 FTD 主機板仍須為 LP-EM-CC2745R10-Q1。
  2. 3 個 LP-XDS110ET 偵錯探針:每個 LaunchPad 開發板各一個,用於透過 USB 進行程式設計和偵錯。 LP-XDS110ET 傾斜視角LP-XDS110ET 是獨立的 USB 偵錯探針,適用於 LP-EM 外觀規格的 LaunchPad。包括支援 EnergyTrace 的電源設定檔。LP-XDS110 是較經濟實惠的替代方案,提供相同的程式設計和偵錯功能,但不包含 EnergyTrace。此外,您也可以使用 LaunchPad (搭載 XDS110 偵錯探針,例如 LAUNCHXL-CC26X2R1) 完全取代 LP-EM 板和獨立偵錯探針。詳情請參閱「LaunchPad 偵錯連線指南」。
  3. 3 條 micro-USB 傳輸線,用於連接 LaunchPad 開發板和偵錯探針,並為這些裝置供電。
  4. Raspberry Pi 4B 以上版本,並透過乙太網路連上網際網路。這會設定為 OT 邊界路由器主機。Raspberry Pi 4
  5. Linux 或 macOS 主機系統,至少要有 2 個 USB 連接埠,並可存取網際網路。建構環境需要與 Bash 相容的殼層。Windows 使用者應搭配 Ubuntu 使用 WSL2 (適用於 Linux 的 Windows 子系統 2)。
  6. 至少一條乙太網路線,用來將 Raspberry Pi 連上網際網路。或者,你也可以將 Raspberry Pi 連上 Wi-Fi,並使用 wlan0 做為基礎架構介面,詳情請參閱 OTBR 設定步驟。

軟體

  • TI ot-ti 存放區https://github.com/TexasInstruments/ot-ti
  • GNU ARM Embedded Toolchain 12.2 (由啟動程序指令碼自動安裝)
  • SysConfig 1.27.0 (由啟動程序指令碼自動安裝)
  • TI UniFlash:用於將韌體刷入 LaunchPad 開發板

3. 硬體設定

本程式碼研究室使用三塊 LP-EM-CC2745R10-Q1 開發板:

  • 主機板 1 (RCP):執行 ot-rcp 韌體。透過 USB 連接至 Raspberry Pi,做為邊界路由器的無線電協同處理器。
  • 開發板 2 (FTD 1):以完整 Thread 裝置身分執行 ot-cli-ftd 韌體。
  • 開發板 3 (FTD 2):以完整 Thread 裝置身分執行 ot-cli-ftd 韌體。

LP-EM-CC2745R10-Q1 俯視圖

使用 micro-USB 將每個 LaunchPad 連接至主機電腦。透過 USB 連線,您可以使用內建的 XDS110 偵錯探針供電,並進行偵錯/程式設計。

透過 USB 連接時,每個 LP-EM-CC2745R10-Q1 會顯示為兩個虛擬序列埠:一個用於 XDS110 偵錯介面,另一個用於應用程式 UART。開啟序列主控台時,請連線至「Application/User UART」通訊埠,而非「Auxiliary Data」通訊埠。

硬體連接圖

4. 設定及建構存放區

ot-ti 建構系統使用 CMake,且需要 Bash 殼層。本節中的所有指令都會在 Linux 或 macOS 主機 (或 Windows 上的 WSL2) 上執行。

1. 複製存放區

$ git clone https://github.com/TexasInstruments/ot-ti.git
$ cd ot-ti
$ git submodule update --init

2. 執行啟動程序指令碼

Bootstrap 指令碼會安裝必要的依附元件,包括 GNU ARM 工具鍊和 SysConfig:

$ ./script/bootstrap

Bootstrap 指令碼需要 cmakegitwget 和標準建構工具。在 Ubuntu/Debian 上,使用下列指令安裝必要條件:sudo apt-get install -y cmake git make wget tar ninja-build

3. 為 LP_EM_CC2745R10_Q1 建構韌體

為 LP-EM-CC2745R10-Q1 開發板建構所有韌體映像檔:

$ ./script/build LP_EM_CC2745R10_Q1

LP_EM_CC2745R10_Q1 建構目標對應於 CC27xx SimpleLink 系列中的 CC2745R10-Q1 裝置 (Arm Cortex-M33F 核心)。如要查看所有支援的開發板,請執行不含引數的 ./script/build

建構成功後,ELF 二進位檔會位於 build/bin/

$ ls build/bin/
ot-cli-ftd.out  ot-cli-mtd.out  ot-ncp-ftd.out  ot-rcp.out

本程式碼研究室使用的兩張圖片如下:

  • ot-rcp.out:邊界路由器板的無線電共同處理器韌體。
  • ot-cli-ftd.out:兩個 FTD 板的完整 Thread 裝置 CLI 韌體。

選用最簡化的 Thread 裝置:如要探索休眠終端裝置,而非完整的 Thread 裝置,可以在 Boards 2 和 3 上閃爍 ot-cli-mtd.out,取代 ot-cli-ftd.out。MTD 不會傳送 Thread 流量,而且可以進入低耗電睡眠狀態,因此非常適合電池供電的應用程式。本程式碼研究室中的 Thread 網路形成步驟,適用於這兩種裝置類型。

選用網路共同處理器 (NCP):ot-ncp-ftd.out 二進位檔會實作 NCP 架構,OpenThread 堆疊會在裝置上執行,主機處理器則透過 Spinel 通訊協定驅動該堆疊。NCP 用量不在本程式碼研究室的範圍內,詳情請參閱 NCP README

5. 刷入韌體

使用 TI UniFlash 將 ELF 映像檔刷新至 LaunchPad 開發板。

使用 UniFlash 刷新裝置

  1. 開啟 UniFlash。由於自動偵測裝置功能,已連線的 LaunchPad 開發板會顯示在「Detected Devices」下方。如果系統未自動偵測到開發板,請按一下「New Configuration」,選取 LP-EM-CC2745R10-Q1 目標,然後選擇 XDS110 USB 偵錯探針。UniFlash 偵測到的裝置
  2. 選取「Board 1」(要刷寫 ot-rcp.out 的開發板),然後按一下「Start」(開始)。
  3. 按一下「瀏覽」按鈕,然後前往 ot-ti/build/bin/ot-rcp.outUniFlash 閃爍頁面
  4. 按一下「Load Image」刷新韌體。記錄區域會顯示進度並確認完成。
  5. 針對「Board 2」和「Board 3」重複步驟 2 到 4,並為每個板子選取 ot-ti/build/bin/ot-cli-ftd.out

替代方法:使用 Code Composer Studio (CCS) 刷機

您可以使用 Code Composer Studio 做為 UniFlash 的替代方案,此外,這項工具還提供完整的偵錯環境:

  1. 下載並安裝 Code Composer Studio
  2. 使用 XDS110 偵錯工具,為 LP-EM-CC2745R10-Q1 建立目標連線 (CCXML)。請參閱「CCS User's Guide: Manual Method」。
  3. 如要啟動不含專案的偵錯工作階段,請參閱 CCS 使用者指南:手動啟動
  4. 連線至 Arm Cortex-M33 核心,然後按一下「Load」載入 ELF 映像檔。

預設 CCXML 設定使用 2 線 cJTAG,以符合預設 LP-EM-CC2745R10-Q1 跳線設定。透過 JTAG 程式設計後,請重新啟動主機板,清除啟動暫停標記。

6. 設定 HSM

CC2745R10-Q1 包含硬體安全模組 (HSM),必須先完成佈建,才能執行 Thread 或其他安全應用程式韌體。如果 LP-EM-CC2745R10-Q1 開發板尚未完成 HSM 程式設計,請立即完成這個步驟。

如要使用 UniFlash 程式設計 HSM,請按照下列步驟操作:

  1. 開啟 UniFlash,然後從「Detected Devices」選取 LP-EM-CC2745R10-Q1 開發板。
  2. 前往 HSM 程式設計面板,載入 HSM 韌體映像檔,如下所示。

UniFlash HSM 程式設計

  1. 按照畫面上的提示完成 HSM 佈建。這項作業會記錄在 UniFlash 輸出控制台中。

如需完整的 HSM 程式設計程序,包括 SimpleLink Low Power F3 SDK 內所需的韌體映像檔路徑,請參閱 TI Resource Explorer 中的 CC2745R10-Q1 快速入門指南

7. 韌體摘要

此時,所有三塊開發板都應已完成刷寫:

  • 開發板 1: ot-rcp.out:從主機電腦拔除,然後透過 USB 連接至 Raspberry Pi。
  • 主機板 2: ot-cli-ftd.out:保持與主機連線。
  • 開發板 3: ot-cli-ftd.out:保持與主機連線。

硬體設定如下圖所示。主機板 1 會連線至 Raspberry Pi,做為 OTBR 的無線電共同處理器,而主機板 2 和 3 則會保持連線至主機電腦,以存取序列主控台。

使用 FTD 設定 CC2745R10 硬體

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

LP-EM-CC2745R10-Q1 會透過 USB 以 921600 bps 速率公開應用程式 UART。

使用下列設定,為每個 FTD 板開啟應用程式 UART COM 埠 (Windows) 或 /dev/ttyACM* 裝置 (Linux/macOS) 的序列終端機:

參數

速度 (鮑率)

921600

資料位元

8

停止位元

1

同位元

None

流量控制

None

提示 (Linux/macOS):插入開發板前後分別執行 ls /dev/ttyACM*,並記下顯示的項目,即可找出正確的裝置節點。每個 LP-EM-CC2745R10-Q1 都會建立兩個項目:編號較小的通訊埠是 XDS110 偵錯 UART,編號較大的通訊埠則是應用程式 UART。舉例來說,如果開發板建立 /dev/ttyACM0/dev/ttyACM1,請使用 /dev/ttyACM1

提示 (Windows):開啟裝置管理員,然後在插入開發板時,查看「連接埠 (COM 和 LPT)」下方是否有兩個新的 COM 連接埠。XDS110 偵錯資料埠通常會先顯示,請使用第二個 (編號較高) COM 埠做為應用程式控制台。

在終端機中按下 Enter 鍵,取得 OpenThread CLI 提示 (>)。如需可用指令的完整清單,請參閱 OpenThread CLI 參考資料。確認 FTD 運作正常:

> state
disabled
Done

序列終端 FTD

您還不會為 RCP 板設定序列控制台。Raspberry Pi 上的 OTBR 會直接與 RCP 通訊。在下一個步驟中,您將 Raspberry Pi 設定為 OpenThread 邊界路由器。

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

OTBR 是以開放原始碼的 OpenThread 邊界路由器專案 ot-br-posix 為基礎建構而成。邊界路由器會在 Raspberry Pi 上執行,並透過 USB 使用主機板 1 (RCP) 做為 802.15.4 無線電。

Raspberry Pi 設定

  1. 使用 Raspberry Pi Imager,將 Raspberry Pi OS (64 位元 Lite 或 Desktop) 燒錄到 SD 卡。
  2. 啟動 Raspberry Pi,然後開啟終端機 (透過 SSH 或直接開啟)。
  3. 更新套件管理員並升級已安裝的套件:
    $ sudo apt-get update
    $ sudo apt-get upgrade -y
    

更新後,請先重新啟動 Raspberry Pi,再繼續操作:sudo reboot

將主板 (RCP) 連接至 Raspberry Pi

透過 micro-USB 將開發板 1 (已刷入 ot-rcp) 連接至 Raspberry Pi。連線後,請確認裝置節點是否顯示:

$ ls /dev/ttyACM*
/dev/ttyACM0
/dev/ttyACM1

RCP 板的應用程式 UART 通常為 /dev/ttyACM1 (XDS110 偵錯 UART 為 /dev/ttyACM0)。請檢查應用程式 UART 是否在後續步驟中啟動 OTBR 代理程式時回應,確認應用程式 UART 的連接埠。如果連線的是其他 USB 序列裝置,裝置節點編號可能會有所不同。請據此調整 OTBR 設定中的路徑。

建構及安裝 ot-br-posix

在 Raspberry Pi 上,複製並建構 ot-br-posix:

$ git clone https://github.com/openthread/ot-br-posix.git
$ cd ot-br-posix
$ ./script/bootstrap

執行設定指令碼,並將乙太網路介面指定為骨幹 (基礎架構) 介面:

$ INFRA_IF_NAME=eth0 ./script/setup

eth0 是有線乙太網路介面的典型名稱。如果透過 Wi-Fi 連接 Raspberry Pi,而非乙太網路,請將 eth0 換成 wlan0 (並確保 Pi 已連上 Wi-Fi 網路)。使用 ip link show 驗證有效介面名稱。

設定指令碼會從來源建構 ot-br-posix、安裝 otbr-agentotbr-web 系統服務,並設定網路堆疊。在 Raspberry Pi 4B 上,這項程序通常需要 10 到 20 分鐘。

設定 OTBR 代理程式

編輯 OTBR 代理程式設定檔,指定 RCP 裝置路徑和傳輸速率:

$ sudo nano /etc/default/otbr-agent

找出 OTBR_AGENT_OPTS 行,並更新為參照 RCP 應用程式 UART:

OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

如果 Raspberry Pi 是透過 Wi-Fi 連線,請將 eth0 替換為 wlan0

OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

LP-EM-CC2745R10-Q1 RCP 應用程式 UART 的運作鮑率為 921600。確認裝置路徑 (本例中為 /dev/ttyACM1) 與 RCP 板的應用程式 UART 相符。

重新啟動 OTBR 代理程式,以套用設定:

$ sudo systemctl restart otbr-agent
$ sudo systemctl enable otbr-agent

確認代理程式正在執行:

$ sudo systemctl status otbr-agent

與 RCP 節點互動

使用 ot-ctl 工具與 RCP 節點通訊:

$ sudo ot-ctl state
disabled
Done

您可以監控 OTBR 代理程式記錄,查看連線和狀態訊息:

$ sudo journalctl -u otbr-agent -f

您也可以透過 http://:80 使用 OTBR 網頁介面,以圖形化方式查看 Thread 網路。

如要停止或重新啟動 OTBR 代理程式,請按照下列步驟操作:

$ sudo systemctl stop otbr-agent
$ sudo systemctl start otbr-agent

此時,您應該有三個有效的控制台:

  1. 主機電腦上的「Board 2」() 序列終端機 (ot-cli-ftd 1)。
  2. 主機上的「Board 3」序列終端機 (ot-cli-ftd 2)。
  3. Raspberry Pi 上的 SSH 或終端機工作階段,適用於 ot-ctl (OTBR/RCP)。

現在可以建立 Thread 網路了。

10. 建立 Thread 網路

設定 RCP (OTBR)

在 Raspberry Pi 的 ot-ctl 殼層中建立新的 Thread 網路。依序輸入下列指令:

索引

指令

說明

預期的回覆

1

dataset init new

建立新的網路設定。

完成

2

dataset commit active

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

完成

3

ifconfig up

啟用 Thread 介面。

完成

4

thread start

啟用並附加 Thread 協定作業。

完成

等待 10 秒,系統就會顯示 Thread 介面。

5

state

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

領導者
完成

6

dataset

查看網路設定。您的值會有所不同。請記下頻道、網路金鑰、網路名稱和 PAN ID,這些資訊是將 FTD 加入網路時的必要條件。

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

將 FTD 新增至 Thread 網路 (頻外方法)

使用頻外委派方法時,您會直接提供網路憑證。在每個 FTD 板的序列終端機中,使用上述 OTBR 資料集輸出內容中的通道和網路金鑰,輸入下列指令:

索引

指令

說明

預期的回覆

1

dataset channel 20

將頻道設為與 OTBR 相符。將 20 替換為 OTBR 的管道值。

完成

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

設定網路金鑰。請替換成 OTBR 的網路金鑰。您只需要這個金鑰即可附加。

完成

3

dataset commit active

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

完成

4

ifconfig up

啟用 Thread 介面。

完成

5

thread start

啟用並附加 Thread 協定作業。

完成

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

6

state

檢查裝置狀態。

孩子
完成

由於 Thread 網路會自行設定,且這些裝置是完整的 Thread 裝置,因此其中一個或兩個 FTD 最終可能會成為路由器。您隨時可以使用 state 指令驗證目前的角色。

Thread 裝置之間的通訊

使用 ping 指令確認裝置可以通訊。使用 ipaddr 取得每部裝置的 IPv6 位址:

> 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)
Done

從這兩個 FTD,使用 RLOC 位址 Ping OTBR:

> 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

成功的回應表示 Thread 網路正在運作,裝置可以通訊。重複上述程序,從 OTBR (sudo ot-ctl ping ) Ping 每個 FTD。

11. 恭喜

您已使用 TI CC2745R10-Q1 開發板建立 Thread 網路!

您現在瞭解:

  • 如何設定 Texas Instruments ot-ti 建構環境。
  • 如何建構 OpenThread CLI 二進位檔並刷入 LP-EM-CC2745R10-Q1 LaunchPad。
  • 如何使用 ot-br-posix 將 Raspberry Pi 設為 OpenThread 邊界路由器 (OTBR)。
  • 如何在 OTBR 上建立 Thread 網路。
  • 將裝置帶外委託至 Thread 網路。
  • 如何使用 ping 指令驗證節點之間的 Thread 通訊。

延伸閱讀

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