使用 B91 開發委員會和 OpenThread 建構 Thread 網路

1. 簡介

26b7f4f6b3ea0700.png

OpenThreadThread® 網路通訊協定的開放原始碼實作項目,專為物聯網 (IoT) 裝置設計,是強大又安全的無線網狀網路通訊協定。OpenThread 由 Google Nest 團隊開發,以開放原始碼專案的形式免費提供給開發人員社群。

Thread 規格可為智慧型住宅和商業大樓中常見的資源受限裝置,建立可靠、安全且節能的無線通訊通訊協定。OpenThread 包含 Thread 中的完整網路層範圍,例如 IPv6、6LoWPAN、IEEE 802.15.4 (具備 MAC 安全性、網狀連結建立和網狀轉送功能)。

Telink 可將 OpenThread 實作項目整合至 Zephyr RTOS,與 Telink 硬體完美相容。這項整合的原始碼可在 GitHub 上隨時存取,也可以做為軟體開發套件 (SDK) 提供。

在本程式碼研究室中,您要在實際硬體上設計 OpenThread、建立及管理 Thread 網路,以及在節點之間交換訊息。下圖說明硬體設定,內含 OT 邊界路由器 (OTBR) 和一個 Thread 裝置的程式碼研究室。

codelab_overview.png

課程內容

  • 使用 Telink Zephyr 開發環境設定 OpenThread 實作。
  • 建構 OpenThread CLI 範例 (ot-cli-ftdot-rcp),並刷新至 Telink B91 Development Boards。
  • 在 Raspberry Pi 3B 以上版本中使用 Docker 設定 OpenThread 邊界路由器 (OTBR)。
  • 在 OTBR 上建立 Thread 網路。
  • 使用頻外偵錯功能將裝置新增至 Thread 網路。
  • 使用 CLI 驗證 Thread 網路中節點之間的連線。

軟硬體需求

硬體:

  • 兩個 B91 開發板。
  • 搭載 Raspbian OS 映像檔的一個 Raspberry Pi 3B 以上版本。
  • 配備至少兩個 USB 連接埠的 Linux 電腦。
  • 已連上網際網路的交換器 (或路由器) 和多條乙太網路線。

軟體:

  • Telink Burning 和 Debugging Tool — LinuxBDT。
  • 序列埠終端工具,例如 PuTTY。
  • 其他工具,如 Git 和 West。

2. 必要條件

執行緒概念和 OpenThread CLI

建議您先完成 OpenThread 模擬程式碼研究室,瞭解 Thread 基本概念和 OpenThread CLI 在本程式碼研究室前,可能會有所幫助。

Linux 裝置

Linux 機器 (Ubuntu v20.04 LTS 以上版本) 就像是設定 Telink Zephyr 開發環境以及刷新所有 Thread 開發板的建構機器。如要完成這些工作,Linux 電腦需要兩個可用的 USB 連接埠和網際網路連線。

序列埠連線和終端機

您可以直接將裝置插入 Linux 電腦的 USB 連接埠。此外,你將需要序列埠終端工具才能存取裝置。

在本程式碼研究室中,終端機工具 PuTTY 用於控制 FTD 彙整器和 Raspberry Pi。本文僅提供使用方式的概要說明,但您也可以使用其他終端軟體。

本程式碼研究室需要兩組 B91 開發套件,下方相片顯示一組基本必備的元件。

overview.png

其中一個套件將做為 RCP (無線電共同處理器),另一個則做為 FTD (完整執行緒裝置)。如果您尚未擁有,可前往 Telink 官方網站取得詳細資料。要使用的部分元件如下:

索引

名稱

1

Telink B91 開發委員會

2

鐵連結燒板

3

2.4Ghz 天線

4

USB 傳輸線 (USB A 轉迷你 USB)

搭載 Raspbian OS 映像檔的 Raspberry Pi 3B 以上版本

在本程式碼研究室中,必須使用搭載 Raspbian Bullseye Lite OS 映像檔Raspbian Bullseye with Desktop 的 Raspberry Pi 3B 以上版本。本裝置是透過乙太網路連上網際網路,並會設為 OpenThread 邊界路由器 (OTBR) 的主機。

網路連線

連上網際網路的交換器 (或路由器) 和多條乙太網路線。這些物件的用途是將 Raspberry Pi 連至 Linux 電腦,以便透過主機進行 Raspberry Pi 的使用者設定。

LinuxBDT

建立適用於所有 Telink Chip 系列的 Burning 和偵錯工具 (BDT),可讓您將 OpenThread 韌體清除並刷新至 Telink B91 Development Boards。在 Linux 電腦上安裝 X86 型的 Linux 版本 linuxBDT

其他

  • Git,用於設定 Telink Zephyr 開發環境。
  • West 負責管理 Zephyr 專案和建構 OpenThread 二進位檔。

3. 設定韌體

在 Linux 電腦上開啟 CLI 終端機,然後執行下列指令,確認 APT 是最新版本。

$ sudo apt update
$ sudo apt upgrade

完成後,請按照下列步驟操作。

  1. 安裝依附元件。
    $ wget https://apt.kitware.com/kitware-archive.sh
    $ sudo bash kitware-archive.sh
    $ sudo apt install --no-install-recommends git cmake ninja-build \
    gperf ccache dfu-util device-tree-compiler python3-dev python3-pip \
    python3-setuptools python3-tk python3-wheel xz-utils file make gcc \
    gcc-multilib g++-multilib libsdl2-dev
    
    敬上 Zephyr 目前需要主要依附元件的最低版本,例如 CMake (3.20.0)、Python3 (3.6) 和 Devicetree Compiler (1.4.6)。
    $ cmake --version
    $ python3 --version
    $ dtc --version
    
    敬上 請先確認系統中已安裝的版本,再執行後續步驟。如果版本不正確,請將 APT 鏡像切換至最新的穩定鏡像,或是手動更新這些依附元件。
  2. 安裝西部安裝。
    $ pip3 install --user -U west
    $ echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
    $ source ~/.bashrc
    
    敬上 確認 ~/.local/bin 位於 $PATH 環境變數中。
  3. 取得 Zephyr 專案原始碼。
    $ west init ~/zephyrproject
    $ cd ~/zephyrproject
    $ west update
    $ west blobs fetch hal_telink
    $ west zephyr-export
    
  4. 為 Zephyr 安裝其他 Python 依附元件。
    $ pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt
    
  5. 設定 Zephyr 工具鍊。將 Zephyr 工具鍊 (約 1 至 2 GB) 下載至本機目錄,即可刷新大部分的遊戲板。
    $ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.1/zephyr-sdk-0.16.1_linux-x86_64.tar.xz
    $ wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.1/sha256.sum | shasum --check --ignore-missing
    
    敬上 下載 Zephyr SDK 並放在建議路徑中,如下所示。
    $HOME/zephyr-sdk[-x.y.z]
    $HOME/.local/zephyr-sdk[-x.y.z]
    $HOME/.local/opt/zephyr-sdk[-x.y.z]
    $HOME/bin/zephyr-sdk[-x.y.z]
    /opt/zephyr-sdk[-x.y.z]
    /usr/zephyr-sdk[-x.y.z]
    /usr/local/zephyr-sdk[-x.y.z]
    
    敬上 其中 [-x.y.z] 是可以是任何文字的選填文字,例如 -0.16.1。SDK 安裝後就無法移動目錄。然後安裝 Zephyr 工具鍊。
    $ tar xvf zephyr-sdk-0.16.1_linux-x86_64.tar.xz
    $ cd zephyr-sdk-0.16.1
    $ ./setup.sh -t riscv64-zephyr-elf -h -c
    
  6. 建構 Hello World 範例。首先,使用 Hello World 範例確認官方 Zephyr 專案設定是否正確,然後繼續設定自訂專案。
    $ cd ~/zephyrproject/zephyr
    $ west build -p auto -b tlsr9518adk80d samples/hello_world
    
    敬上 使用 West 建構指令,從 Zephyr 存放區的根目錄建構 hello_world 範例。你可以在 build/zephyr directory 下方找到名為 zephyr.bin 的韌體。
  7. 將 Zephyr 環境指令碼新增至 ~/.bashrc。執行下列指令。
    $ echo "source ~/zephyrproject/zephyr/zephyr-env.sh" >> ~/.bashrc
    $ source ~/.bashrc
    
  8. 新增 Telink Zephyr 遠端存放區。在本機下載 Telink 存放區做為開發分支版本,然後進行更新。
    $ cd ~/zephyrproject/zephyr
    $ git remote add telink-semi https://github.com/telink-semi/zephyr
    $ git fetch telink develop
    $ git checkout develop
    $ west update
    $ west blobs fetch hal_telink
    

如需更多資訊,請參閱 Zephyr Doc - 入門指南

下載 Telink LinuxBDT 工具,然後解壓縮至 Linux 機器的本機目錄 (例如主目錄 ~),以將韌體刷新到 B91 開發委員會。

$ cd ~
$ wget http://wiki.telink-semi.cn/tools_and_sdk/Tools/BDT/LinuxBDT.tar.bz2
$ tar -vxf LinuxBDT.tar.bz2 

透過 USB 介面將 Burning Board 連接至 Linux 電腦,然後輸入以下指令。

$ cd LinuxBDT
$ sudo ./bdt lsusb -v
Bus 002 Device 001: ID 1d6b:0003 xHCI Host Controller
Bus 001 Device 003: ID 0bda:565a Integrated_Webcam_HD
Bus 001 Device 023: ID 413c:301a Dell MS116 USB Optical Mouse
Bus 001 Device 037: ID 248a:826a Telink Web Debugger v3.6
Bus 001 Device 001: ID 1d6b:0002 xHCI Host Controller

如果系統顯示「Telink Web Debugger v3.6」訊息,表示 BDT 程式設計師已成功連線至 Linux 電腦。

韌體編譯

本程式碼研究室會建構兩種 OpenThread 韌體:

  • ot-cli-ftd
  • 和「ot-rcp」。

編譯方法如下:

  1. 無線電共同處理器 (ot-rcp)
    $ cd ~/zephyrproject
    $ rm -rf build_ot_coprocessor
    $ west build -b tlsr9518adk80d -d build_ot_coprocessor zephyr/samples/net/openthread/coprocessor -- -DDTC_OVERLAY_FILE="usb.overlay" -DOVERLAY_CONFIG=overlay-rcp-usb-telink.conf
    
  2. 包含互動式指令列的完整精選 Thread 裝置 (ot-cli-ftd)
    $ cd ~/zephyrproject
    $ rm -rf build_ot_cli_ftd
    $ west build -b tlsr9518adk80d -d build_ot_cli_ftd zephyr/samples/net/openthread/cli -- -DOVERLAY_CONFIG=overlay-telink-fixed-mac.conf -DCONFIG_OPENTHREAD_FTD=y
    

韌體閃光燈

使用 USB 傳輸線將 B91 開發板連接到燃燒板 (如下圖所示)。

connection_overview.png

在指令列中執行下列指令,執行韌體烙印 (例如以刷新 ot-cli-ftd 韌體為例)。

$ cd ~/zephyrproject/build_ot_cli_ftd/zephyr
$ cp zephyr.bin ~/LinuxBDT/bin/ot-cli-ftd.bin
$ cd ~/LinuxBDT
$ sudo ./bdt 9518 ac
 Activate OK!
$ sudo ./bdt 9518 wf 0 -i bin/ot-cli-ftd.bin
 EraseSectorsize...
 Total Time: 2181 ms
 Flash writing...
 [100%][-] [##################################################]
 File Download to Flash at address 0x000000: 491700 bytes
 Total Time: 30087 ms

ot-rcp 的 Flash 方法基本上與 ot-cli-ftd 相同。不過,韌體路徑和名稱之間也存在差異。

刷新後,請予以標示以區分兩個 B91 開發板。使用 ot-cli-ftd 刷新遊戲板加上「FTD 彙整器」標籤並使用 ot-rcp 刷新板為「RCP」。

4. 設定 FTD 聯結器裝置的序列控制台

如圖所示,請直接將 FTD 聯接器插入 Linux 電腦的 USB 連接埠。

usb_connection.png

將 FTD 聯結器裝置連線至 Linux 電腦之後,請開啟 PuTTY。然後建立新的終端機、設定序列埠資訊,並開啟序列埠。

uart_console.png

OpenThread 指令列參考資料:OpenThread CLI 參考資料。請務必在所有指令前面加上 ot

範例:

> ot state
disabled
Done
> ot channel
11
Done
>

5. 將 Raspberry Pi 設為 OpenThread 邊界路由器

OpenThread 邊界路由器是一種由兩個主要部分組成的裝置:

  • Raspberry Pi 包含做為邊界路由器 (BR) 時需要的所有服務和韌體。
  • RCP 負責執行緒通訊。

無線電共同處理器 (RCP)

如要刷新 ot-rcp 韌體,請按照 ot-cli-ftd 韌體刷新程序的步驟操作。如下圖所示,將 B91 開發板連接到 Raspberry Pi 上的 USB 連接埠。

OTBR_overview.png

覆盆子派

  1. 確認 Raspbian Bullseye Lite OS 映像檔Raspbian Bullseye with Desktop 已正確寫入 SD 卡。
  2. 您可以選擇透過 SSH 登入 Raspberry Pi,或是直接與 Raspbian Desktop 合作。本程式碼研究室將使用 SSH。
  3. 在繼續下一步安裝 OTBR Docker 之前,請務必先更新本機存放區和套件管理員。
    $ sudo apt-get update
    $ sudp apt-get upgrade
    

安裝 Docker

如果您在上一步更新本機存放區和套件管理員 APT,請重新啟動 Raspberry Pi,然後開啟 SSH 終端機視窗。

  1. 安裝 Docker:
    $ curl -sSL https://get.docker.com | sh
    
  2. 將目前的帳戶放入 Docker 群組來授予權限,這樣每個指令前不需要將 sudo 加入。
    $ sudo usermod -aG docker $USER
    
    敬上 你必須重新啟動 Raspberry Pi,才能生效。
  3. 如果尚未啟動 Docker,請啟動:
    $ sudo dockerd
    
  4. OTBR 防火牆指令碼會在 Docker 容器內產生規則。在此之前,請執行 modprobe 來載入 iptable 的核心模組。
    $ sudo modprobe ip6table_filter
    

設定並執行 Docker

本程式碼研究室可直接從 OpenThread Docker Hub 提取 OTBR Docker 映像檔。這張圖片已通過 OpenThread 團隊測試和驗證。

  1. 提取最新映像檔:
    $ docker pull openthread/otbr:latest
    
  2. 檢查 Docker 容器中的映像檔清單:
    $ docker images
    REPOSITORY        TAG       IMAGE ID       CREATED      SIZE
    openthread/otbr   latest    db081f4de15f   6 days ago   766MB
    
  3. 檢查 /dev 來判斷 RCP 裝置的序列埠名稱,ttyACM0 表示 RCP 已正確連線。
    $ ls /dev/tty*
    ...
    /dev/ttyACM0
    ... 
    
  4. 首次執行 OTBR Docker 並參照 RCP (ttyACM0) 的序列埠。如要繼續使用這個 OTBR Docker,請使用 docker start otbr 指令。
    $ docker run --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 openthread/otbr --radio-url spinel+hdlc+uart:///dev/ttyACM0
    
  5. 開啟新的 SSH 終端機視窗,測試 Raspberry Pi 與 RCP 之間的連線。
    $ docker exec -ti otbr sh -c "sudo ot-ctl"
    > state 
    disabled
    Done
    

選用的 docker 指令:

  • 取得執行中的 Docker 容器相關資訊:
    $ docker ps -aq
    
  • 停止 OTBR Docker:
    $ docker stop otbr
    
  • 移除 OTBR Docker:
    $ docker rm otbr
    
  • 重新載入 OTBR Docker:
    $ docker restart otbr
    

此時,FTD 聯結器裝置和 OTBR 已準備就緒,您可以繼續下一個步驟,建構 Thread 網路。

6. 建立 Thread 網路

在 RCP 建立 Thread 網路

我們使用 OTBR 上的 ot-ctl 殼層來建立 Thread 網路。如果您在上一節中退出殼層,請輸入下列指令,在 SSH 終端機中再次啟動殼層:

$ docker exec -ti otbr sh -c "sudo ot-ctl"

接著,按照表格中指定的順序輸入指令,並確定每個步驟都能達到預期結果,再繼續進行下一個步驟。

索引

指令

簡介

預期的回應

1

dataset init new

建立新的隨機網路資料集。

完成

2

dataset commit active

將新資料集提交至非揮發性儲存空間中的主動作業資料集。

完成

3

ifconfig up

開啟 IPv6 介面。

完成

4

thread start

啟用 Thread 通訊協定作業並連接至 Thread 網路。

完成

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

5

state

請檢查裝置狀態。您可以多次呼叫這個指令,直到成為主要版本,再進行下一個步驟。

leader
Done

6

dataset active

檢查完整的有效作業資料集並記錄網路金鑰。











ot-cli-ftd 裝置加入這個 Thread 網路時,將使用 OTBR 在建立網路期間隨機產生的網路金鑰。

透過頻外調控將 FTD 彙整器新增至 Thread

頻外調控是指為等待透過非無線方法 (例如手動輸入 OpenThread CLI) 加入網路的裝置傳輸網路憑證。在序列控制台中,依序輸入以下指令給 FTD 彙整者。

索引

指令

簡介

預期的回應

1

ot dataset networkkey c312485187484ceb5992d2343baaf93d

裝置只需要網路金鑰即可連線至 Thread 網路。

完成

2

ot dataset commit active

將新資料集提交至非揮發性儲存空間中的主動作業資料集。

完成

3

ot ifconfig up

開啟 IPv6 介面。

完成

4

ot thread start

啟用 Thread 通訊協定作業並連接至 Thread 網路。

完成

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

5

ot state

請檢查裝置狀態。

孩童/路由器
完成

拓撲

在 SSH 終端機中輸入 ipaddrchild tablerouter table 等指令,即可取得下列程式碼片段的回應。

> ipaddr rloc
fd8c:60bc:a98:c7ba:0:ff:fe00:b000
Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|D|N|Ver|CSL|QMsgCnt|Suprvsn| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+---+-------+-------+------------------+
|   1 | 0xb001 |        240 |         23 |     3 |   51 |1|1|1|  3| 0 |     0 |   129 | 82bc12fbe783468e |

Done
> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     | Link |
+----+--------+----------+-----------+-------+--------+-----+------------------+------+
| 44 | 0xb000 |       63 |         0 |     0 |      0 |   0 | 7ae354109d611f7e |    0 |

Done
...
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|D|N|Ver|CSL|QMsgCnt|Suprvsn| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+---+-------+-------+------------------+

Done
> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     | Link |
+----+--------+----------+-----------+-------+--------+-----+------------------+------+
| 33 | 0x8400 |       63 |         0 |     3 |      3 |  13 | e61487c1cda940a6 |    1 |
| 44 | 0xb000 |       63 |         0 |     0 |      0 |   0 | 7ae354109d611f7e |    0 |

Done

OTBR 的 RLOC160xb000,而 FTD 彙整器的 RLOC16 最初為 0xb001。則在取得路由器 ID 後,FTD 聯結器的 RLOC16 會變成 0x8400。我們可以看到 FTD 聯結器已從孩童升級至路由器。

目前的 Thread 網路含有兩個節點,拓撲如下圖所示。

topology.png

7. Thread 裝置之間的通訊

ICMPv6 通訊

我們使用 ping 指令來檢查相同網路中的 Thread 裝置能否互相通訊。首先,使用 ipaddr 指令取得裝置的 RLOC。

> ipaddr
fd8c:60bc:a98:c7ba:0:ff:fe00:fc11
fdbd:7274:649c:1:1d19:9613:f705:a5af
fd8c:60bc:a98:c7ba:0:ff:fe00:fc10
fd8c:60bc:a98:c7ba:0:ff:fe00:fc38
fd8c:60bc:a98:c7ba:0:ff:fe00:fc00
fd8c:60bc:a98:c7ba:0:ff:fe00:b000       # Routing Locator (RLOC)
fd8c:60bc:a98:c7ba:5249:34ab:26d1:aff6
fe80:0:0:0:78e3:5410:9d61:1f7e
Done

在 FTD 聯結器的序列控制台中輸入下列指令,執行連線偵測 (ping) 作業。

> ot ping fd8c:60bc:a98:c7ba:0:ff:fe00:b000
16 bytes from fd8c:60bc:a98:c7ba:0:ff:fe00:b000: icmp_seq=1 hlim=64 time=19ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 19/19.0/19 ms.
Done

序列埠的輸出回應表示 OTBR 端已收到連線偵測 (ping),且 FTD 聯結器已收到 OTBR 傳回的連線偵測 (ping)。兩部裝置之間的通訊成功。

UDP 通訊

OpenThread 提供的應用程式服務也包含 UDP。您可以使用 UDP API 在 Thread 網路中的節點之間傳遞資訊,或是透過邊界路由器將資訊傳遞給外部網路。如需 OpenThread UDP API 的詳細介紹,請參閱 OpenThread CLI - UDP 範例。本程式碼研究室會使用其中的部分 API,在 OTBR 和 FTD 彙整器之間傳輸資訊。

首先,請取得 OTBR 的網狀本機 EID。這個位址也是 Thread 裝置的 IPv6 位址之一,可用來存取相同 Thread 網路分區中的 Thread 裝置。

> ipaddr mleid
fd8c:60bc:a98:c7ba:5249:34ab:26d1:aff6
Done

在 SSH 終端機中輸入下列指令,以啟用 OTBR UDP,並繫結裝置的 1022 通訊埠。

> udp open
Done
> udp bind :: 1022
Done

在序列控制台中輸入下列指令,啟用 FTD 彙整器的 UDP。繫結裝置的 1022 通訊埠,然後將 5 位元組的 hello 訊息傳送至 OTBR。

> ot udp open 
Done
> ot udp bind :: 1022
Done
> ot udp send fd8c:60bc:a98:c7ba:5249:34ab:26d1:aff6 1022 hello
Done

SSH 終端機會輸出下列資訊。OTBR 收到 FTD 聯結器傳送的 hello 訊息,表示 UDP 通訊成功。

> 5 bytes from fd8c:60bc:a98:c7ba:9386:63cf:19d7:5a61 1022 hello

8. 恭喜

您建立了簡易的 Thread 網路,並驗證這個網路中的通訊內容。

您已經知道:

  • 如何建構及使用 Telink Zephyr 開發環境。
  • 如何建構 ot-cli-ftdot-rcp 二進位檔,並將這些二進位檔刷新至 Telink B91 Development Boards。
  • 如何使用 Docker 將 Raspberry Pi 3B 以上版本設為 OpenThread 邊界路由器 (OTBR)。
  • 如何在 OTBR 建立 Thread 網路。
  • 如何透過頻外調控功能將裝置新增至 Thread 網路。
  • 如何驗證 Thread 網路中節點之間的連線能力。

其他資訊

歡迎前往 openthread.ioGitHub 瞭解各種 OpenThread 資源,包括:

參考文件: