สร้างเครือข่าย 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 Link และการกําหนดเส้นทาง Mesh

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

4806d16a8c137c6d.jpeg

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

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

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

ฮาร์ดแวร์

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

ซอฟต์แวร์:

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

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

การจําลอง OpenThread

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

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

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

เครื่อง Linux

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

บอร์ด nRF52840 ของ Nordic Semiconductor

Codelab นี้ใช้บอร์ด PDK nRF52840 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

สร้าง Daemon ของ OpenThread

$ script/cmake-build posix -DOT_DAEMON=ON

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

4. ตั้งค่า RCP Joiner

บิลด์และแฟลช

สร้างตัวอย่าง 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 แบบไบนารี แล้วแปลงเป็นรูปแบบฐานสิบหกโดยทำดังนี้

$ 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 แล้วแฟลชไฟล์ OpenThread RCP ฐาน 16 ลงในบอร์ด nRF52840 โดยใช้หมายเลขซีเรียลของบอร์ด โปรดทราบว่าหากไม่ใส่ Flag --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 ในตัว

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

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

46e7b670d2464842.png

เริ่ม Daemon ของ OpenThread

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

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

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

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

> state
disabled
Done

5. ตั้งค่า FTD

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

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

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

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

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

ไปที่ไดเรกทอรีที่มีไฟล์ไบนารี CLI ของอุปกรณ์เทรดแบบเต็ม (FTD) ของ OpenThread แล้วแปลงเป็นรูปแบบฐานสิบหก โดยทำดังนี้

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

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

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

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

c00d519ebec7e5f0.jpeg

ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง nRFx แล้วแฟลชไฟล์ OpenThread CLI FTD ฐาน 16 ลงในบอร์ด 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 ข้างปุ่มรีเซ็ต ตั้งค่าสวิตช์แหล่งจ่ายไฟ 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 เมื่อต่อบอร์ดนี้ บอร์ดควรปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM2

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

ติดป้ายกํากับบอร์ดว่า "Joiner"

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

$ screen -r

สร้างหน้าต่างใหม่ภายในหน้าจอด้วยแป้น 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

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

ใช้แป้น Ctrl+a →

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

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

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

โดยคุณควรมีกรอบเวลา 4 กรอบเวลาดังนี้

  1. บริการ / บันทึก ot-daemon
  2. RCP Joiner ผ่าน ot-ctl
  3. ผู้บัญชาการ FTD ผ่าน CLI ของ OpenThread
  4. FTD Joiner ผ่าน OpenThread CLI

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

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

โปรดเริ่มเซสชัน Screen เพียงเซสชันเดียวเพื่อความสะดวกในการใช้งาน คุณควรมีอยู่แล้วจากตอนที่ตั้งค่า 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, ผู้ร่วมใช้ FTD) ในอินสแตนซ์หน้าจอเดียวกัน หากต้องการแยกหน้าจอระหว่าง 2 อุปกรณ์ ให้เข้าสู่เซสชันหน้าจอที่มีอยู่ก่อน โดยทำดังนี้

$ 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 เพื่อไม่ให้สับสน

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

หากต้องการแยกหน้าจอออกเป็น 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

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

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

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

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

## 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 Joiner ให้ทำดังนี้

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

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

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

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

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

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

8. เพิ่มตัวเชื่อมต่อ RCP

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

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

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

otcodelab_top01C_2nodes.png

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

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

b75a527be4563215.png

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

9. มอบหมายงานให้เครื่องมือผสาน FTD

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

ในผู้เข้าร่วม FTD ให้รับ eui64 เพื่อให้ผู้บัญชาการ FTD ระบุได้

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

## 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 Joiner เชื่อมต่อกับเครือข่ายเป็นอุปกรณ์ปลายทาง (ย่อย) ต่อไปนี้คือโทโปโลยีที่อัปเดตแล้ว

otcodelab_top01C_ed01.png

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

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

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

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

otcodelab_top01C.png

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

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

> state
router
Done
> rloc16
b800
Done

ดาวน์เกรดเครื่องมือผสาน FTD

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

นำผู้นำออก

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

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

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

> thread stop
Done
> ifconfig down
Done

ภายใน 2 นาที ผู้เข้าร่วม FTD จะกลายเป็นหัวหน้าชุดข้อความคนใหม่ ตรวจสอบสถานะและที่อยู่ 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 ตามรหัสและ MAC แบบขยาย อุปกรณ์นี้เปลี่ยนเราเตอร์หลักจาก FTD Commissioner เป็น 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 Joiner แนบกับ FTD Joiner เป็นอุปกรณ์ย่อย ตรวจสอบสถานะและ RLOC16 เพื่อยืนยันว่า

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

> state
child
> rloc16
b801

แนบผู้บัญชาการ FTD อีกครั้ง

เครือข่ายเทรดที่มีโหนด 2 ตัวนั้นไม่ค่อยมีประโยชน์ มาทำให้ผู้บัญชาการ FTD กลับมาออนไลน์กัน

ใน FTD Commissioner ให้รีสตาร์ทชุดข้อความโดยทำดังนี้

## 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. การแก้ปัญหา

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

หน้าจอ

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

โหนด Thread

หากโทโปโลยีเครือข่ายเทรดไม่ตรงกับที่อธิบายไว้ใน 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

Link-Local

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

ff02::2

Link-Local

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

ff03::1

Mesh-Local

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

ff03::2

Mesh-Local

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

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

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

ผู้บัญชาการ FTD ส่ง Ping ไปยัง ff02::1

## 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 ได้รับคำตอบเพียงรายการเดียวจากที่อยู่ Link-Local (LLA) ของตัวรวม FTD ซึ่งหมายความว่าอุปกรณ์ Joiner ของ FTD เป็นอุปกรณ์เดียวที่ FTD Commissioner เข้าถึงได้ด้วยการ Hop เดียว

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 และตัวรวม RCP โดยตรง ซึ่งยืนยันโทโปโลยีของเรา

Mesh-Local

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

ผู้บัญชาการ FTD ส่ง Ping ไปยัง ff03::1

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

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

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

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

> state
child

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

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

ซ็อกเก็ต UDP จะแสดงผ่าน CLI ของ OpenThread เรามาลองใช้เพื่อส่งข้อความระหว่าง 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 ของ Joiner ดังนี้

## 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 จัดการสถานะภายในเครือข่าย
  • วิธีส่งข้อความธรรมดาระหว่างโหนดโดยใช้ UDP

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

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

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

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

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

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