สร้างเครือข่าย Thread ด้วยกระดาน nRF52840 และ OpenThread

1. บทนำ

26b7f4f6b3ea0700.png

OpenThread ที่ Google เปิดตัวเป็นการใช้งานโปรโตคอลเครือข่าย Thread® แบบโอเพนซอร์ส Google Nest ได้เปิดตัว OpenThread เพื่อให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมให้บริการแก่นักพัฒนาซอฟต์แวร์อย่างกว้างขวางเพื่อเร่งการพัฒนาผลิตภัณฑ์สำหรับสมาร์ทโฮม

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

ใน Codelab นี้ คุณจะได้เขียนโปรแกรม OpenThread ในฮาร์ดแวร์จริง สร้างและจัดการเครือข่าย Thread รวมถึงส่งข้อความระหว่างโหนด

4806d16a8c137c6d.jpeg

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

  • การสร้างและแฟลชไบนารี OpenThread CLI ไปยังบอร์ดสำหรับนักพัฒนาซอฟต์แวร์
  • การสร้าง RCP ที่ประกอบด้วยเครื่อง Linux และบอร์ดสำหรับนักพัฒนาซอฟต์แวร์
  • การสื่อสารกับ RCP โดยใช้ OpenThread Daemon และ ot-ctl
  • การจัดการโหนด Thread ด้วยตนเองด้วย GNU Screen และ OpenThread CLI
  • การจัดสรรอุปกรณ์ลงในเครือข่าย Thread อย่างปลอดภัย
  • วิธีการทำงานของมัลติแคสต์ IPv6
  • การส่งข้อความระหว่างโหนด Thread ด้วย UDP

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

ฮาร์ดแวร์

  • บอร์ดพัฒนา nRF52840 ของ Nordic Semiconductor 3 บอร์ด
  • สาย USB เป็นไมโคร USB 3 เส้นสำหรับเชื่อมต่อบอร์ด
  • เครื่อง Linux ที่มีพอร์ต USB อย่างน้อย 3 พอร์ต

ซอฟต์แวร์:

  • GNU Toolchain
  • เครื่องมือบรรทัดคำสั่ง Nordic nRF5x
  • ซอฟต์แวร์ Segger J-Link
  • OpenThread
  • Git

2. เริ่มต้นใช้งาน

การจำลอง OpenThread

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

เทอร์มินัลพอร์ตอนุกรม

คุณควรคุ้นเคยกับวิธีเชื่อมต่อกับพอร์ตอนุกรมผ่านเทอร์มินัล Codelab นี้ใช้ GNU Screen และให้ภาพรวมการใช้งาน แต่คุณจะใช้ซอฟต์แวร์เทอร์มินัลอื่นๆ ก็ได้

เครื่อง Linux

Codelab นี้ออกแบบมาเพื่อใช้เครื่อง Linux ที่ใช้ i386 หรือ x86 เป็นโฮสต์สำหรับอุปกรณ์ Thread ที่เป็นตัวประมวลผลร่วมวิทยุ (RCP) และเพื่อแฟลชบอร์ดพัฒนา Thread ทั้งหมด เราได้ทดสอบทุกขั้นตอนใน Ubuntu 14.04.5 LTS (Trusty Tahr)

บอร์ด Nordic Semiconductor nRF52840

Codelab นี้ใช้บอร์ด nRF52840 PDK 3 บอร์ด

a6693da3ce213856.png

เราใช้ SEGGER J-Link เพื่อตั้งโปรแกรมบอร์ด nRF52840 ซึ่งมีโมดูล JTAG ในตัว ติดตั้งในเครื่อง Linux

ดาวน์โหลดแพ็กเกจที่เหมาะสมสำหรับเครื่องของคุณ แล้วติดตั้งในตำแหน่งที่ถูกต้อง ใน Linux จะเป็น /opt/SEGGER/JLink

ติดตั้งเครื่องมือบรรทัดคำสั่ง nRF5x

เครื่องมือบรรทัดคำสั่ง nRF5x ช่วยให้คุณแฟลชไบนารี OpenThread ไปยังบอร์ด nRF52840 ได้ ติดตั้งบิลด์ nRF5x-Command-Line-Tools-<OS> ที่เหมาะสมในเครื่อง Linux

วางแพ็กเกจที่แยกออกมาในโฟลเดอร์รูท ~/

ติดตั้ง ARM GNU Toolchain

ใช้ ARM GNU Toolchain สำหรับการสร้าง

เราขอแนะนำให้วางไฟล์ที่แยกออกมาไว้ใน /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ ในเครื่อง Linux ทำตามวิธีการในไฟล์ readme.txt ของที่เก็บเพื่อดูวิธีการติดตั้ง

ติดตั้งหน้าจอ (ไม่บังคับ)

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

$ sudo apt-get install screen

3. โคลนที่เก็บ

OpenThread

โคลนและติดตั้ง OpenThread script/bootstrap คำสั่งจะตรวจสอบว่าได้ติดตั้งเครื่องมือและกำหนดค่าสภาพแวดล้อมอย่างถูกต้อง

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

สร้าง OpenThread Daemon:

$ script/cmake-build posix -DOT_DAEMON=ON

ตอนนี้คุณก็พร้อมที่จะสร้างและแฟลช OpenThread ไปยังบอร์ด nRF52840 แล้ว

4. ตั้งค่า RCP Joiner

สร้างและแฟลช

สร้างตัวอย่าง OpenThread nRF52840 ด้วยฟังก์ชันการทำงานของ Joiner และ USB ดั้งเดิม อุปกรณ์จะใช้บทบาท Joiner เพื่อรับการตรวจสอบสิทธิ์อย่างปลอดภัยและได้รับการจัดสรรในเครือข่าย Thread USB ดั้งเดิมช่วยให้ใช้ USB CDC ACM เป็นการรับส่งแบบอนุกรมระหว่าง nRF52840 กับโฮสต์ได้

ให้ล้างข้อมูลที่สร้างก่อนหน้าในที่เก็บก่อนเสมอโดยเรียกใช้ rm -rf build

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

ไปที่ไดเรกทอรีที่มีไบนารี RCP ของ OpenThread แล้วแปลงเป็นรูปแบบเลขฐานสิบหกโดยทำดังนี้

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

ต่อสาย USB เข้ากับพอร์ตแก้ไขข้อบกพร่องแบบไมโคร USB ข้างหมุดจ่ายไฟภายนอกบนบอร์ด nRF52840 แล้วเสียบเข้ากับเครื่อง Linux ตั้งค่าสวิตช์แหล่งจ่ายไฟ nRF บนบอร์ด nRF52840 เป็น VDD เมื่อเชื่อมต่ออย่างถูกต้องแล้ว LED5 จะติด

20a3b4b480356447.png

หากนี่คือบอร์ดแรกที่ต่อกับเครื่อง Linux บอร์ดจะปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM0 (บอร์ด nRF52840 ทั้งหมดใช้ ttyACM เป็นตัวระบุพอร์ตอนุกรม)

$ ls /dev/ttyACM*
/dev/ttyACM0

จดหมายเลขซีเรียลของบอร์ด nRF52840 ที่ใช้สำหรับ RCP

c00d519ebec7e5f0.jpeg

ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง nRFx แล้วแฟลชไฟล์ Hex ของ OpenThread RCP ลงในบอร์ด nRF52840 โดยใช้หมายเลขซีเรียลของบอร์ด โปรดทราบว่าหากไม่ใส่--verify คุณจะเห็นข้อความเตือนที่แจ้งว่ากระบวนการแฟลชอาจล้มเหลวโดยไม่มีข้อผิดพลาด

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

ระบบจะสร้างเอาต์พุตต่อไปนี้เมื่อดำเนินการสำเร็จ

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

ติดป้ายกำกับบอร์ดว่า "RCP" เพื่อไม่ให้สับสนเกี่ยวกับบทบาทของบอร์ดในภายหลัง

เชื่อมต่อกับ USB ดั้งเดิม

เนื่องจากการสร้าง OpenThread RCP ช่วยให้ใช้ USB CDC ACM ดั้งเดิมเป็นการรับส่งแบบอนุกรมได้ คุณจึงต้องใช้พอร์ต nRF USB บนบอร์ด nRF52840 เพื่อสื่อสารกับโฮสต์ RCP (เครื่อง Linux)

ถอดปลายไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่แฟลช แล้วเสียบกลับเข้าไปที่พอร์ต nRF USB แบบไมโคร USB ข้างปุ่ม RESET ตั้งค่าสวิตช์แหล่งจ่ายไฟ nRF เป็น USB

46e7b670d2464842.png

เริ่ม OpenThread Daemon

ในการออกแบบ RCP ให้ใช้ OpenThread Daemon เพื่อสื่อสารและจัดการอุปกรณ์ Thread เริ่ม ot-daemon ด้วย-vแฟล็ก verbose เพื่อให้คุณเห็นเอาต์พุตของบันทึกและยืนยันว่ากำลังทำงานอยู่

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'

เมื่อสำเร็จ ot-daemon ในโหมดละเอียดจะสร้างเอาต์พุตที่คล้ายกับต่อไปนี้

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

เปิดหน้าต่างเทอร์มินัลนี้ไว้เพื่อให้ดูบันทึกจาก ot-daemon ได้

ใช้ ot-ctl เพื่อสื่อสารกับโหนด RCP ot-ctl ใช้ CLI เดียวกันกับแอป OpenThread CLI คุณจึงควบคุมโหนด ot-daemon ได้ในลักษณะเดียวกับอุปกรณ์ Thread อื่นๆ ที่จำลอง

ในหน้าต่างเทอร์มินัลที่ 2 ให้เริ่ม ot-ctl:

$ sudo ./build/posix/src/posix/ot-ctl
>

ตรวจสอบ state ของโหนด 2 (โหนด RCP) ที่คุณเริ่มต้นด้วย ot-daemon

> state
disabled
Done

5. ตั้งค่า FTD

ส่วนโหนด Thread อีก 2 รายการที่ใช้ใน Codelab นี้คืออุปกรณ์ Thread แบบเต็ม (FTD) ในการออกแบบ System-on-Chip (SoC) มาตรฐาน อุปกรณ์เครื่องหนึ่งจะทำหน้าที่เป็นผู้ดูแลระบบเพื่อตรวจสอบสิทธิ์และจัดสรรอุปกรณ์ลงในเครือข่ายนั้นอย่างปลอดภัย อุปกรณ์อีกเครื่องจะทำหน้าที่เป็นอุปกรณ์ที่เข้าร่วม ซึ่งผู้ดูแลระบบสามารถตรวจสอบสิทธิ์เพื่อเข้าสู่เครือข่าย Thread ได้

สร้างและแฟลช

สร้างตัวอย่าง FTD ของ OpenThread สำหรับแพลตฟอร์ม nRF52840 โดยเปิดใช้บทบาทของ Commissioner และ Joiner ดังนี้

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

ไปที่ไดเรกทอรีที่มีไบนารี CLI ของอุปกรณ์ OpenThread Full Thread Device (FTD) แล้วแปลงเป็นรูปแบบเลขฐานสิบหก

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

ต่อสาย USB เข้ากับพอร์ต Micro-USB ข้างหมุดจ่ายไฟภายนอกบนบอร์ด nRF52840 แล้วเสียบเข้ากับเครื่อง Linux หาก RCP ยังคงเชื่อมต่อกับเครื่อง Linux บอร์ดใหม่นี้ควรปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM1 (บอร์ด nRF52840 ทั้งหมดใช้ ttyACM สำหรับตัวระบุพอร์ตอนุกรม)

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

เช่นเดียวกับก่อนหน้านี้ ให้จดหมายเลขซีเรียลของบอร์ด nRF52840 ที่ใช้สำหรับ FTD

c00d519ebec7e5f0.jpeg

ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง nRFx แล้วแฟลชไฟล์ hex ของ OpenThread CLI FTD ลงในบอร์ด nRF52840 โดยใช้หมายเลขซีเรียลของบอร์ด

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

ติดป้ายกำกับบอร์ดว่า "กรรมาธิการ"

เชื่อมต่อกับ USB ดั้งเดิม

เนื่องจากบิลด์ FTD ของ OpenThread ช่วยให้ใช้ USB CDC ACM ดั้งเดิมเป็นการรับส่งแบบอนุกรมได้ คุณจึงต้องใช้พอร์ต nRF USB ในบอร์ด nRF52840 เพื่อสื่อสารกับโฮสต์ RCP (เครื่อง Linux)

ถอดปลายไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่แฟลช แล้วเสียบกลับเข้าไปที่พอร์ต nRF USB แบบไมโคร USB ข้างปุ่ม RESET ตั้งค่าสวิตช์แหล่งจ่ายไฟ nRF เป็น USB

46e7b670d2464842.png

ยืนยันบิลด์

ยืนยันว่าการสร้างสำเร็จโดยเข้าถึง OpenThread CLI โดยใช้ GNU Screen จากหน้าต่างเทอร์มินัล

$ screen /dev/ttyACM1

ในหน้าต่างใหม่ ให้กด Return บนแป้นพิมพ์ 2-3 ครั้งเพื่อแสดงพรอมต์ OpenThread CLI > เปิดอินเทอร์เฟซ IPv6 และตรวจสอบที่อยู่

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

ใช้ Ctrl+a →

d เพื่อยกเลิกการเชื่อมต่อจากหน้าจอ FTD Commissioner CLI และกลับไปที่เทอร์มินัล Linux เพื่อให้สามารถแฟลชบอร์ดถัดไปได้ หากต้องการเข้าสู่ CLI อีกครั้งเมื่อใดก็ได้ ให้ใช้ screen -r จากบรรทัดคำสั่ง หากต้องการดูรายการหน้าจอที่พร้อมใช้งาน ให้ใช้ screen -ls ดังนี้

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

ตั้งค่า FTD Joiner

ทำกระบวนการข้างต้นซ้ำเพื่อแฟลชบอร์ด nRF52840 ที่ 3 โดยใช้ot-cli-ftd.hexบิลด์ที่มีอยู่ เมื่อเสร็จแล้ว ให้เชื่อมต่อบอร์ดกับ PC อีกครั้งโดยใช้พอร์ต USB ของ nRF และตั้งสวิตช์แหล่งจ่ายไฟ nRF เป็น VDD

หากเชื่อมต่อโหนดอีก 2 โหนดกับเครื่อง Linux เมื่อเชื่อมต่อบอร์ดที่ 3 แล้ว โหนดควรปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM2 ดังนี้

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

ติดป้ายกำกับบอร์ดว่า "ผู้เข้าร่วม"

เมื่อยืนยันโดยใช้ Screen แทนที่จะสร้างอินสแตนซ์ใหม่ของ Screen จากบรรทัดคำสั่ง ให้เชื่อมต่อกับอินสแตนซ์ที่มีอยู่ใหม่และสร้างหน้าต่างใหม่ภายใน (ที่คุณใช้สำหรับกรรมาธิการ FTD)

$ screen -r

สร้างหน้าต่างใหม่ภายใน Screen ด้วย Ctrl+a → c

พรอมต์บรรทัดคำสั่งใหม่จะปรากฏขึ้น เข้าถึง CLI ของ OpenThread สำหรับ FTD Joiner โดยทำดังนี้

$ screen /dev/ttyACM2

ในหน้าต่างใหม่นี้ ให้กด Return บนแป้นพิมพ์ 2-3 ครั้งเพื่อแสดงพรอมต์ OpenThread CLI > เปิดอินเทอร์เฟซ IPv6 และตรวจสอบที่อยู่

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

ตอนนี้ FTD Joiner CLI อยู่ในอินสแตนซ์เดียวกันของ Screen กับ FTD Commissioner แล้ว คุณจึงสลับไปมาระหว่างอินสแตนซ์ทั้ง 2 ได้โดยใช้ Ctrl+a → n

ใช้ Ctrl+a →

d ได้ทุกเมื่อเพื่อออกจากหน้าจอ

6. การตั้งค่าหน้าต่างเทอร์มินัล

นับจากนี้ไป คุณจะต้องสลับอุปกรณ์ Thread บ่อยๆ ดังนั้นโปรดตรวจสอบว่าอุปกรณ์ทั้งหมดเปิดอยู่และเข้าถึงได้ง่าย ที่ผ่านมา เราใช้ Screen เพื่อเข้าถึง FTD ทั้ง 2 รายการ และเครื่องมือนี้ยังอนุญาตให้แยกหน้าจอในหน้าต่างเทอร์มินัลเดียวกันได้ด้วย ใช้เพื่อดูว่าโหนดหนึ่งตอบสนองต่อคำสั่งที่ออกในอีกโหนดหนึ่งอย่างไร

คุณควรมีหน้าต่าง 4 หน้าต่างที่พร้อมใช้งาน ดังนี้

  1. บริการ / บันทึก ot-daemon
  2. RCP Joiner ผ่าน ot-ctl
  3. FTD Commissioner ผ่าน OpenThread CLI
  4. FTD Joiner ผ่าน OpenThread CLI

หากต้องการใช้การกำหนดค่าหรือเครื่องมือพอร์ตเทอร์มินัล / พอร์ตอนุกรมของคุณเอง โปรดข้ามไปยังขั้นตอนถัดไป กำหนดค่าหน้าต่างเทอร์มินัลสำหรับอุปกรณ์ทั้งหมดในแบบที่เหมาะกับคุณที่สุด

การใช้หน้าจอ

เพื่อความสะดวกในการใช้งาน ให้เริ่มเซสชันหน้าจอเพียงเซสชันเดียว คุณควรมีอยู่แล้วตั้งแต่ตอนตั้งค่า FTD ทั้ง 2 เครื่อง

คำสั่งทั้งหมดภายใน Screen จะขึ้นต้นด้วย Ctrl+a

คำสั่งพื้นฐานของหน้าจอ

แนบเซสชัน Screen อีกครั้ง (จากบรรทัดคำสั่ง)

screen -r

ออกจากเซสชัน Screen

Ctrl+a → d

สร้างหน้าต่างใหม่ภายในเซสชันหน้าจอ

Ctrl+a → c

สลับระหว่างหน้าต่างในเซสชัน Screen เดียวกัน

Ctrl+a → n (ไปข้างหน้า)Ctrl+a → p (ย้อนกลับ)

ปิดหน้าต่างปัจจุบันในเซสชัน Screen

Ctrl+a → k

แยกหน้าจอ

ด้วย Screen คุณสามารถแบ่งเทอร์มินัลออกเป็นหลายหน้าต่างได้โดยทำดังนี้

f1cbf1258cf0a5a.png

คำสั่งใน screen จะเข้าถึงได้โดยใช้ Ctrl+a ทุกคำสั่งควรเริ่มต้นด้วยชุดค่าผสมของคีย์การเข้าถึงนี้

หากทำตาม Codelab อย่างถูกต้อง คุณควรมี 2 หน้าต่าง (FTD Commissioner, FTD Joiner) ในอินสแตนซ์หน้าจอเดียวกัน หากต้องการแยกหน้าจอระหว่าง 2 หน้าต่าง ให้เข้าสู่เซสชัน Screen ที่มีอยู่ก่อน โดยทำดังนี้

$ screen -r

คุณควรใช้อุปกรณ์ FTD อย่างใดอย่างหนึ่ง ทำตามขั้นตอนต่อไปนี้ใน Screen

  1. Ctrl+a → S เพื่อแยกหน้าต่างในแนวนอน
  2. Ctrl+a → Tab เพื่อย้ายเคอร์เซอร์ไปยังหน้าต่างว่างใหม่
  3. Ctrl+a → n เพื่อเปลี่ยนหน้าต่างใหม่นั้นเป็นหน้าต่างถัดไป
  4. หากเป็นอุปกรณ์ FTD เดียวกันกับหน้าต่างด้านบน ให้กด Ctrl+a → n อีกครั้งเพื่อดูอุปกรณ์ FTD อื่น

ตอนนี้ทั้ง 2 รายการปรากฏให้เห็นแล้ว สลับระหว่างหน้าต่างโดยใช้ Ctrl+a → Tab เราขอแนะนำให้คุณเปลี่ยนชื่อแต่ละหน้าต่างด้วย Ctrl+a → A เพื่อไม่ให้เกิดความสับสน

การใช้งานขั้นสูง

หากต้องการแบ่งหน้าจอออกเป็น 4 ส่วนและดูot-daemonบันทึกและ RCP Joiner ot-ctl ต่อไป คุณต้องเริ่มบริการเหล่านั้นภายในอินสแตนซ์หน้าจอเดียวกันนี้ โดยให้หยุด ot-daemon และออก ot-ctl แล้วรีสตาร์ทภายในหน้าต่าง Screen ใหม่ (Ctrl+a → c)

การตั้งค่านี้ไม่จำเป็นและผู้ใช้สามารถเลือกทำหรือไม่ก็ได้

แยกและไปยังส่วนต่างๆ ระหว่างหน้าต่างด้วยคำสั่งต่อไปนี้

สร้างหน้าต่างใหม่

Ctrl+a → c

แยกหน้าต่างในแนวตั้ง

Ctrl+a →

แยกหน้าต่างในแนวนอน

Ctrl+a → S

ข้ามไปยังหน้าต่างถัดไปที่แสดง

Ctrl+a → Tab

สลับหน้าต่างที่แสดงไปข้างหน้าหรือข้างหลัง

Ctrl+a → n หรือ p

เปลี่ยนชื่อหน้าต่างปัจจุบัน

Ctrl+a → A

ออกจาก Screen ได้ทุกเมื่อด้วย Ctrl+a → d และเชื่อมต่ออีกครั้งด้วย screen -r จากบรรทัดคำสั่ง

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Screen ได้ที่ข้อมูลอ้างอิงด่วนของ GNU Screen

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

ตอนนี้คุณได้กำหนดค่าหน้าต่างเทอร์มินัลและหน้าจอทั้งหมดแล้ว มาสร้างเครือข่าย Thread กัน ใน FTD Commissioner ให้สร้างชุดข้อมูลการดำเนินงานใหม่และยืนยันให้เป็นชุดข้อมูลที่ใช้งานอยู่ ชุดข้อมูลการทำงานคือการกำหนดค่าสำหรับเครือข่าย Thread ที่คุณสร้าง

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

จดบันทึกคีย์เครือข่าย 1234c0de7ab51234c0de7ab51234c0de ซึ่งจะใช้ในภายหลัง

คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่

> dataset commit active
Done

เปิดอินเทอร์เฟซ IPv6

> ifconfig up
Done

เริ่มการดำเนินการโปรโตคอล Thread

> thread start
Done

รอสักครู่แล้วตรวจสอบสถานะอุปกรณ์ ควรเป็นผู้นำ และรับ RLOC16 เพื่อใช้อ้างอิงในอนาคต

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

ตรวจสอบที่อยู่ IPv6 ของอุปกรณ์

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

ตอนนี้เครือข่าย "codelab" จะปรากฏเมื่อสแกนจากอุปกรณ์ Thread อื่น

จาก ot-ctl ใน RCP Joiner ให้ทำดังนี้

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

จาก OpenThread CLI ใน FTD Joiner ให้ทำดังนี้

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

หากเครือข่าย "codelab" ไม่ปรากฏในรายการ ให้ลองสแกนอีกครั้ง

8. เพิ่ม RCP Joiner

การจัดสรร Thread ไม่ได้เปิดใช้งานในเครือข่าย ซึ่งหมายความว่าเราจะต้องเพิ่ม RCP Joiner ลงในเครือข่าย Thread ที่เพิ่งสร้างขึ้นโดยใช้กระบวนการจัดสรรแบบ Out-of-Band

ใน FTD Commissioner เราได้จดบันทึกคีย์เครือข่าย เช่น 1234c0de7ab51234c0de7ab51234c0de หากต้องการค้นหาคีย์เครือข่ายอีกครั้ง ให้เรียกใช้คำสั่งต่อไปนี้ใน FTD Commissioner

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

จากนั้นใน RCP Joiner ให้ตั้งค่าคีย์เครือข่ายชุดข้อมูลที่ใช้งานอยู่เป็นคีย์เครือข่ายของ FTD Commissioner ดังนี้

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

ตรวจสอบชุดข้อมูลเพื่อให้แน่ใจว่าได้ตั้งค่าอย่างถูกต้อง

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

เปิด Thread เพื่อให้ RCP Joiner เข้าร่วมเครือข่าย "codelab" รอสักครู่ จากนั้นตรวจสอบสถานะ, RLOC16 และที่อยู่ IPv6 ดังนี้

## RCP Joiner ##
----------------

> ifconfig up
Done
> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

จดที่อยู่ IPv6 ในเครือข่าย (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f ที่นี่) คุณจะได้ใช้ในภายหลัง

กลับไปที่ FTD Commissioner ให้ตรวจสอบตารางเราเตอร์และตารางย่อยเพื่อยืนยันว่าอุปกรณ์ทั้ง 2 เครื่องอยู่ในเครือข่ายเดียวกัน ใช้ RLOC16 เพื่อระบุ RCP Joiner

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

Ping ที่อยู่ Mesh-Local ของ RCP Joiner (ที่อยู่ Mesh-Local ที่ได้จากเอาต์พุต ipaddr ของ RCP Joiner) เพื่อยืนยันการเชื่อมต่อ

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

ตอนนี้เรามีเครือข่าย Thread ที่ประกอบด้วย 2 โหนด ซึ่งแสดงในแผนภาพโทโพโลยีนี้

otcodelab_top01C_2nodes.png

ไดอะแกรมโทโพโลยี

ขณะที่คุณทำตาม Codelab ส่วนที่เหลือ เราจะแสดงแผนภาพโทโพโลยี Thread ใหม่ทุกครั้งที่สถานะของเครือข่ายเปลี่ยนแปลง บทบาทของโหนดจะระบุไว้ดังนี้

b75a527be4563215.png

เราเตอร์จะเป็นรูปห้าเหลี่ยมเสมอ และอุปกรณ์ปลายทางจะเป็นวงกลมเสมอ ตัวเลขในแต่ละโหนดแสดงรหัสเราเตอร์หรือรหัสอุปกรณ์ย่อยที่แสดงในเอาต์พุต CLI โดยขึ้นอยู่กับบทบาทและสถานะปัจจุบันของแต่ละโหนดในขณะนั้น

9. มอบหมายงานให้ FTD Joiner

ตอนนี้มาเพิ่มอุปกรณ์ Thread เครื่องที่ 3 ลงในเครือข่าย "codelab" กัน ครั้งนี้เราจะใช้กระบวนการจัดสรรในแบนด์ที่ปลอดภัยยิ่งขึ้น และอนุญาตให้เฉพาะ FTD Joiner เข้าร่วมได้

ใน FTD Joiner ให้รับ eui64 เพื่อให้ FTD Commissioner ระบุได้

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

ใน FTD Commissioner ให้เริ่ม Commissioner และระบุ eui64 ของอุปกรณ์ที่เข้าร่วมได้ พร้อมกับข้อมูลเข้าสู่ระบบสำหรับผู้เข้าร่วม เช่น J01NME ข้อมูลเข้าสู่ระบบสำหรับเข้าร่วมคือสตริงเฉพาะอุปกรณ์ของอักขระที่เป็นตัวอักษรและตัวเลขคละกันทั้งหมดที่เป็นตัวพิมพ์ใหญ่ (0-9 และ A-Y โดยไม่รวม I, O, Q และ Z เพื่อให้อ่านง่าย) โดยมีความยาวระหว่าง 6 ถึง 32 อักขระ

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

เปลี่ยนไปใช้ FTD Joiner เริ่มบทบาทผู้เข้าร่วมด้วยข้อมูลเข้าสู่ระบบผู้เข้าร่วมที่คุณเพิ่งตั้งค่าใน FTD Commissioner

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

ภายใน 1 นาที คุณจะได้รับการยืนยันว่าการตรวจสอบสิทธิ์สำเร็จ

## FTD Joiner ##
----------------

>
Join success

เรียกใช้ Thread เพื่อให้ FTD Joiner เข้าร่วมเครือข่าย "codelab" แล้วตรวจสอบสถานะและ RLOC16 ทันที

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

ตรวจสอบที่อยู่ IPv6 ของอุปกรณ์ โปรดสังเกตว่าไม่มี ALOC เนื่องจากอุปกรณ์นี้ไม่ใช่ผู้นำและไม่ได้มีบทบาทเฉพาะ Anycast ที่ต้องใช้ ALOC

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

เปลี่ยนไปใช้ FTD Commissioner ทันที แล้วตรวจสอบตารางเราเตอร์และตารางอุปกรณ์ย่อยเพื่อยืนยันว่ามีอุปกรณ์ 3 เครื่องอยู่ในเครือข่าย "codelab"

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

จาก RLOC16 อุปกรณ์ที่เข้าร่วม FTD ได้เชื่อมต่อกับเครือข่ายเป็นอุปกรณ์ปลายทาง (อุปกรณ์ย่อย) โทโพโลยีที่อัปเดตแล้วมีดังนี้

otcodelab_top01C_ed01.png

10. การใช้งานชุดข้อความ

อุปกรณ์ Thread ใน Codelab นี้เป็นอุปกรณ์ Thread แบบเต็ม (FTD) ประเภทหนึ่งที่เรียกว่าอุปกรณ์ปลายทางที่มีสิทธิ์เป็นเราเตอร์ (REED) ซึ่งหมายความว่าอุปกรณ์เหล่านี้สามารถทำหน้าที่เป็นทั้งเราเตอร์หรืออุปกรณ์ปลายทาง และสามารถเลื่อนระดับจากอุปกรณ์ปลายทางเป็นเราเตอร์ได้

Thread รองรับเราเตอร์ได้สูงสุด 32 ตัว แต่พยายามให้มีเราเตอร์อยู่ระหว่าง 16 ถึง 23 ตัว หาก REED เชื่อมต่อเป็นอุปกรณ์ปลายทาง (อุปกรณ์ย่อย) และมีเราเตอร์น้อยกว่า 16 ตัว หลังจากผ่านระยะเวลาแบบสุ่มภายใน 2 นาที อุปกรณ์จะเลื่อนระดับตัวเองเป็นเราเตอร์โดยอัตโนมัติ

หากคุณมีบุตรหลาน 2 คนในเครือข่าย Thread หลังจากเพิ่ม FTD Joiner แล้ว ให้รออย่างน้อย 2 นาที แล้วตรวจสอบตารางเราเตอร์และตารางของบุตรหลานอีกครั้งใน FTD Commissioner โดยทำดังนี้

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

FTD Joiner (Extended MAC = e6cdd2d93249a243) ได้เลื่อนระดับตัวเองเป็นเราเตอร์ โปรดทราบว่า RLOC16 จะแตกต่างกัน (b800 แทนที่จะเป็น 0c02) เนื่องจาก RLOC16 อิงตามรหัสเราเตอร์และรหัสอุปกรณ์ย่อย เมื่อเปลี่ยนจากอุปกรณ์ปลายทางเป็นเราเตอร์ ค่ารหัสเราเตอร์และรหัสอุปกรณ์ย่อยจะเปลี่ยนไป เช่นเดียวกับ RLOC16

otcodelab_top01C.png

ยืนยันสถานะใหม่และ RLOC16 ใน FTD Joiner ดังนี้

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

ดาวน์เกรด FTD Joiner

คุณสามารถทดสอบลักษณะการทำงานนี้ได้โดยการดาวน์เกรด FTD Joiner จากเราเตอร์กลับไปเป็นอุปกรณ์ปลายทางด้วยตนเอง เปลี่ยนสถานะเป็น "เด็ก" แล้วตรวจสอบ RLOC16 ดังนี้

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

กลับไปที่ FTD Commissioner ตอนนี้ FTD Joiner ควรปรากฏในตารางย่อย (ID = 3) โดยอาจมีทั้ง 2 อย่างในระหว่างการเปลี่ยนผ่าน

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

หลังจากผ่านไปสักระยะหนึ่ง ระบบจะเปลี่ยนกลับไปใช้เราเตอร์ที่มี RLOC เป็น b800

otcodelab_top01C.png

นำผู้นำออก

โดยผู้นำจะได้รับการเลือกเองจากเราเตอร์ Thread ทั้งหมด ซึ่งหมายความว่าหากมีการนำผู้นำปัจจุบันออกจากเครือข่ายเทรด เราเตอร์ตัวอื่นจะกลายเป็นผู้นำใหม่

ใน FTD Commissioner ให้ปิด Thread เพื่อนำออกจากเครือข่าย Thread โดยทำดังนี้

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

ภายใน 2 นาที FTD Joiner จะกลายเป็นผู้นำ Thread คนใหม่ ตรวจสอบสถานะและที่อยู่ IPv6 ของ FTD Joiner เพื่อยืนยันสิ่งต่อไปนี้

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

ตรวจสอบตารางย่อย โปรดทราบว่ามี RLOC16 ใหม่ นี่คือ RCP Joiner ตามที่ระบุโดยรหัสและ MAC แบบขยาย เพื่อให้เครือข่าย Thread ทำงานร่วมกันได้ จึงได้เปลี่ยนเราเตอร์หลักจาก FTD Commissioner เป็น FTD Joiner ซึ่งจะส่งผลให้มี RLOC16 ใหม่สำหรับ RCP Joiner (เนื่องจาก Router ID เปลี่ยนจาก 3 เป็น 46)

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

คุณอาจต้องรอสักครู่เพื่อให้ RCP Joiner แนบกับ FTD Joiner เป็นอุปกรณ์ย่อย ตรวจสอบรัฐและ RLOC16 เพื่อยืนยันว่า

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

แนบ FTD Commissioner อีกครั้ง

เครือข่าย Thread ที่มี 2 โหนดนั้นไม่สนุกเท่าไหร่ มาทำให้กรรมาธิการ FTD กลับมาออนไลน์กัน

ใน FTD Commissioner ให้รีสตาร์ท Thread โดยทำดังนี้

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

ภายใน 2 นาที อุปกรณ์จะเชื่อมต่อกับเครือข่าย "codelab" อีกครั้งโดยอัตโนมัติในฐานะอุปกรณ์ปลายทาง จากนั้นจะเลื่อนระดับตัวเองเป็นเราเตอร์

## FTD Commissioner ##
----------------------

> state
router
Done

ตรวจสอบตารางเราเตอร์และตารางย่อยใน FTD Joiner เพื่อยืนยันสิ่งต่อไปนี้

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

เครือข่าย Thread ของเราประกอบด้วย 3 โหนดอีกครั้ง

11. การแก้ปัญหา

การจัดการเครือข่าย Thread ที่มีอุปกรณ์หลายเครื่องในหน้าต่างเทอร์มินัลหรือหน้าต่างหน้าจอต่างๆ อาจซับซ้อน ใช้เคล็ดลับเหล่านี้เพื่อ "รีเซ็ต" สถานะของเครือข่ายหรือพื้นที่ทำงานหากพบปัญหา

หน้าจอ

หากคุณเคยหลงทางในการกำหนดค่า (หน้าต่าง Screen มากเกินไป หรือ Screen ภายใน Screen) ให้ปิดหน้าต่าง Screen ด้วย Ctrl+a → k จนกว่าจะไม่มีหน้าต่าง Screen และ screen -ls ในบรรทัดคำสั่งจะแสดง No Sockets found จากนั้นสร้างหน้าต่างหน้าจอใหม่สำหรับแต่ละอุปกรณ์ ระบบจะเก็บสถานะอุปกรณ์ไว้แม้ว่าจะปิดหน้าจอแล้วก็ตาม

โหนด Thread

หากโทโพโลยีเครือข่าย Thread ไม่เป็นไปตามที่อธิบายไว้ใน Codelab นี้ หรือโหนดตัดการเชื่อมต่อด้วยเหตุผลบางอย่าง (อาจเป็นเพราะเครื่อง Linux ที่ขับเคลื่อนโหนดเข้าสู่โหมดสลีป) คุณควรปิด Thread ล้างข้อมูลเข้าสู่ระบบเครือข่าย และเริ่มอีกครั้งจากขั้นตอนสร้างเครือข่าย Thread

วิธีรีเซ็ต FTD

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

คุณรีเซ็ต RCP ได้ในลักษณะเดียวกันผ่าน ot-ctl ดังนี้

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. การใช้มัลติแคสต์

Multicast ใช้เพื่อสื่อสารข้อมูลไปยังกลุ่มอุปกรณ์พร้อมกัน ในเครือข่าย Thread จะมีการสงวนที่อยู่เฉพาะสำหรับการใช้งานมัลติแคสต์กับกลุ่มอุปกรณ์ต่างๆ โดยขึ้นอยู่กับขอบเขต

ที่อยู่ IPv6

ขอบเขต

จัดส่งแล้วที่

ff02::1

ลิงก์เฉพาะ

FTD และ MED ทั้งหมด

ff02::2

ลิงก์เฉพาะ

FTD และ Border Router ทั้งหมด

ff03::1

Mesh-Local

FTD และ MED ทั้งหมด

ff03::2

Mesh-Local

FTD และ Border Router ทั้งหมด

เนื่องจากเราไม่ได้ใช้ Border Router ใน Codelab นี้ เรามาดูที่อยู่แบบมัลติคาสต์ FTD และ MED 2 รายการกัน

ขอบเขต Link-Local ประกอบด้วยอินเทอร์เฟซ Thread ทั้งหมดที่เข้าถึงได้ด้วยการส่งสัญญาณวิทยุครั้งเดียวหรือ "ฮอป" เดียว โทโพโลยีเครือข่ายจะกำหนดว่าอุปกรณ์ใดตอบสนองต่อ Ping ไปยังff02::1ที่อยู่มัลติแคสต์

Ping ff02::1 จากกรรมาธิการ FTD:

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

มีอุปกรณ์อื่นๆ อีก 2 เครื่องในเครือข่าย (FTD Joiner และ RCP Joiner) แต่ FTD Commissioner ได้รับการตอบกลับเพียง 1 รายการจากที่อยู่ Link-Local (LLA) ของ FTD Joiner ซึ่งหมายความว่า FTD Joiner เป็นอุปกรณ์เดียวที่ FTD Commissioner สามารถเข้าถึงได้ด้วยการข้ามเพียงครั้งเดียว

otcodelab_top02C_02_LL.png

ตอนนี้ให้ ping ff02::1 จาก FTD Joiner ดังนี้

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

2 คำตอบ เมื่อตรวจสอบที่อยู่ IPv6 สำหรับอุปกรณ์อื่นๆ เราจะเห็นว่าที่อยู่แรก (ลงท้ายด้วย 4b1d) คือ LLA ของ FTD Commissioner และที่อยู่สอง (ลงท้ายด้วย 943b) คือ LLA ของ RCP Joiner

otcodelab_top02C_02_LL02.png

ซึ่งหมายความว่า FTD Joiner เชื่อมต่อกับทั้ง FTD Commissioner และ RCP Joiner โดยตรง ซึ่งเป็นการยืนยันโทโพโลยีของเรา

Mesh-Local

ขอบเขต Mesh-Local ประกอบด้วยอินเทอร์เฟซ Thread ทั้งหมดที่เข้าถึงได้ภายในเครือข่าย Thread เดียวกัน มาดูการตอบกลับการ Ping ไปยังff03::1ที่อยู่แบบมัลติแคสต์กัน

Ping ff03::1 จากกรรมาธิการ FTD:

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

คราวนี้กรรมาธิการ FTD ได้รับการตอบกลับ 2 รายการ รายการหนึ่งมาจากตัวระบุเส้นทางการเข้าร่วม FTD (RLOC ซึ่งลงท้ายด้วย b800) และอีกรายการมาจาก EID ในเครื่องของ Mesh ของผู้เข้าร่วม RCP (ML-EID ซึ่งลงท้ายด้วย d55f) เนื่องจากขอบเขตในเครื่องของ Mesh ประกอบด้วยเครือข่าย Thread ทั้งหมด ไม่ว่าอุปกรณ์จะอยู่ที่ใดในเครือข่าย อุปกรณ์จะได้รับการสมัครใช้ที่อยู่ ff03::1

otcodelab_top02C_02_ML.png

Ping ff03::1 จาก FTD Joiner เพื่อยืนยันลักษณะการทำงานเดียวกัน

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

สังเกตเวลาตอบสนองสำหรับ RCP Joiner ในเอาต์พุต ping ทั้ง 2 รายการ RCP Joiner ใช้เวลานานกว่ามากในการเข้าถึง FTD Commissioner (68 มิลลิวินาที) เมื่อเทียบกับการเข้าถึง FTD Joiner (23 มิลลิวินาที) เนื่องจากต้องมีการส่งต่อ 2 ครั้งเพื่อไปถึงผู้ว่าการ FTD เทียบกับการส่งต่อ 1 ครั้งสำหรับ FTD Joiner

คุณอาจสังเกตเห็นด้วยว่า Ping แบบ Multicast ใน Mesh ตอบกลับด้วย RLOC สำหรับ FTD 2 รายการเท่านั้น ไม่ใช่ RCP Joiner เนื่องจาก FTD เป็นเราเตอร์ภายในเครือข่าย ส่วน RCP เป็นอุปกรณ์ปลายทาง

ตรวจสอบสถานะของผู้เข้าร่วม RCP เพื่อยืนยันสิ่งต่อไปนี้

## RCP Joiner ##
----------------

> state
child

13. ส่งข้อความด้วย UDP

บริการแอปพลิเคชันอย่างหนึ่งที่ OpenThread มีให้คือ User Datagram Protocol (UDP) ซึ่งเป็นโปรโตคอลชั้นการรับส่งข้อมูล แอปพลิเคชันที่สร้างขึ้นบน OpenThread สามารถใช้ UDP API เพื่อส่งข้อความระหว่างโหนดในเครือข่าย Thread หรือไปยังอุปกรณ์อื่นๆ ในเครือข่ายภายนอก (เช่น อินเทอร์เน็ต หากเครือข่าย Thread มี Border Router)

ซ็อกเก็ต UDP จะแสดงผ่าน CLI ของ OpenThread มาใช้เพื่อส่งข้อความระหว่าง FTD ทั้ง 2 เครื่องกัน

รับที่อยู่ EID ของ Mesh-Local สำหรับ FTD Joiner เราใช้ที่อยู่นี้เนื่องจากเข้าถึงได้จากทุกที่ภายในเครือข่าย Thread

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

เริ่ม UDP และเชื่อมโยงกับซ็อกเก็ตสำหรับที่อยู่ IPv6 ใดก็ได้

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

เปลี่ยนไปใช้ FTD Commissioner, เริ่ม UDP และเชื่อมต่อกับซ็อกเก็ตที่คุณตั้งค่าใน FTD Joiner โดยใช้ ML-EID ของซ็อกเก็ต

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

การเชื่อมต่อ UDP ควรใช้งานได้ระหว่าง 2 โหนด ส่งข้อความจากกรรมาธิการ FTD

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

ใน FTD Joiner ระบบได้รับข้อความ UDP แล้ว

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. ยินดีด้วย

คุณสร้างเครือข่าย Thread จริงแล้ว

b915c433e7027cc7.png

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

  • ความแตกต่างระหว่างประเภทอุปกรณ์ บทบาท และขอบเขตของ Thread
  • วิธีที่อุปกรณ์ Thread จัดการสถานะของตนเองภายในเครือข่าย
  • วิธีส่งข้อความอย่างง่ายระหว่างโหนดโดยใช้ UDP

ขั้นตอนถัดไป

ลองทำแบบฝึกหัดต่อไปนี้โดยอิงจาก Codelab นี้

  • แฟลชบอร์ด FTD Joiner เป็น MTD อีกครั้งโดยใช้ไบนารี ot-cli-mtd และสังเกตว่าบอร์ดจะไม่เคยอัปเกรดตัวเองเป็นเราเตอร์หรือพยายามเป็นผู้นำ
  • เพิ่มอุปกรณ์อื่นๆ (ลองใช้แพลตฟอร์มอื่นดู) ลงในเครือข่าย และร่างโทโพโลยีโดยใช้ตารางเราเตอร์และตารางย่อย พร้อมกับ Ping ไปยังที่อยู่แบบหลายผู้รับ
  • ใช้ pyspinel เพื่อควบคุม NCP
  • แปลง NCP เป็น Border Router โดยใช้ OpenThread Border Router และเชื่อมต่อเครือข่าย Thread กับอินเทอร์เน็ต

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

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

ข้อมูลอ้างอิง: