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

1. 簡介

26b7f4f6b3ea0700.png

OpenThreadThread® 網路通訊協定的開放原始碼實作項目,是一種穩固又安全的無線網狀網路通訊協定,專為物聯網 (IoT) 裝置而設計。OpenThread 是由 Google Nest 團隊所開發,並以開放原始碼專案的形式開放給開發人員社群使用。

執行緒規格針對智慧型住宅和商業大樓常見的資源受限裝置,制定可靠、安全且高效的無線通訊通訊協定。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 開發板。
  • 在 Raspberry Pi 3B 以上版本上使用 Docker 設定 OpenThread 邊界路由器 (OTBR)。
  • 在 OTBR 中建立 Thread 網路。
  • 使用頻外偵錯功能將裝置新增至 Thread 網路。
  • 使用 CLI 驗證 Thread 網路中節點之間的連線。

軟硬體需求

硬體:

  • 2 個 B91 開發委員會。
  • 一個 Raspberry Pi 3B 以上版本,搭配 Raspbian OS 映像檔。
  • 具備至少兩個 USB 連接埠的 Linux 機器。
  • 已連上網際網路的開關 (或路由器) 和多條乙太網路線。

軟體業:

  • Telink Burning 和偵錯工具 — 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 (完整 Thread 裝置) 使用。如果你尚未持有包裝盒,可以前往 Telink 官方網站取得詳細資料。使用的部分元件如下:

索引

名稱

1

Telink B91 開發委員會

2

Telink Burning Board

3

2.4 吉茲天線

4

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

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

在本程式碼研究室中,需要使用 Raspberry Pi 3B 以上版本,以及 Raspbian Bullseye Lite OS 映像檔Raspbian Bullseye 和電腦。這個路由器是透過乙太網路連上網路,並設為 OpenThread 邊界路由器 (OTBR) 的主機。

網路連線

已連上網際網路的開關 (或路由器) 和多條乙太網路線。用於將 Raspberry Pi 連線至 Linux 電腦,以便透過主機協助 Raspberry Pi 的使用者設定。

LinuxBDT

適用於所有 Telink Chip 系列的 Telink Burning and Debugging Tool (BDT),可讓您清除 OpenThread 韌體並將其刷新至 Telink B91 開發板。在 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 Project 原始碼。
    $ 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 開發板與 Burning Board 連線。

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 的閃光燈方法基本上與 ot-cli-ftd 相同。不過,韌體路徑和名稱不同。

刷新後,請標示兩組 B91 開發板以區分。將刷新的主面板加上「ot-cli-ftd」標籤,設為「FTD Joiner」,並加上 ot-rcp 做為「RCP」閃爍的主面板。

4. 設定 FTD 彙整器裝置的序列控制台

如圖所示,將 FTD 整合器直接插入 Linux 機器的 USB 連接埠。

usb_connection.png

將 FTD 彙整器裝置連線至 Linux 機器之後,Open 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 負責處理 Thread 通訊。

無線電共同處理器 (RCP)

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

OTBR_overview.png

覆盆莓皮

  1. 確認 Raspbian Bullseye Lite OS 映像檔Raspbian Bullseye 已正確寫入 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 以載入 iptables 的核心模組。
    $ 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

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

領先
完成

6

dataset active

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

活動時間戳記:1
頻道:13
頻道 Mask:0x07fff800
Ext PAN ID:b07476e168eda4fc
Mesh 本機前置字串:fd8c:60bc:a98:c7ba::/64
網路金鑰:c312485187




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 Joiner 的 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 開發板。
  • 如何使用 Docker 將 Raspberry Pi 3B 以上版本設為 OpenThread 邊界路由器 (OTBR) 或更高版本。
  • 如何在 OTBR 中建立 Thread 網路。
  • 如何透過頻外佣金將裝置新增至 Thread 網路。
  • 如何驗證 Thread 網路中節點之間的連線。

延伸閱讀

如要瞭解各種 OpenThread 資源,包括 openthread.ioGitHub

參考文件: