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

1. บทนำ

26b7f4f6b3ea0700.png

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

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

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

4806d16a8c137c6d.jpeg

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

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

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

ฮาร์ดแวร์:

  • Nordic เซมิคอนดักเตอร์ nRF52840 Dev 3 บอร์ด
  • สายเชื่อม USB กับ Micro-USB 3 สาย
  • เครื่อง Linux ที่มีพอร์ต USB อย่างน้อย 3 พอร์ต

ซอฟต์แวร์:

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

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

การจำลอง OpenThread

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

ขั้วต่อพอร์ตอนุกรม

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

เครื่อง Linux

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

บอร์ด Nordic เซมิคอนดักเตอร์ 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 ใช้สำหรับการสร้าง

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

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

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

$ 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

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

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

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

สร้างตัวอย่าง OpenThread nRF52840 ที่มี Joiner และฟังก์ชัน 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 แล้วแฟลชไฟล์เลขฐานสิบหก OpenThread RCP ลงบนบอร์ด nRF52840 โดยใช้หมายเลขซีเรียลของกระดาน โปรดทราบว่าหากคุณไม่รวมค่าสถานะ --verify ไว้ คุณจะเห็นข้อความเตือนว่ากระบวนการ Flash อาจล้มเหลวได้โดยไม่มีข้อผิดพลาด

$ 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 ที่กะพริบ แล้วเสียบกลับเข้าไปใหม่กับพอร์ตไมโคร USB nRF USB ที่อยู่ข้างปุ่ม RESET ตั้งค่าสวิตช์แหล่งพลังงาน nRF เป็น USB

46e7b670d2464842.png

เริ่มต้น OpenThread Daemon

ในการออกแบบ RCP ให้ใช้ OpenThread Daemon เพื่อสื่อสารและจัดการอุปกรณ์เทรด เริ่มต้น 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 รายการได้ในลักษณะเดียวกันกับอุปกรณ์เทรดจำลองอื่นๆ

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

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

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

> state
disabled
Done

5. ตั้งค่า FTD

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

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

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

สร้างตัวอย่าง OpenThread FTD สำหรับแพลตฟอร์ม 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) และแปลงเป็นรูปแบบเลขฐาน 16 ดังนี้

$ 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 และแฟลชไฟล์เลขฐานสิบหก 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 ดั้งเดิม

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

ถอดปลายด้านไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่กะพริบ แล้วเสียบกลับเข้าไปใหม่กับพอร์ตไมโคร USB nRF USB ที่อยู่ข้างปุ่ม RESET ตั้งค่าสวิตช์แหล่งพลังงาน 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 Joiner

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

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

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

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

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

$ screen -r

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

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

$ screen /dev/ttyACM2 115200

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

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

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

ใช้ Ctrl+a →

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

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

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

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

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

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

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

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

คำสั่งทั้งหมดในหน้าจอเริ่มต้นด้วย Ctrl+a

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

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

screen -r

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

Ctrl+a → d

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

Ctrl+a → c

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

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

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

Ctrl+a → k

แยกหน้าจอ

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

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 อีกเครื่อง

ตอนนี้ทั้ง 2 อย่างก็ปรากฏให้เห็น สลับเปลี่ยนโดยใช้ 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 จากบรรทัดคำสั่ง

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Screen ได้ที่ข้อมูลอ้างอิงฉบับย่อสำหรับหน้าจอ 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 Joiner ไปยังเครือข่ายเทรดที่เราเพิ่งสร้างขึ้นโดยใช้กระบวนการติดตั้งใช้งานนอกขอบเขต

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

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

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

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

ตรวจสอบว่าชุดข้อมูลได้รับการตั้งค่าอย่างถูกต้อง

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

เรียกใช้ Thread เพื่อให้เครื่องมือเข้าร่วม 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

จดที่อยู่ IPv6 ของ Mesh-Local (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f ที่นี่) ไว้เพื่อใช้งานภายหลัง

ไปที่คณะกรรมการ FTD แล้วตรวจสอบเราเตอร์และตารางย่อยเพื่อยืนยันว่าอุปกรณ์ทั้ง 2 เครื่องอยู่ในเครือข่ายเดียวกัน ใช้ 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 ของ 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

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

otcodelab_top01C_2nodes.png

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

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

b75a527be4563215.png

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

9. ค่าคอมมิชชันของผู้เสนอราคา FTD

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

ใน FTD Joiner ให้รับ eui64 เพื่อให้คณะกรรมการ FTD ระบุได้ ดังนี้

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

> eui64
2f57d222545271f1
Done

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

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

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

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

## 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 ทันที แล้วตรวจสอบเราเตอร์และตารางย่อยเพื่อยืนยันว่ามีอุปกรณ์ 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

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

otcodelab_top01C_ed01.png

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

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

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

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

otcodelab_top01C.png

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

## 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) วิดีโออาจมีทั้ง 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 Router ทั้งหมด ซึ่งหมายความว่าหากมีการนำผู้นำปัจจุบันออกจากเครือข่ายเทรด เราเตอร์อื่นๆ ตัวใดตัวหนึ่งจะกลายเป็นผู้นำคนใหม่

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

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

> thread stop
Done
> ifconfig down
Done

FTD Joiner จะเป็นผู้นำเทรดคนใหม่ภายใน 2 นาที ตรวจสอบสถานะและที่อยู่ 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 ซึ่งระบุด้วยรหัสและ Extended MAC โดยได้เปลี่ยนเราเตอร์ระดับบนสุดจากคณะกรรมาธิการ FTD ไปเป็น FTD Joiner เพื่อรักษาเครือข่ายเทรดไว้ ซึ่งจะส่งผลให้เกิด 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

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

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

> state
child
> rloc16
b801

แนบคณะกรรมาธิการ FTD อีกครั้ง

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

ในค่าคอมมิชชัน FTD ให้รีสตาร์ทชุดข้อความ:

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

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

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

ที่อยู่ IPv6

ขอบเขต

ส่งถึง

ff02::1

ลิงก์ในพื้นที่

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

ff02::2

ลิงก์ในพื้นที่

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

ff03::1

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

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

ff03::2

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

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

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

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

otcodelab_top02C_02_LL02.png

ซึ่งหมายความว่า FTD Joiner จะเชื่อมต่อกับทั้ง Commissioner FTD และ 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 Commissioner ได้รับ 2 คำตอบ 1 คำตอบจาก Routing Locator ของ FTD Joiner (RLOC, ลงท้ายด้วย b800) และอีก 1 คำตอบจาก Mesh-Local EID ของ RCP Joiner (ML-EID, ลงท้ายด้วย d55f) นั่นเป็นเพราะขอบเขต Mesh-local ประกอบด้วยเครือข่ายเทรดทั้งหมด ไม่ว่าอุปกรณ์จะอยู่ที่ใดในเครือข่าย อุปกรณ์จะสมัครรับข้อมูลจากที่อยู่ 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 ในเอาต์พุต ping ทั้ง 2 แบบ เครื่องมือเข้าร่วม RCP ใช้เวลาเข้าถึงคณะกรรมาธิการ FTD นานกว่า 68 มิลลิวินาที (68 มิลลิวินาที) เมื่อเทียบกับผู้เข้าร่วม FTD Joiner (23 มิลลิวินาที) นั่นเป็นเพราะว่าจะต้องพุ่ง 2 ครั้งจึงจะถึงคณะกรรมการ FTD เมื่อเทียบกับ 1 ฮ็อปสำหรับ FTD Joiner

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

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

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

> state
child

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

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

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

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

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

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

b915c433e7027cc7.png

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

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

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

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

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

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

ดู openthread.io และ GitHub สำหรับทรัพยากรต่างๆ ของ OpenThread เช่น

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