สร้างเครือข่ายเทรดด้วยคณะกรรมการพัฒนา B91 และ OpenThread

1. บทนำ

26b7f4f6b3ea0700.png

OpenThread เป็นการใช้งานโปรโตคอลเครือข่าย Thread® แบบโอเพนซอร์ส ซึ่งเป็นโปรโตคอลเครือข่ายแบบเมชไร้สายที่แข็งแกร่งและปลอดภัยซึ่งออกแบบมาสำหรับอุปกรณ์ Internet of Things (IoT) OpenThread พัฒนาโดยทีม Nest ของ Google และพร้อมให้บริการแก่ชุมชนนักพัฒนาซอฟต์แวร์ในรูปแบบโปรเจ็กต์โอเพนซอร์ส

ข้อกำหนดของ Thread กำหนดโปรโตคอลการสื่อสารแบบไร้สายที่เชื่อถือได้ ปลอดภัย และประหยัดพลังงานสำหรับอุปกรณ์ที่มีข้อจำกัดด้านทรัพยากรซึ่งมักพบในสมาร์ทโฮมและอาคารพาณิชย์ OpenThread มีขอบเขตเลเยอร์เครือข่ายทั้งหมดภายใน Thread เช่น IPv6, 6LoWPAN, IEEE 802.15.4 ที่มีการรักษาความปลอดภัย MAC, การสร้างลิงก์ Mesh และการกำหนดเส้นทาง Mesh

Telink ได้ผสานรวมการใช้งาน OpenThread เข้ากับ Zephyr RTOS ซึ่งช่วยให้ใช้งานร่วมกับฮาร์ดแวร์ของ Telink ได้อย่างราบรื่น ซอร์สโค้ดสำหรับการผสานรวมนี้พร้อมให้เข้าถึงได้บน GitHub และยังมีให้ในรูปแบบชุดพัฒนาซอฟต์แวร์ (SDK) ด้วย

ในโค้ดแล็บนี้ คุณจะได้เขียนโปรแกรม OpenThread บนฮาร์ดแวร์จริง สร้างและจัดการเครือข่าย Thread รวมถึงแลกเปลี่ยนข้อความระหว่างโหนด รูปภาพด้านล่างแสดงการตั้งค่าฮาร์ดแวร์ ซึ่งมี OT Border Router (OTBR) และอุปกรณ์ Thread 1 เครื่องใน Codelab

codelab_overview.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่าการใช้งาน OpenThread โดยใช้สภาพแวดล้อมการพัฒนา Zephyr ของ Telink
  • เพื่อสร้างตัวอย่าง CLI ของ OpenThread (ot-cli-ftd และ ot-rcp) และแฟลชลงในบอร์ดพัฒนา Telink B91
  • วิธีตั้งค่า OpenThread Border Router (OTBR) โดยใช้ Docker บน Raspberry Pi 3B+ ขึ้นไป
  • วิธีสร้างเครือข่าย Thread บน OTBR
  • หากต้องการเพิ่มอุปกรณ์ลงในเครือข่าย Thread โดยใช้การแก้ไขข้อบกพร่องนอกแบนด์
  • หากต้องการตรวจสอบการเชื่อมต่อระหว่างโหนดในเครือข่าย Thread โดยใช้ CLI

สิ่งที่คุณต้องมี

ฮาร์ดแวร์

  • บอร์ดพัฒนา B91 จำนวน 2 บอร์ด
  • Raspberry Pi 3B+ ขึ้นไปที่มีอิมเมจระบบปฏิบัติการ Raspbian
  • เครื่อง Linux ที่มีพอร์ต USB อย่างน้อย 2 พอร์ต
  • สวิตช์ (หรือเราเตอร์) ที่เชื่อมต่ออินเทอร์เน็ตและสายอีเทอร์เน็ตหลายเส้น

ซอฟต์แวร์:

  • เครื่องมือเขียนและแก้ไขข้อบกพร่องของ Telink —— LinuxBDT
  • เครื่องมือเทอร์มินัลพอร์ตอนุกรม เช่น PuTTY
  • เครื่องมืออื่นๆ เช่น Git และ West

2. ข้อกำหนดเบื้องต้น

แนวคิดของ Thread และ OpenThread CLI

คุณอาจต้องทำ Codelab การจำลอง OpenThread เพื่อทำความคุ้นเคยกับแนวคิดพื้นฐานของ Thread และ OpenThread CLI ก่อนทำ Codelab นี้

เครื่อง Linux

เครื่อง Linux (Ubuntu v20.04 LTS ขึ้นไป) ทำหน้าที่เป็นเครื่องบิลด์เพื่อตั้งค่าสภาพแวดล้อมการพัฒนา Telink Zephyr และแฟลชบอร์ดพัฒนา Thread ทั้งหมด หากต้องการทำงานเหล่านี้ เครื่อง Linux ต้องมีพอร์ต USB ที่พร้อมใช้งาน 2 พอร์ตและการเชื่อมต่ออินเทอร์เน็ต

การเชื่อมต่อพอร์ตอนุกรมและเทอร์มินัล

คุณเสียบอุปกรณ์เข้ากับพอร์ต USB ของเครื่อง Linux ได้โดยตรง นอกจากนี้ คุณจะต้องมีเครื่องมือเทอร์มินัลพอร์ตอนุกรมเพื่อเข้าถึงอุปกรณ์

ในโค้ดแล็บนี้ จะใช้เครื่องมือเทอร์มินัล PuTTY เพื่อควบคุม FTD Joiner และ Raspberry Pi โดยจะแสดงภาพรวมของการใช้งาน แต่คุณก็ใช้ซอฟต์แวร์เทอร์มินัลอื่นๆ ได้เช่นกัน

Codelab นี้ต้องใช้ชุดเครื่องมือพัฒนา B91 2 ชุด รูปภาพด้านล่างแสดงคอมโพเนนต์ขั้นต่ำที่จำเป็นในชุดเดียว

overview.png

ชุดอุปกรณ์ชุดหนึ่งจะใช้เป็น RCP (ตัวประมวลผลร่วมวิทยุ) ส่วนอีกชุดจะทำหน้าที่เป็น FTD (อุปกรณ์ Thread แบบเต็ม) หากยังไม่มีชุดอุปกรณ์ดังกล่าว คุณสามารถดูรายละเอียดเพิ่มเติมได้จากเว็บไซต์อย่างเป็นทางการของ Telink โดยคอมโพเนนต์บางอย่างที่จะใช้มีดังนี้

ดัชนี

ชื่อ

1

Telink B91 Development Board

2

Telink Burning Board

3

เสาอากาศ 2.4Ghz

4

สาย USB (USB A ถึง mini USB)

Raspberry Pi 3B+ ขึ้นไปที่มีอิมเมจระบบปฏิบัติการ Raspbian

ในโค้ดแล็บนี้ คุณจะต้องมี Raspberry Pi 3B+ ขึ้นไปที่ใช้อิมเมจระบบปฏิบัติการ Raspbian Bullseye Lite หรือ Raspbian Bullseye with Desktop โดยจะเชื่อมต่ออินเทอร์เน็ตผ่านอีเทอร์เน็ตและจะได้รับการกำหนดค่าเป็นโฮสต์สำหรับ OpenThread Border Router (OTBR)

การเชื่อมต่อเครือข่าย

สวิตช์ (หรือเราเตอร์) ที่เชื่อมต่ออินเทอร์เน็ตและสายอีเทอร์เน็ตหลายเส้น โดยใช้เพื่อเชื่อมต่อ Raspberry Pi กับเครื่อง Linux ซึ่งช่วยให้ผู้ใช้กำหนดค่า Raspberry Pi ผ่านโฮสต์ได้

LinuxBDT

เครื่องมือการเบิร์นและการแก้ไขข้อบกพร่อง (BDT) ของ Telink ซึ่งใช้ได้กับชิป Telink ทุกรุ่นช่วยให้คุณลบและแฟลชเฟิร์มแวร์ OpenThread ลงในบอร์ดพัฒนา Telink B91 ได้ ติดตั้ง Linux เวอร์ชัน X86 linuxBDT ในเครื่อง Linux

อื่นๆ

  • Git สำหรับการตั้งค่าสภาพแวดล้อมในการพัฒนา Zephyr ของ Telink
  • 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. ติดตั้งการอ้างอิง Python เพิ่มเติมสำหรับ Zephyr
    $ pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt
    
  5. ตั้งค่าเครื่องมือ Zephyr ดาวน์โหลด Toolchain ของ 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 แล้ว จากนั้นติดตั้ง Toolchain ของ 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 ก่อนอื่น ให้ตรวจสอบว่าการกำหนดค่าโปรเจ็กต์ Zephyr อย่างเป็นทางการถูกต้องโดยใช้ตัวอย่าง Hello World จากนั้นดำเนินการตั้งค่าโปรเจ็กต์ที่กำหนดเอง
    $ cd ~/zephyrproject/zephyr
    $ west build -p auto -b tlsr9518adk80d samples/hello_world
    
    ใช้คำสั่ง West build เพื่อสร้างตัวอย่าง hello_world จากไดเร็กทอรีรากของที่เก็บ Zephyr คุณจะดูเฟิร์มแวร์ชื่อ zephyr.bin ได้ในส่วน build/zephyr directory
  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 - คู่มือการเริ่มต้นใช้งาน

ดาวน์โหลดเครื่องมือ Telink LinuxBDT แล้วแตกไฟล์ไปยังไดเรกทอรีในเครื่องบนเครื่อง Linux เช่น ไดเรกทอรีหน้าแรก ~ เพื่อให้สามารถแฟลชเฟิร์มแวร์ลงในบอร์ดพัฒนา B91

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

เชื่อมต่อ Burning Board กับเครื่อง Linux ผ่านอินเทอร์เฟซ USB แล้วป้อนคำสั่งต่อไปนี้

$ 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 ได้สำเร็จ

วิดีโอรวมเฟิร์มแวร์

Codelab นี้จะสร้างเฟิร์มแวร์ OpenThread 2 ประเภท ได้แก่

  • 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
    

การแฟลชเฟิร์มแวร์

เชื่อมต่อบอร์ดพัฒนา B91 กับบอร์ดเบิร์นโดยใช้สาย USB ตามที่แสดงในรูปด้านล่าง

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 ทั้ง 2 บอร์ดโดยทำเครื่องหมายตามนั้น ติดป้ายกำกับบอร์ดที่แฟลชด้วย ot-cli-ftd เป็น "FTD Joiner" และบอร์ดที่แฟลชด้วย ot-rcp เป็น "RCP"

4. กำหนดค่า Serial Console สำหรับอุปกรณ์ FTD Joiner

ดังที่แสดงในรูปภาพ ให้เสียบ FTD Joiner เข้ากับพอร์ต USB ของเครื่อง Linux โดยตรง

usb_connection.png

หลังจากเชื่อมต่ออุปกรณ์ FTD Joiner กับเครื่อง Linux แล้ว ให้เปิด PuTTY จากนั้นสร้างเทอร์มินัลใหม่ ตั้งค่าข้อมูลพอร์ตอนุกรม และเปิดพอร์ตอนุกรม

uart_console.png

การอ้างอิงบรรทัดคำสั่ง OpenThread อยู่ที่การอ้างอิง CLI ของ OpenThread อย่าลืมใส่คำนำหน้า ot ในคำสั่งทั้งหมด

ตัวอย่าง

> ot state
disabled
Done
> ot channel
11
Done
>

5. ตั้งค่า Raspberry Pi เป็นเราเตอร์ขอบ OpenThread

OpenThread Border Router เป็นอุปกรณ์ที่มี 2 ส่วนหลัก ได้แก่

  • Raspberry Pi มีบริการและเฟิร์มแวร์ทั้งหมดที่จำเป็นต่อการทำหน้าที่เป็น Border Router (BR)
  • RCP มีหน้าที่รับผิดชอบในการสื่อสารผ่าน Thread

ตัวประมวลผลร่วมวิทยุ (RCP)

หากต้องการแฟลชot-rcpเฟิร์มแวร์ ให้ทำตามขั้นตอนเดียวกับกระบวนการแฟลชot-cli-ftdเฟิร์มแวร์ เชื่อมต่อบอร์ดพัฒนา B91 กับพอร์ต USB บน Raspberry Pi ตามที่แสดงในรูปด้านล่าง

OTBR_overview.png

Raspberry Pi

  1. ตรวจสอบว่าได้เขียนอิมเมจระบบปฏิบัติการ Raspbian Bullseye Lite หรือ Raspbian Bullseye with Desktop ลงในการ์ด SD อย่างถูกต้อง
  2. คุณมีตัวเลือกในการ SSH ไปยัง Raspberry Pi หรือทำงานกับ Raspbian Desktop โดยตรง Codelab นี้จะใช้ 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

Codelab นี้จะดึงอิมเมจ Docker ของ OTBR จาก OpenThread Docker Hub โดยตรง รูปภาพนี้ได้รับการทดสอบและยืนยันโดยทีม 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. ระบุชื่อพอร์ตอนุกรมของอุปกรณ์ RCP โดยตรวจสอบ /dev, 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
    
  • หยุด Docker ของ OTBR
    $ docker stop otbr
    
  • นำ OTBR Docker ออก
    $ docker rm otbr
    
  • โหลด Docker ของ OTBR ซ้ำ
    $ docker restart otbr
    

ตอนนี้อุปกรณ์ FTD Joiner และ OTBR พร้อมแล้ว และคุณสามารถไปยังขั้นตอนถัดไปเพื่อสร้างเครือข่าย Thread ได้

6. สร้างเครือข่าย Thread

สร้างเครือข่าย Thread ใน RCP

เราใช้เชลล์ ot-ctl ใน OTBR เพื่อสร้างเครือข่าย 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 วินาทีเพื่อให้ Thread Interface พร้อมใช้งาน

5

state

ตรวจสอบสถานะอุปกรณ์ คุณเรียกใช้คำสั่งนี้ได้หลายครั้งจนกว่าอุปกรณ์จะกลายเป็นผู้นำและไปยังขั้นตอนถัดไป

ผู้นำ
เสร็จสิ้น

6

dataset active

ตรวจสอบชุดข้อมูลการปฏิบัติงานที่ใช้งานอยู่และบันทึกคีย์เครือข่ายให้ครบถ้วน

Active Timestamp: 1
Channel: 13
Channel Mask: 0x07fff800
Ext PAN ID: b07476e168eda4fc
Mesh Local Prefix: fd8c:60bc:a98:c7ba::/64
Network Key: c312485187484ceb5992d2343baaf93d
Network Name: OpenThread-599c
PAN ID: 0x599c
PSKc: 04f79ad752e8401a1933486c95299f60
Security Policy: 672 onrc 0
Done

ระบบจะใช้คีย์เครือข่ายที่ OTBR สร้างขึ้นแบบสุ่มในระหว่างการสร้างเครือข่ายเมื่ออุปกรณ์ ot-cli-ftd เข้าร่วมเครือข่าย Thread นี้

เพิ่ม FTD Joiner ไปยัง Thread ผ่านการจัดสรรนอกแบนด์

การจัดสรรนอกแบนด์หมายถึงการส่งข้อมูลเข้าสู่ระบบเครือข่ายไปยังอุปกรณ์ที่รอเข้าร่วมเครือข่ายผ่านวิธีการที่ไม่ใช่แบบไร้สาย (เช่น การป้อนใน OpenThread CLI ด้วยตนเอง) ป้อนคำสั่งต่อไปนี้ตามลำดับในคอนโซลแบบอนุกรมไปยัง FTD Joiner

ดัชนี

คำสั่ง

บทนำ

การตอบกลับที่คาดหวัง

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

ตรวจสอบสถานะอุปกรณ์

child/router
Done

โทโพโลยี

ป้อนคำสั่ง เช่น ipaddr, child table, router table ในเทอร์มินัล SSH เพื่อรับการตอบกลับ เช่น ข้อมูลโค้ดต่อไปนี้

> 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

RLOC16ของ OTBR คือ 0xb000 และRLOC16ของ FTD Joiner ในตอนแรกคือ 0xb001 จากนั้น RLOC16 ของ FTD Joiner จะเปลี่ยนเป็น 0x8400 หลังจากได้รับรหัสเราเตอร์ จะเห็นว่ามีการอัปเกรด FTD Joiner จากอุปกรณ์ย่อยเป็นเราเตอร์

เครือข่าย Thread ปัจจุบันมี 2 โหนด และโทโพโลยีเป็นดังที่แสดงในรูปด้านล่าง

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 Joiner เพื่อดำเนินการ 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 Joiner ได้รับการตอบกลับ Ping ที่ OTBR ส่งคืน การสื่อสารระหว่างอุปกรณ์ทั้ง 2 เครื่องสำเร็จแล้ว

การสื่อสาร UDP

บริการแอปพลิเคชันที่ OpenThread ให้บริการยังรวมถึง UDP ด้วย คุณใช้ UDP API เพื่อส่งข้อมูลระหว่างโหนดในเครือข่าย Thread หรือส่งข้อมูลไปยังเครือข่ายภายนอกผ่าน Border Router ได้ ดูข้อมูลเบื้องต้นโดยละเอียดเกี่ยวกับ UDP API ของ OpenThread ได้ที่ OpenThread CLI - ตัวอย่าง UDP Codelab นี้จะใช้ API บางรายการเพื่อส่งข้อมูลระหว่าง OTBR กับ FTD Joiner

ก่อนอื่น ให้รับ EID ในเครื่องของ Mesh สำหรับ OTBR ที่อยู่นี้ยังเป็นที่อยู่ IPv6 ของอุปกรณ์ Thread ด้วย และสามารถใช้เพื่อเข้าถึงอุปกรณ์ Thread ในพาร์ติชันเครือข่าย Thread เดียวกันได้

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

ป้อนคำสั่งต่อไปนี้ในเทอร์มินัล SSH เพื่อเปิดใช้ OTBR UDP และเชื่อมโยงพอร์ต 1022 ของอุปกรณ์

> udp open
Done
> udp bind :: 1022
Done

ป้อนคำสั่งต่อไปนี้ในคอนโซลแบบอนุกรมและเปิดใช้ UDP ของ FTD Joiner เชื่อมโยงพอร์ต 1022 ของอุปกรณ์ แล้วส่งข้อความ hello ขนาด 5 ไบต์ไปยัง 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 จะได้รับข้อความ hello จาก FTD Joiner ซึ่งหมายความว่าการสื่อสารผ่าน UDP สำเร็จ

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

8. ขอแสดงความยินดี

คุณได้สร้างเครือข่าย Thread อย่างง่ายและยืนยันการสื่อสารภายในเครือข่ายนี้แล้ว

ตอนนี้คุณก็รู้แล้วว่า

  • วิธีสร้างและใช้สภาพแวดล้อมการพัฒนา Zephyr ของ Telink
  • วิธีสร้างไบนารี ot-cli-ftd และ ot-rcp รวมถึงวิธีแฟลชลงในบอร์ดพัฒนา Telink B91
  • วิธีตั้งค่า Raspberry Pi 3B+ หรือเวอร์ชันที่สูงกว่าเป็น OpenThread Border Router (OTBR) โดยใช้ Docker
  • วิธีสร้างเครือข่าย Thread ใน OTBR
  • วิธีเพิ่มอุปกรณ์ลงในเครือข่าย Thread ผ่านการจัดสรรนอกแบนด์
  • วิธียืนยันการเชื่อมต่อระหว่างโหนดในเครือข่าย Thread

อ่านเพิ่มเติม

ดูข้อมูลเกี่ยวกับแหล่งข้อมูล OpenThread ต่างๆ ได้ที่ openthread.io และ GitHub ซึ่งรวมถึง

เอกสารอ้างอิง