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

1. ข้อมูลเบื้องต้น

26b7f4f6b3ea0700.png

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

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

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

4806d16a8c137c6d.jpeg

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

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

สิ่งที่ต้องมี

ฮาร์ดแวร์:

  • บอร์ดพัฒนานักพัฒนาซอฟต์แวร์แบบเซมิคอนดักเตอร์แบบนอร์ดิก 3 เครื่อง nRF52840
  • สายเชื่อม USB กับไมโคร USB 3 เส้นเพื่อเชื่อมต่อบอร์ด
  • เครื่อง Linux ที่มีพอร์ต USB อย่างน้อย 3 พอร์ต

ซอฟต์แวร์:

  • สายเครื่องมือ GNU
  • เครื่องมือบรรทัดคําสั่ง nRF5x ของนอร์ดิก
  • ซอฟต์แวร์ Segger J-Link
  • OpenThread
  • Git

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

การจําลอง OpenThread

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

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

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

เครื่อง Linux

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

บอร์ด NRF52840 นอร์ดิกเซมิคอนดักเตอร์

Codelab นี้ใช้nnF52840 PDK Board 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 ของที่เก็บถาวรสําหรับคําแนะนําในการติดตั้ง

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

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

$ sudo apt-get install screen

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

OpenThread

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

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

สร้าง Daemon ของ OpenThread:

$ script/cmake-build posix -DOT_DAEMON=ON

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

4. ตั้งค่าตัวเชื่อม RCP

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

สร้างตัวอย่าง OpenThread nRF52840 ด้วยตัวเชื่อมและมีฟังก์ชัน USB ในตัว อุปกรณ์ใช้บทบาทผู้เข้ารวมเพื่อตรวจสอบสิทธิ์อย่างปลอดภัยและได้รับการมอบหมายให้ดูแลในเครือข่ายเทรด 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

ไปที่ไดเรกทอรีที่มีไบนารี OpenThread RCP และแปลงเป็นรูปแบบเลขฐาน 16 ดังนี้

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

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

20a3b4b480356447.png

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

$ ls /dev/ttyACM*
/dev/ttyACM0

จดบันทึกหมายเลขซีเรียลของกระดาน nRF52840 ที่ใช้สําหรับ RCP:

c00d519ebec7e5f0.jpeg

ไปที่ตําแหน่งของเครื่องมือบรรทัดคําสั่ง nRFx แล้วแฟลชไฟล์เลขฐานสิบหก 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 ในระบบ

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

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

46e7b670d2464842.png

เริ่ม OpenThread Daemon

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

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

เมื่อสําเร็จ 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

โหนดชุดข้อความอีก 2 โหนดที่ใช้ใน Codelab นี้คือ Full Thread Devices (FTD) ในการออกแบบ System-on-Chip (SoC) มาตรฐาน ในการตั้งค่าเวอร์ชัน คนหนึ่งอาจใช้ wpantund ซึ่งเป็นไดรเวอร์อินเทอร์เฟซเครือข่ายระดับการผลิตเพื่อควบคุมอินสแตนซ์ OpenThread NCP แต่ใน Codelab นี้ เราจะใช้ ot-ctl หรือ OpenThread CLI

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

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

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

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

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

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

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

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

เหมือนก่อนหน้านี้ โปรดสังเกตหมายเลขซีเรียลของบอร์ด nRF52840 ที่ใช้สําหรับ FTD

c00d519ebec7e5f0.jpeg

ไปที่ตําแหน่งของเครื่องมือบรรทัดคําสั่ง nRFx แล้วเปิดไฟล์เลขฐานสิบหกของ 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 ในระบบ

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

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

46e7b670d2464842.png

ยืนยันบิวด์

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

$ screen /dev/ttyACM1 115200

ในหน้าต่างใหม่ ให้กด 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

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

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

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

ติดป้ายกํากับกระดานว่า "ตัวเชื่อม"

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

$ screen -r

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

พรอมท์บรรทัดคําสั่งใหม่จะปรากฏขึ้น เข้าถึง OpenThread CLI สําหรับตัวเชื่อม FTD

$ screen /dev/ttyACM2 115200

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

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

ตอนนี้ FTD Joiner CLI อยู่ในหน้าจอเดียวกันกับ FTD Commissioner คุณจะสลับระหว่าง FTD โดยใช้ Ctrl+a → n ได้

ใช้ Ctrl+a →

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

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

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

ตามหลักแล้ว คุณควรจะมีหน้าต่าง 4 บานที่พร้อมใช้งาน ได้แก่

  1. บริการ / บันทึก ot-daemon
  2. ตัวเชื่อม RCP ผ่าน ot-ctl
  3. FTD Commissioner ผ่าน OpenThread CLI
  4. ตัวเชื่อม FTD ผ่าน OpenThread CLI

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

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

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

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

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

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

screen -r

ออกจากเซสชันหน้าจอ

Ctrl+a → d

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

Ctrl+a → c

สลับไปมาระหว่างหน้าต่างในเซสชันหน้าจอเดียวกัน

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

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

Ctrl+a → k

แยกหน้าจอ

หน้าจอจะแยกเทอร์มินัลออกเป็นหลายหน้าต่างได้ดังนี้

f1cbf1258cf0a5a.png

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

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

$ screen -r

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

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

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

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

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

ไม่จําเป็นต้องมีการตั้งค่านี้ และใช้แบบฝึกหัดสําหรับผู้ใช้

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

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

Ctrl+a → c

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

Ctrl+a →

แบ่งหน้าต่างในแนวนอน

Ctrl+a → S

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

Ctrl+a → Tab

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

Ctrl+a → n หรือ p

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

Ctrl+a → A

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

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับหน้าจอ ให้ดูที่ข้อมูลอ้างอิงด่วนสําหรับหน้าจอ GNU

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

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

## 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 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" จะแสดงเมื่อสแกนจากอุปกรณ์เทรดอื่นๆ

จาก ot-ctl ในตัวเชื่อม RCP

## 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

การคอมมิตเทรดไม่ทํางานในเครือข่าย ซึ่งหมายความว่าเราต้องเพิ่มตัวเชื่อม RCP ลงในเครือข่ายเทรดที่เราเพิ่งสร้างโดยใช้กระบวนการการคอมมิตนอกขอบเขต

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

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

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

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

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

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

เรียกเทรดเพื่อให้ตัวเชื่อม RCP เข้าร่วมเครือข่าย "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

จดที่อยู่ Mesh-Local IPv6 (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f ที่นี่) ซึ่งคุณจะใช้ในภายหลัง

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

## 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 (ที่อยู่ Mesh-Local ที่ได้รับจากเอาต์พุต ipaddr ของตัวเชื่อม RCP) เพื่อยืนยันการเชื่อมต่อ ดังนี้

## 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

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

otcodelab_top01C_2โหนด

แผนภาพโทโพโลยี

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

b75a527be4563215.png

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

9. ค่าคอมมิชชันพนักงานเชื่อม FTD

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

ในตัวเชื่อม FTD ให้รับ eui64 เพื่อให้ FTD Commissioner สามารถระบุได้ ดังนี้

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

> eui64
2f57d222545271f1
Done

ใน FTD 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 เริ่มต้นบทบาทผู้ผนวกด้วยข้อมูลเข้าสู่ระบบของผู้เข้าที่คุณเพิ่งตั้งค่าบน FTD Commissioner ดังนี้

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

> ifconfig up
Done
> joiner start J01NME
Done

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

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

>
Join success

เรียกชุดข้อความเพื่อให้ตัวเชื่อม FTD เข้าร่วมเครือข่าย "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 ได้เชื่อมต่อกับเครือข่ายในฐานะอุปกรณ์ปิดท้าย (Child) ต่อไปนี้เป็นโทโพโลยีที่อัปเดตแล้วของเรา

otcodelab_top01C_ed01.png

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

อุปกรณ์เทรดใน Codelab นี้เป็นอุปกรณ์เทรดเต็มรูปแบบ (FTD) ประเภทหนึ่งที่เรียกว่า End Screen สําหรับอุปกรณ์ที่ผ่านเกณฑ์ (REED) ซึ่งหมายความว่าสามารถทํางานได้เป็นเราเตอร์หรืออุปกรณ์ปลายทาง และโปรโมตตนเองจากอุปกรณ์ระดับบนไปยังเราเตอร์ได้

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

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

## 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 (MAC แบบขยาย = e6cdd2d93249a243) ได้โปรโมตตัวเองกับเราเตอร์ โปรดทราบว่า RLOC16 ต่างออกไป (b800 แทนที่จะเป็น 0c02) นั่นเป็นเพราะ RLOC16 ยึดตามรหัสเราเตอร์และรหัสรองของอุปกรณ์ เมื่ออุปกรณ์เปลี่ยนจากเราเตอร์เป็นเราเตอร์ รหัสเราเตอร์และค่ารหัสเด็กจะเปลี่ยนแปลง RLOC16 ด้วย

otcodelab_top01C.png

ยืนยันสถานะใหม่และ RLOC16 บนตัวเชื่อม FTD ดังนี้

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

> state
router
Done
> rloc16
b800
Done

ดาวน์เกรดตัวเชื่อม FTD

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

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

กลับไปที่ค่าคอมมิชชัน FTD ตัวเชื่อม FTD ควรปรากฏในตารางย่อย (รหัส = 3) ข้อมูลอาจมีลักษณะทั้งสองอย่างในขณะเปลี่ยน:

## 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

นําผู้นําออก

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

ในค่าคอมมิชชัน FTD ให้ปิด "ชุดข้อความ" เพื่อนําออกจากเครือข่ายชุดข้อความ ดังนี้

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

> thread stop
Done
> ifconfig down
Done

ภายใน 2 นาที ตัวเชื่อม FTD จะเป็นผู้นําชุดข้อความใหม่ ตรวจสอบสถานะและที่อยู่ IPv6 ของตัวเชื่อม FTD เพื่อยืนยันดังนี้

## 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 ตามที่กําหนดโดยรหัสและ MAC แบบขยาย เพื่อให้ระบบรวมเครือข่ายเทรดเข้าด้วยกัน ได้เปลี่ยนเราเตอร์หลักจากตัวเอฟคอม (FTD) ไปเป็นตัวเชื่อม FTD ซึ่งจะทําให้เกิด RLOC16 ใหม่สําหรับตัวเชื่อม RCP (เนื่องจากรหัสเราเตอร์มีการเปลี่ยนแปลงจาก 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

คุณอาจต้องรอสัก 2-3 นาทีเพื่อให้ตัวเชื่อม RCP แนบกับตัวเชื่อม FTD แบบลูก ตรวจสอบสถานะและ RLOC16 เพื่อยืนยันว่า

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

> state
child
> rloc16
b801

เชื่อมต่อ FTD Commissioner อีกครั้ง

เครือข่ายชุดข้อความที่มี 2 โหนดไม่สนุกมากนัก เชิญ FTD Commissioner กลับมาออนไลน์อีกครั้ง

ใน FTD Commissioner ให้เริ่มชุดข้อความใหม่โดยทําดังนี้

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

> ifconfig up
Done
> thread start
Done

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

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

> state
router
Done

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

## 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

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

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

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

หน้าจอ

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

โหนดชุดข้อความ

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

วิธีรีเซ็ต 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. การใช้มัลติแคสต์

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

ที่อยู่ IPv6

ขอบเขต

ส่งถึง

ff02::1

ลิงก์-ท้องถิ่น

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

ff02::2

ลิงก์-ท้องถิ่น

FTD และเราเตอร์ชายแดนทั้งหมด

ff03::1

ตาข่าย-ท้องถิ่น

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

ff03::2

ตาข่าย-ท้องถิ่น

FTD และเราเตอร์ชายแดนทั้งหมด

เนื่องจากเราไม่ได้ใช้ Border Router ใน Codelab นี้ เรามาดู FTD กับที่อยู่ MED หลายรายการกัน

ขอบเขตลิงก์ท้องถิ่นประกอบด้วยอินเทอร์เฟซเทรดทั้งหมดที่เข้าถึงได้โดยการส่งวิทยุหนึ่งครั้ง หรือ "ฮอป" เดียว โทโพโลยีเครือข่ายจะกําหนดอุปกรณ์ที่จะตอบสนองต่อคําสั่ง 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 และผู้เชื่อม RCP) แต่ผู้ออก FTD ได้รับคําตอบเพียง 1 รายการจากที่อยู่ลิงก์ในพื้นที่ของผู้ส่ง (LLA) ซึ่งหมายความว่าตัวเชื่อม FTD จะเป็นอุปกรณ์เดียวที่กรรมาธิการ FTD สามารถเข้าถึงได้ด้วยฮอพเดียว

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 และที่อยู่ที่สอง (ลงท้ายด้วย 943b) คือ LLA ของผู้เข้าร่วม RCP

otcodelab_top02C_02_LL02.png

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

ตาข่าย-ท้องถิ่น

ขอบเขต Mesh-Local ประกอบด้วยอินเทอร์เฟซเทรดทั้งหมดที่เข้าถึงได้ภายในเครือข่ายเทรดเดียวกัน มาดูการตอบกลับคําสั่ง 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 คําตอบ คําตอบหนึ่งมาจาก Routing Locator (RLOC) ของ FTD Joiner (RLOC, ลงท้ายด้วย b800) และข้อ 1 จาก RCP Joiner's Mesh-Local EID (ML-EID ที่ลงท้ายด้วย d55f) เนื่องจากขอบเขต Mesh-local ประกอบด้วยเครือข่ายเทรดทั้งหมด ไม่ว่าอุปกรณ์จะอยู่ในเครือข่ายใด อุปกรณ์จะสมัครรับข้อมูลจากที่อยู่ ff03::1

otcodelab_top02C_02_ML.png

ใช้คําสั่ง ping ff03::1 จากตัวเชื่อม FTD เพื่อยืนยันลักษณะการทํางานเดียวกัน ดังนี้

## 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 ในเอาต์พุต ping ทั้ง 2 เอาต์พุต ตัวเชื่อม RCP ใช้เวลานานกว่ามากถึงตัว FTD Commissioner (68 มิลลิวินาที) เมื่อเทียบกับตัวเชื่อม FTD (23 มิลลิวินาที) นั่นเป็นเพราะว่าต้องเดินทาง 2 ครั้งเพื่อเดินทางไปยังกรรมาธิการ FTD เมื่อเทียบกับ 1 ฮ็อปสําหรับผู้เข้าร่วม FTD

คุณอาจสังเกตเห็นว่า ping แบบมัลติแคสต์ของ Mesh-Local ตอบกลับด้วย RLOC เฉพาะสําหรับ FTD 2 รายการเท่านั้น ไม่ใช่ตัวเชื่อม RCP เนื่องจาก FTD เป็นเราเตอร์ภายในเครือข่าย ส่วน RCP คืออุปกรณ์ปลายทาง

ตรวจสอบสถานะของตัวเชื่อม RCP เพื่อยืนยัน

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

> state
child

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

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

ซ็อกเก็ต UDP ถูกเปิดเผยผ่าน OpenThread CLI ใช้เพื่อส่งข้อความระหว่าง FTD ทั้งสองราย

รับที่อยู่ EID ของ Mesh-Local สําหรับตัวเชื่อม FTD เราใช้ที่อยู่นี้เพราะเข้าถึงได้จากทุกที่ภายในเครือข่ายชุดข้อความ

## 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 โดยใช้ ML-EID ดังนี้

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

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

การเชื่อมต่อ UDP ควรอยู่ระหว่างโหนด 2 โหนด ส่งข้อความจาก FTD Commissioner:

## 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. ยินดีด้วย

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

b915c433e7027cc7.png

ตอนนี้คุณทราบประเด็นต่อไปนี้แล้ว:

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

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

ลองสร้างแบบฝึกหัดต่อไปนี้จาก Codelab

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

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

โปรดดู openthread.io และ GitHub สําหรับทรัพยากร OpenThread ที่หลากหลาย ซึ่งรวมถึง:

  • แพลตฟอร์มที่รองรับ — ค้นหาแพลตฟอร์มทั้งหมดที่รองรับ OpenThread
  • สร้าง OpenThread — รายละเอียดเพิ่มเติมเกี่ยวกับการสร้างและกําหนดค่า OpenThread
  • Thread Primer — ครอบคลุมแนวคิดเทรดทั้งหมดที่แสดงใน Codelab นี้

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