1. บทนำ
OpenThread ที่ Google เปิดตัวเป็นการใช้งานโปรโตคอลเครือข่าย Thread® แบบโอเพนซอร์ส Google Nest ได้เปิดตัว OpenThread เพื่อให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมให้บริการแก่นักพัฒนาซอฟต์แวร์อย่างกว้างขวางเพื่อเร่งการพัฒนาผลิตภัณฑ์สำหรับสมาร์ทโฮม
ข้อกำหนดของ Thread กำหนดโปรโตคอลการสื่อสารแบบไร้สายที่เชื่อถือได้ ปลอดภัย และใช้พลังงานต่ำจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งที่อิงตาม IPv6 สำหรับแอปพลิเคชันในบ้าน OpenThread ใช้เลเยอร์เครือข่าย Thread ทั้งหมด ซึ่งรวมถึง IPv6, 6LoWPAN, IEEE 802.15.4 ที่มีการรักษาความปลอดภัย MAC, การสร้างลิงก์ Mesh และการกำหนดเส้นทาง Mesh
ใน Codelab นี้ คุณจะได้เขียนโปรแกรม OpenThread ในฮาร์ดแวร์จริง สร้างและจัดการเครือข่าย Thread รวมถึงส่งข้อความระหว่างโหนด
สิ่งที่คุณจะได้เรียนรู้
- การสร้างและแฟลชไบนารี OpenThread CLI ไปยังบอร์ดสำหรับนักพัฒนาซอฟต์แวร์
- การสร้าง RCP ที่ประกอบด้วยเครื่อง Linux และบอร์ดสำหรับนักพัฒนาซอฟต์แวร์
- การสื่อสารกับ RCP โดยใช้ OpenThread Daemon และ
ot-ctl
- การจัดการโหนด Thread ด้วยตนเองด้วย GNU Screen และ OpenThread CLI
- การจัดสรรอุปกรณ์ลงในเครือข่าย Thread อย่างปลอดภัย
- วิธีการทำงานของมัลติแคสต์ IPv6
- การส่งข้อความระหว่างโหนด Thread ด้วย UDP
สิ่งที่คุณต้องมี
ฮาร์ดแวร์
- บอร์ดพัฒนา nRF52840 ของ Nordic Semiconductor 3 บอร์ด
- สาย USB เป็นไมโคร USB 3 เส้นสำหรับเชื่อมต่อบอร์ด
- เครื่อง Linux ที่มีพอร์ต USB อย่างน้อย 3 พอร์ต
ซอฟต์แวร์:
- GNU Toolchain
- เครื่องมือบรรทัดคำสั่ง Nordic nRF5x
- ซอฟต์แวร์ Segger J-Link
- OpenThread
- Git
2. เริ่มต้นใช้งาน
การจำลอง OpenThread
ก่อนเริ่มต้น คุณอาจต้องลองทำตาม OpenThread Simulation Codelab เพื่อทำความคุ้นเคยกับแนวคิดพื้นฐานของ Thread และ CLI ของ OpenThread
เทอร์มินัลพอร์ตอนุกรม
คุณควรคุ้นเคยกับวิธีเชื่อมต่อกับพอร์ตอนุกรมผ่านเทอร์มินัล Codelab นี้ใช้ GNU Screen และให้ภาพรวมการใช้งาน แต่คุณจะใช้ซอฟต์แวร์เทอร์มินัลอื่นๆ ก็ได้
เครื่อง Linux
Codelab นี้ออกแบบมาเพื่อใช้เครื่อง Linux ที่ใช้ i386 หรือ x86 เป็นโฮสต์สำหรับอุปกรณ์ Thread ที่เป็นตัวประมวลผลร่วมวิทยุ (RCP) และเพื่อแฟลชบอร์ดพัฒนา Thread ทั้งหมด เราได้ทดสอบทุกขั้นตอนใน Ubuntu 14.04.5 LTS (Trusty Tahr)
บอร์ด Nordic Semiconductor nRF52840
Codelab นี้ใช้บอร์ด nRF52840 PDK 3 บอร์ด
ติดตั้ง SEGGER J-Link
เราใช้ SEGGER J-Link เพื่อตั้งโปรแกรมบอร์ด nRF52840 ซึ่งมีโมดูล JTAG ในตัว ติดตั้งในเครื่อง Linux
ดาวน์โหลดแพ็กเกจที่เหมาะสมสำหรับเครื่องของคุณ แล้วติดตั้งในตำแหน่งที่ถูกต้อง ใน Linux จะเป็น /opt/SEGGER/JLink
ติดตั้งเครื่องมือบรรทัดคำสั่ง nRF5x
เครื่องมือบรรทัดคำสั่ง nRF5x ช่วยให้คุณแฟลชไบนารี OpenThread ไปยังบอร์ด nRF52840 ได้ ติดตั้งบิลด์ nRF5x-Command-Line-Tools-<OS> ที่เหมาะสมในเครื่อง Linux
วางแพ็กเกจที่แยกออกมาในโฟลเดอร์รูท ~/
ติดตั้ง ARM GNU Toolchain
ใช้ ARM GNU Toolchain สำหรับการสร้าง
เราขอแนะนำให้วางไฟล์ที่แยกออกมาไว้ใน /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
ในเครื่อง Linux ทำตามวิธีการในไฟล์ readme.txt
ของที่เก็บเพื่อดูวิธีการติดตั้ง
ติดตั้งหน้าจอ (ไม่บังคับ)
Screen เป็นเครื่องมือที่ใช้งานง่ายสำหรับการเข้าถึงอุปกรณ์ที่เชื่อมต่อด้วยพอร์ตอนุกรม Codelab นี้ใช้ Screen แต่คุณจะใช้แอปพลิเคชันเทอร์มินัลพอร์ตอนุกรมใดก็ได้ตามต้องการ
$ sudo apt-get install screen
3. โคลนที่เก็บ
OpenThread
โคลนและติดตั้ง OpenThread script/bootstrap
คำสั่งจะตรวจสอบว่าได้ติดตั้งเครื่องมือและกำหนดค่าสภาพแวดล้อมอย่างถูกต้อง
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
สร้าง OpenThread Daemon:
$ script/cmake-build posix -DOT_DAEMON=ON
ตอนนี้คุณก็พร้อมที่จะสร้างและแฟลช OpenThread ไปยังบอร์ด nRF52840 แล้ว
4. ตั้งค่า RCP Joiner
สร้างและแฟลช
สร้างตัวอย่าง OpenThread nRF52840 ด้วยฟังก์ชันการทำงานของ Joiner และ USB ดั้งเดิม อุปกรณ์จะใช้บทบาท Joiner เพื่อรับการตรวจสอบสิทธิ์อย่างปลอดภัยและได้รับการจัดสรรในเครือข่าย Thread USB ดั้งเดิมช่วยให้ใช้ USB CDC ACM เป็นการรับส่งแบบอนุกรมระหว่าง nRF52840 กับโฮสต์ได้
ให้ล้างข้อมูลที่สร้างก่อนหน้าในที่เก็บก่อนเสมอโดยเรียกใช้ rm -rf build
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 USB_trans
ไปที่ไดเรกทอรีที่มีไบนารี RCP ของ OpenThread แล้วแปลงเป็นรูปแบบเลขฐานสิบหกโดยทำดังนี้
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex
ต่อสาย USB เข้ากับพอร์ตแก้ไขข้อบกพร่องแบบไมโคร USB ข้างหมุดจ่ายไฟภายนอกบนบอร์ด nRF52840 แล้วเสียบเข้ากับเครื่อง Linux ตั้งค่าสวิตช์แหล่งจ่ายไฟ nRF บนบอร์ด nRF52840 เป็น VDD เมื่อเชื่อมต่ออย่างถูกต้องแล้ว LED5 จะติด
หากนี่คือบอร์ดแรกที่ต่อกับเครื่อง Linux บอร์ดจะปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM0
(บอร์ด nRF52840 ทั้งหมดใช้ ttyACM
เป็นตัวระบุพอร์ตอนุกรม)
$ ls /dev/ttyACM* /dev/ttyACM0
จดหมายเลขซีเรียลของบอร์ด nRF52840 ที่ใช้สำหรับ RCP
ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง nRFx แล้วแฟลชไฟล์ Hex ของ OpenThread RCP ลงในบอร์ด nRF52840 โดยใช้หมายเลขซีเรียลของบอร์ด โปรดทราบว่าหากไม่ใส่--verify
คุณจะเห็นข้อความเตือนที่แจ้งว่ากระบวนการแฟลชอาจล้มเหลวโดยไม่มีข้อผิดพลาด
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset
ระบบจะสร้างเอาต์พุตต่อไปนี้เมื่อดำเนินการสำเร็จ
Parsing hex file. Erasing user available code and UICR flash areas. Applying system reset. Checking that the area to write is not protected. Programing device. Applying system reset. Run.
ติดป้ายกำกับบอร์ดว่า "RCP" เพื่อไม่ให้สับสนเกี่ยวกับบทบาทของบอร์ดในภายหลัง
เชื่อมต่อกับ USB ดั้งเดิม
เนื่องจากการสร้าง OpenThread RCP ช่วยให้ใช้ USB CDC ACM ดั้งเดิมเป็นการรับส่งแบบอนุกรมได้ คุณจึงต้องใช้พอร์ต nRF USB บนบอร์ด nRF52840 เพื่อสื่อสารกับโฮสต์ RCP (เครื่อง Linux)
ถอดปลายไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่แฟลช แล้วเสียบกลับเข้าไปที่พอร์ต nRF USB แบบไมโคร USB ข้างปุ่ม RESET ตั้งค่าสวิตช์แหล่งจ่ายไฟ nRF เป็น USB
เริ่ม OpenThread Daemon
ในการออกแบบ RCP ให้ใช้ OpenThread Daemon เพื่อสื่อสารและจัดการอุปกรณ์ Thread เริ่ม ot-daemon
ด้วย-v
แฟล็ก verbose เพื่อให้คุณเห็นเอาต์พุตของบันทึกและยืนยันว่ากำลังทำงานอยู่
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'
เมื่อสำเร็จ ot-daemon
ในโหมดละเอียดจะสร้างเอาต์พุตที่คล้ายกับต่อไปนี้
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
เปิดหน้าต่างเทอร์มินัลนี้ไว้เพื่อให้ดูบันทึกจาก ot-daemon
ได้
ใช้ ot-ctl
เพื่อสื่อสารกับโหนด RCP ot-ctl
ใช้ CLI เดียวกันกับแอป OpenThread CLI คุณจึงควบคุมโหนด ot-daemon
ได้ในลักษณะเดียวกับอุปกรณ์ Thread อื่นๆ ที่จำลอง
ในหน้าต่างเทอร์มินัลที่ 2 ให้เริ่ม ot-ctl
:
$ sudo ./build/posix/src/posix/ot-ctl >
ตรวจสอบ state
ของโหนด 2 (โหนด RCP) ที่คุณเริ่มต้นด้วย ot-daemon
> state disabled Done
5. ตั้งค่า FTD
ส่วนโหนด Thread อีก 2 รายการที่ใช้ใน Codelab นี้คืออุปกรณ์ Thread แบบเต็ม (FTD) ในการออกแบบ System-on-Chip (SoC) มาตรฐาน อุปกรณ์เครื่องหนึ่งจะทำหน้าที่เป็นผู้ดูแลระบบเพื่อตรวจสอบสิทธิ์และจัดสรรอุปกรณ์ลงในเครือข่ายนั้นอย่างปลอดภัย อุปกรณ์อีกเครื่องจะทำหน้าที่เป็นอุปกรณ์ที่เข้าร่วม ซึ่งผู้ดูแลระบบสามารถตรวจสอบสิทธิ์เพื่อเข้าสู่เครือข่าย Thread ได้
สร้างและแฟลช
สร้างตัวอย่าง FTD ของ OpenThread สำหรับแพลตฟอร์ม nRF52840 โดยเปิดใช้บทบาทของ Commissioner และ Joiner ดังนี้
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
ไปที่ไดเรกทอรีที่มีไบนารี CLI ของอุปกรณ์ OpenThread Full Thread Device (FTD) แล้วแปลงเป็นรูปแบบเลขฐานสิบหก
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
ต่อสาย USB เข้ากับพอร์ต Micro-USB ข้างหมุดจ่ายไฟภายนอกบนบอร์ด nRF52840 แล้วเสียบเข้ากับเครื่อง Linux หาก RCP ยังคงเชื่อมต่อกับเครื่อง Linux บอร์ดใหม่นี้ควรปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM1
(บอร์ด nRF52840 ทั้งหมดใช้ ttyACM
สำหรับตัวระบุพอร์ตอนุกรม)
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
เช่นเดียวกับก่อนหน้านี้ ให้จดหมายเลขซีเรียลของบอร์ด nRF52840 ที่ใช้สำหรับ FTD
ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง nRFx แล้วแฟลชไฟล์ hex ของ OpenThread CLI FTD ลงในบอร์ด nRF52840 โดยใช้หมายเลขซีเรียลของบอร์ด
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset
ติดป้ายกำกับบอร์ดว่า "กรรมาธิการ"
เชื่อมต่อกับ USB ดั้งเดิม
เนื่องจากบิลด์ FTD ของ OpenThread ช่วยให้ใช้ USB CDC ACM ดั้งเดิมเป็นการรับส่งแบบอนุกรมได้ คุณจึงต้องใช้พอร์ต nRF USB ในบอร์ด nRF52840 เพื่อสื่อสารกับโฮสต์ RCP (เครื่อง Linux)
ถอดปลายไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่แฟลช แล้วเสียบกลับเข้าไปที่พอร์ต nRF USB แบบไมโคร USB ข้างปุ่ม RESET ตั้งค่าสวิตช์แหล่งจ่ายไฟ nRF เป็น USB
ยืนยันบิลด์
ยืนยันว่าการสร้างสำเร็จโดยเข้าถึง OpenThread CLI โดยใช้ GNU Screen จากหน้าต่างเทอร์มินัล
$ screen /dev/ttyACM1
ในหน้าต่างใหม่ ให้กด Return บนแป้นพิมพ์ 2-3 ครั้งเพื่อแสดงพรอมต์ OpenThread CLI >
เปิดอินเทอร์เฟซ IPv6 และตรวจสอบที่อยู่
> ifconfig up Done > ipaddr fe80:0:0:0:1cd6:87a9:cb9d:4b1d Done
ใช้ Ctrl+a →
d
เพื่อยกเลิกการเชื่อมต่อจากหน้าจอ FTD Commissioner CLI และกลับไปที่เทอร์มินัล Linux เพื่อให้สามารถแฟลชบอร์ดถัดไปได้ หากต้องการเข้าสู่ CLI อีกครั้งเมื่อใดก็ได้ ให้ใช้ screen -r
จากบรรทัดคำสั่ง หากต้องการดูรายการหน้าจอที่พร้อมใช้งาน ให้ใช้ screen -ls
ดังนี้
$ screen -ls There is a screen on: 74182.ttys000.mylinuxmachine (Detached) 1 Socket in /tmp/uscreens/S-username.
ตั้งค่า FTD Joiner
ทำกระบวนการข้างต้นซ้ำเพื่อแฟลชบอร์ด nRF52840 ที่ 3 โดยใช้ot-cli-ftd.hex
บิลด์ที่มีอยู่ เมื่อเสร็จแล้ว ให้เชื่อมต่อบอร์ดกับ PC อีกครั้งโดยใช้พอร์ต USB ของ nRF และตั้งสวิตช์แหล่งจ่ายไฟ nRF เป็น VDD
หากเชื่อมต่อโหนดอีก 2 โหนดกับเครื่อง Linux เมื่อเชื่อมต่อบอร์ดที่ 3 แล้ว โหนดควรปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM2
ดังนี้
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
ติดป้ายกำกับบอร์ดว่า "ผู้เข้าร่วม"
เมื่อยืนยันโดยใช้ Screen แทนที่จะสร้างอินสแตนซ์ใหม่ของ Screen จากบรรทัดคำสั่ง ให้เชื่อมต่อกับอินสแตนซ์ที่มีอยู่ใหม่และสร้างหน้าต่างใหม่ภายใน (ที่คุณใช้สำหรับกรรมาธิการ FTD)
$ screen -r
สร้างหน้าต่างใหม่ภายใน Screen ด้วย Ctrl+a → c
พรอมต์บรรทัดคำสั่งใหม่จะปรากฏขึ้น เข้าถึง CLI ของ OpenThread สำหรับ FTD Joiner โดยทำดังนี้
$ screen /dev/ttyACM2
ในหน้าต่างใหม่นี้ ให้กด Return บนแป้นพิมพ์ 2-3 ครั้งเพื่อแสดงพรอมต์ OpenThread CLI >
เปิดอินเทอร์เฟซ IPv6 และตรวจสอบที่อยู่
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
ตอนนี้ FTD Joiner CLI อยู่ในอินสแตนซ์เดียวกันของ Screen กับ FTD Commissioner แล้ว คุณจึงสลับไปมาระหว่างอินสแตนซ์ทั้ง 2 ได้โดยใช้ Ctrl+a → n
ใช้ Ctrl+a →
d
ได้ทุกเมื่อเพื่อออกจากหน้าจอ
6. การตั้งค่าหน้าต่างเทอร์มินัล
นับจากนี้ไป คุณจะต้องสลับอุปกรณ์ Thread บ่อยๆ ดังนั้นโปรดตรวจสอบว่าอุปกรณ์ทั้งหมดเปิดอยู่และเข้าถึงได้ง่าย ที่ผ่านมา เราใช้ Screen เพื่อเข้าถึง FTD ทั้ง 2 รายการ และเครื่องมือนี้ยังอนุญาตให้แยกหน้าจอในหน้าต่างเทอร์มินัลเดียวกันได้ด้วย ใช้เพื่อดูว่าโหนดหนึ่งตอบสนองต่อคำสั่งที่ออกในอีกโหนดหนึ่งอย่างไร
คุณควรมีหน้าต่าง 4 หน้าต่างที่พร้อมใช้งาน ดังนี้
- บริการ / บันทึก
ot-daemon
- RCP Joiner ผ่าน
ot-ctl
- FTD Commissioner ผ่าน OpenThread CLI
- FTD Joiner ผ่าน OpenThread CLI
หากต้องการใช้การกำหนดค่าหรือเครื่องมือพอร์ตเทอร์มินัล / พอร์ตอนุกรมของคุณเอง โปรดข้ามไปยังขั้นตอนถัดไป กำหนดค่าหน้าต่างเทอร์มินัลสำหรับอุปกรณ์ทั้งหมดในแบบที่เหมาะกับคุณที่สุด
การใช้หน้าจอ
เพื่อความสะดวกในการใช้งาน ให้เริ่มเซสชันหน้าจอเพียงเซสชันเดียว คุณควรมีอยู่แล้วตั้งแต่ตอนตั้งค่า FTD ทั้ง 2 เครื่อง
คำสั่งทั้งหมดภายใน Screen จะขึ้นต้นด้วย Ctrl+a
คำสั่งพื้นฐานของหน้าจอ
แนบเซสชัน Screen อีกครั้ง (จากบรรทัดคำสั่ง) |
|
ออกจากเซสชัน Screen | Ctrl+a → |
สร้างหน้าต่างใหม่ภายในเซสชันหน้าจอ | Ctrl+a → |
สลับระหว่างหน้าต่างในเซสชัน Screen เดียวกัน | Ctrl+a → |
ปิดหน้าต่างปัจจุบันในเซสชัน Screen | Ctrl+a → |
แยกหน้าจอ
ด้วย Screen คุณสามารถแบ่งเทอร์มินัลออกเป็นหลายหน้าต่างได้โดยทำดังนี้
คำสั่งใน screen
จะเข้าถึงได้โดยใช้ Ctrl+a ทุกคำสั่งควรเริ่มต้นด้วยชุดค่าผสมของคีย์การเข้าถึงนี้
หากทำตาม Codelab อย่างถูกต้อง คุณควรมี 2 หน้าต่าง (FTD Commissioner, FTD Joiner) ในอินสแตนซ์หน้าจอเดียวกัน หากต้องการแยกหน้าจอระหว่าง 2 หน้าต่าง ให้เข้าสู่เซสชัน Screen ที่มีอยู่ก่อน โดยทำดังนี้
$ screen -r
คุณควรใช้อุปกรณ์ FTD อย่างใดอย่างหนึ่ง ทำตามขั้นตอนต่อไปนี้ใน Screen
- Ctrl+a →
S
เพื่อแยกหน้าต่างในแนวนอน - Ctrl+a →
Tab
เพื่อย้ายเคอร์เซอร์ไปยังหน้าต่างว่างใหม่ - Ctrl+a →
n
เพื่อเปลี่ยนหน้าต่างใหม่นั้นเป็นหน้าต่างถัดไป - หากเป็นอุปกรณ์ FTD เดียวกันกับหน้าต่างด้านบน ให้กด Ctrl+a →
n
อีกครั้งเพื่อดูอุปกรณ์ FTD อื่น
ตอนนี้ทั้ง 2 รายการปรากฏให้เห็นแล้ว สลับระหว่างหน้าต่างโดยใช้ Ctrl+a → Tab
เราขอแนะนำให้คุณเปลี่ยนชื่อแต่ละหน้าต่างด้วย Ctrl+a → A
เพื่อไม่ให้เกิดความสับสน
การใช้งานขั้นสูง
หากต้องการแบ่งหน้าจอออกเป็น 4 ส่วนและดูot-daemon
บันทึกและ RCP Joiner ot-ctl
ต่อไป คุณต้องเริ่มบริการเหล่านั้นภายในอินสแตนซ์หน้าจอเดียวกันนี้ โดยให้หยุด ot-daemon
และออก ot-ctl
แล้วรีสตาร์ทภายในหน้าต่าง Screen ใหม่ (Ctrl+a → c
)
การตั้งค่านี้ไม่จำเป็นและผู้ใช้สามารถเลือกทำหรือไม่ก็ได้
แยกและไปยังส่วนต่างๆ ระหว่างหน้าต่างด้วยคำสั่งต่อไปนี้
สร้างหน้าต่างใหม่ | Ctrl+a → |
แยกหน้าต่างในแนวตั้ง | Ctrl+a → |
แยกหน้าต่างในแนวนอน | Ctrl+a → |
ข้ามไปยังหน้าต่างถัดไปที่แสดง | Ctrl+a → |
สลับหน้าต่างที่แสดงไปข้างหน้าหรือข้างหลัง | Ctrl+a → |
เปลี่ยนชื่อหน้าต่างปัจจุบัน | Ctrl+a → |
ออกจาก Screen ได้ทุกเมื่อด้วย Ctrl+a → d
และเชื่อมต่ออีกครั้งด้วย screen -r
จากบรรทัดคำสั่ง
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Screen ได้ที่ข้อมูลอ้างอิงด่วนของ GNU Screen
7. สร้างเครือข่าย Thread
ตอนนี้คุณได้กำหนดค่าหน้าต่างเทอร์มินัลและหน้าจอทั้งหมดแล้ว มาสร้างเครือข่าย Thread กัน ใน FTD Commissioner ให้สร้างชุดข้อมูลการดำเนินงานใหม่และยืนยันให้เป็นชุดข้อมูลที่ใช้งานอยู่ ชุดข้อมูลการทำงานคือการกำหนดค่าสำหรับเครือข่าย Thread ที่คุณสร้าง
## FTD Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 11 Channel Mask: 07fff800 Ext PAN ID: c0de7ab5c0de7ab5 Mesh Local Prefix: fdc0:de7a:b5c0/64 Network Key: 1234c0de7ab51234c0de7ab51234c0de Network Name: OpenThread-c0de PAN ID: 0xc0de PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
จดบันทึกคีย์เครือข่าย 1234c0de7ab51234c0de7ab51234c0de
ซึ่งจะใช้ในภายหลัง
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่
> dataset commit active Done
เปิดอินเทอร์เฟซ IPv6
> ifconfig up Done
เริ่มการดำเนินการโปรโตคอล Thread
> thread start Done
รอสักครู่แล้วตรวจสอบสถานะอุปกรณ์ ควรเป็นผู้นำ และรับ RLOC16 เพื่อใช้อ้างอิงในอนาคต
## FTD Commissioner ## ---------------------- > state leader Done > rloc16 0c00 Done
ตรวจสอบที่อยู่ IPv6 ของอุปกรณ์
## FTD Commissioner ## ---------------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:c00 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a # Mesh-Local EID (ML-EID) fe80:0:0:0:1cd6:87a9:cb9d:4b1d # Link-Local Address (LLA)
ตอนนี้เครือข่าย "codelab" จะปรากฏเมื่อสแกนจากอุปกรณ์ Thread อื่น
จาก ot-ctl
ใน RCP Joiner ให้ทำดังนี้
## RCP Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
จาก OpenThread CLI ใน FTD Joiner ให้ทำดังนี้
## FTD Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
หากเครือข่าย "codelab" ไม่ปรากฏในรายการ ให้ลองสแกนอีกครั้ง
8. เพิ่ม RCP Joiner
การจัดสรร Thread ไม่ได้เปิดใช้งานในเครือข่าย ซึ่งหมายความว่าเราจะต้องเพิ่ม RCP Joiner ลงในเครือข่าย Thread ที่เพิ่งสร้างขึ้นโดยใช้กระบวนการจัดสรรแบบ Out-of-Band
ใน FTD Commissioner เราได้จดบันทึกคีย์เครือข่าย เช่น 1234c0de7ab51234c0de7ab51234c0de
หากต้องการค้นหาคีย์เครือข่ายอีกครั้ง ให้เรียกใช้คำสั่งต่อไปนี้ใน FTD Commissioner
## FTD Commissioner ## > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done
จากนั้นใน RCP Joiner ให้ตั้งค่าคีย์เครือข่ายชุดข้อมูลที่ใช้งานอยู่เป็นคีย์เครือข่ายของ FTD Commissioner ดังนี้
## RCP Joiner ## ---------------- > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done > dataset commit active Done
ตรวจสอบชุดข้อมูลเพื่อให้แน่ใจว่าได้ตั้งค่าอย่างถูกต้อง
## RCP Joiner ## ---------------- > dataset Network Key: 1234c0de7ab51234c0de7ab51234c0de
เปิด Thread เพื่อให้ RCP Joiner เข้าร่วมเครือข่าย "codelab" รอสักครู่ จากนั้นตรวจสอบสถานะ, RLOC16 และที่อยู่ IPv6 ดังนี้
## RCP Joiner ## ---------------- > ifconfig up Done > thread start Done > state child Done > rloc16 0c01 Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:0c01 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f # Mesh-Local EID (ML-EID) fe80:0:0:0:18e5:29b3:a638:943b # Link-Local Address (LLA) Done
จดที่อยู่ IPv6 ในเครือข่าย (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
ที่นี่) คุณจะได้ใช้ในภายหลัง
กลับไปที่ FTD Commissioner ให้ตรวจสอบตารางเราเตอร์และตารางย่อยเพื่อยืนยันว่าอุปกรณ์ทั้ง 2 เครื่องอยู่ในเครือข่ายเดียวกัน ใช้ RLOC16 เพื่อระบุ RCP Joiner
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 35 | 1ed687a9cb9d4b1d | Done > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|VER| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+---+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1| 2| 1ae529b3a638943b | Done
Ping ที่อยู่ Mesh-Local ของ RCP Joiner (ที่อยู่ Mesh-Local ที่ได้จากเอาต์พุต ipaddr
ของ RCP Joiner) เพื่อยืนยันการเชื่อมต่อ
## FTD Commissioner ## ---------------------- > ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f > 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms
ตอนนี้เรามีเครือข่าย Thread ที่ประกอบด้วย 2 โหนด ซึ่งแสดงในแผนภาพโทโพโลยีนี้
ไดอะแกรมโทโพโลยี
ขณะที่คุณทำตาม Codelab ส่วนที่เหลือ เราจะแสดงแผนภาพโทโพโลยี Thread ใหม่ทุกครั้งที่สถานะของเครือข่ายเปลี่ยนแปลง บทบาทของโหนดจะระบุไว้ดังนี้
เราเตอร์จะเป็นรูปห้าเหลี่ยมเสมอ และอุปกรณ์ปลายทางจะเป็นวงกลมเสมอ ตัวเลขในแต่ละโหนดแสดงรหัสเราเตอร์หรือรหัสอุปกรณ์ย่อยที่แสดงในเอาต์พุต CLI โดยขึ้นอยู่กับบทบาทและสถานะปัจจุบันของแต่ละโหนดในขณะนั้น
9. มอบหมายงานให้ FTD Joiner
ตอนนี้มาเพิ่มอุปกรณ์ Thread เครื่องที่ 3 ลงในเครือข่าย "codelab" กัน ครั้งนี้เราจะใช้กระบวนการจัดสรรในแบนด์ที่ปลอดภัยยิ่งขึ้น และอนุญาตให้เฉพาะ FTD Joiner เข้าร่วมได้
ใน FTD Joiner ให้รับ eui64
เพื่อให้ FTD Commissioner ระบุได้
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
ใน FTD Commissioner ให้เริ่ม Commissioner และระบุ eui64
ของอุปกรณ์ที่เข้าร่วมได้ พร้อมกับข้อมูลเข้าสู่ระบบสำหรับผู้เข้าร่วม เช่น J01NME
ข้อมูลเข้าสู่ระบบสำหรับเข้าร่วมคือสตริงเฉพาะอุปกรณ์ของอักขระที่เป็นตัวอักษรและตัวเลขคละกันทั้งหมดที่เป็นตัวพิมพ์ใหญ่ (0-9 และ A-Y โดยไม่รวม I, O, Q และ Z เพื่อให้อ่านง่าย) โดยมีความยาวระหว่าง 6 ถึง 32 อักขระ
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
เปลี่ยนไปใช้ FTD Joiner เริ่มบทบาทผู้เข้าร่วมด้วยข้อมูลเข้าสู่ระบบผู้เข้าร่วมที่คุณเพิ่งตั้งค่าใน FTD Commissioner
## FTD Joiner ## ---------------- > ifconfig up Done > joiner start J01NME Done
ภายใน 1 นาที คุณจะได้รับการยืนยันว่าการตรวจสอบสิทธิ์สำเร็จ
## FTD Joiner ## ---------------- > Join success
เรียกใช้ Thread เพื่อให้ FTD Joiner เข้าร่วมเครือข่าย "codelab" แล้วตรวจสอบสถานะและ RLOC16 ทันที
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
ตรวจสอบที่อยู่ IPv6 ของอุปกรณ์ โปรดสังเกตว่าไม่มี ALOC เนื่องจากอุปกรณ์นี้ไม่ใช่ผู้นำและไม่ได้มีบทบาทเฉพาะ Anycast ที่ต้องใช้ ALOC
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:c02 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA)
เปลี่ยนไปใช้ FTD Commissioner ทันที แล้วตรวจสอบตารางเราเตอร์และตารางอุปกรณ์ย่อยเพื่อยืนยันว่ามีอุปกรณ์ 3 เครื่องอยู่ในเครือข่าย "codelab"
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 2 | 0x0c02 | 240 | 15 | 3 | 44 |1|1|1|1| e6cdd2d93249a243 | Done
จาก RLOC16 อุปกรณ์ที่เข้าร่วม FTD ได้เชื่อมต่อกับเครือข่ายเป็นอุปกรณ์ปลายทาง (อุปกรณ์ย่อย) โทโพโลยีที่อัปเดตแล้วมีดังนี้
10. การใช้งานชุดข้อความ
อุปกรณ์ Thread ใน Codelab นี้เป็นอุปกรณ์ Thread แบบเต็ม (FTD) ประเภทหนึ่งที่เรียกว่าอุปกรณ์ปลายทางที่มีสิทธิ์เป็นเราเตอร์ (REED) ซึ่งหมายความว่าอุปกรณ์เหล่านี้สามารถทำหน้าที่เป็นทั้งเราเตอร์หรืออุปกรณ์ปลายทาง และสามารถเลื่อนระดับจากอุปกรณ์ปลายทางเป็นเราเตอร์ได้
Thread รองรับเราเตอร์ได้สูงสุด 32 ตัว แต่พยายามให้มีเราเตอร์อยู่ระหว่าง 16 ถึง 23 ตัว หาก REED เชื่อมต่อเป็นอุปกรณ์ปลายทาง (อุปกรณ์ย่อย) และมีเราเตอร์น้อยกว่า 16 ตัว หลังจากผ่านระยะเวลาแบบสุ่มภายใน 2 นาที อุปกรณ์จะเลื่อนระดับตัวเองเป็นเราเตอร์โดยอัตโนมัติ
หากคุณมีบุตรหลาน 2 คนในเครือข่าย Thread หลังจากเพิ่ม FTD Joiner แล้ว ให้รออย่างน้อย 2 นาที แล้วตรวจสอบตารางเราเตอร์และตารางของบุตรหลานอีกครั้งใน FTD Commissioner โดยทำดังนี้
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | Done
FTD Joiner (Extended MAC = e6cdd2d93249a243
) ได้เลื่อนระดับตัวเองเป็นเราเตอร์ โปรดทราบว่า RLOC16 จะแตกต่างกัน (b800
แทนที่จะเป็น 0c02
) เนื่องจาก RLOC16 อิงตามรหัสเราเตอร์และรหัสอุปกรณ์ย่อย เมื่อเปลี่ยนจากอุปกรณ์ปลายทางเป็นเราเตอร์ ค่ารหัสเราเตอร์และรหัสอุปกรณ์ย่อยจะเปลี่ยนไป เช่นเดียวกับ RLOC16
ยืนยันสถานะใหม่และ RLOC16 ใน FTD Joiner ดังนี้
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
ดาวน์เกรด FTD Joiner
คุณสามารถทดสอบลักษณะการทำงานนี้ได้โดยการดาวน์เกรด FTD Joiner จากเราเตอร์กลับไปเป็นอุปกรณ์ปลายทางด้วยตนเอง เปลี่ยนสถานะเป็น "เด็ก" แล้วตรวจสอบ RLOC16 ดังนี้
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
กลับไปที่ FTD Commissioner ตอนนี้ FTD Joiner ควรปรากฏในตารางย่อย (ID = 3) โดยอาจมีทั้ง 2 อย่างในระหว่างการเปลี่ยนผ่าน
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 3 | 0x0c03 | 240 | 16 | 3 | 94 |1|1|1|1| e6cdd2d93249a243 | Done
หลังจากผ่านไปสักระยะหนึ่ง ระบบจะเปลี่ยนกลับไปใช้เราเตอร์ที่มี RLOC เป็น b800
นำผู้นำออก
โดยผู้นำจะได้รับการเลือกเองจากเราเตอร์ Thread ทั้งหมด ซึ่งหมายความว่าหากมีการนำผู้นำปัจจุบันออกจากเครือข่ายเทรด เราเตอร์ตัวอื่นจะกลายเป็นผู้นำใหม่
ใน FTD Commissioner ให้ปิด Thread เพื่อนำออกจากเครือข่าย Thread โดยทำดังนี้
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
ภายใน 2 นาที FTD Joiner จะกลายเป็นผู้นำ Thread คนใหม่ ตรวจสอบสถานะและที่อยู่ IPv6 ของ FTD Joiner เพื่อยืนยันสิ่งต่อไปนี้
## FTD Joiner ## ---------------- > state leader Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Now it has the Leader ALOC! fdc0:de7a:b5c0:0:0:ff:fe00:b800 fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd fe80:0:0:0:e4cd:d2d9:3249:a243 Done
ตรวจสอบตารางย่อย โปรดทราบว่ามี RLOC16 ใหม่ นี่คือ RCP Joiner ตามที่ระบุโดยรหัสและ MAC แบบขยาย เพื่อให้เครือข่าย Thread ทำงานร่วมกันได้ จึงได้เปลี่ยนเราเตอร์หลักจาก FTD Commissioner เป็น FTD Joiner ซึ่งจะส่งผลให้มี RLOC16 ใหม่สำหรับ RCP Joiner (เนื่องจาก Router ID เปลี่ยนจาก 3 เป็น 46)
## FTD Joiner ## ---------------- > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 27 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
คุณอาจต้องรอสักครู่เพื่อให้ RCP Joiner แนบกับ FTD Joiner เป็นอุปกรณ์ย่อย ตรวจสอบรัฐและ RLOC16 เพื่อยืนยันว่า
## RCP Joiner ## -------------- > state child > rloc16 b801
แนบ FTD Commissioner อีกครั้ง
เครือข่าย Thread ที่มี 2 โหนดนั้นไม่สนุกเท่าไหร่ มาทำให้กรรมาธิการ FTD กลับมาออนไลน์กัน
ใน FTD Commissioner ให้รีสตาร์ท Thread โดยทำดังนี้
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
ภายใน 2 นาที อุปกรณ์จะเชื่อมต่อกับเครือข่าย "codelab" อีกครั้งโดยอัตโนมัติในฐานะอุปกรณ์ปลายทาง จากนั้นจะเลื่อนระดับตัวเองเป็นเราเตอร์
## FTD Commissioner ## ---------------------- > state router Done
ตรวจสอบตารางเราเตอร์และตารางย่อยใน FTD Joiner เพื่อยืนยันสิ่งต่อไปนี้
## FTD Joiner ## ---------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 63 | 0 | 3 | 3 | 0 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 46 | 0 | 0 | 0 | 15 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 184 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
เครือข่าย Thread ของเราประกอบด้วย 3 โหนดอีกครั้ง
11. การแก้ปัญหา
การจัดการเครือข่าย Thread ที่มีอุปกรณ์หลายเครื่องในหน้าต่างเทอร์มินัลหรือหน้าต่างหน้าจอต่างๆ อาจซับซ้อน ใช้เคล็ดลับเหล่านี้เพื่อ "รีเซ็ต" สถานะของเครือข่ายหรือพื้นที่ทำงานหากพบปัญหา
หน้าจอ
หากคุณเคยหลงทางในการกำหนดค่า (หน้าต่าง Screen มากเกินไป หรือ Screen ภายใน Screen) ให้ปิดหน้าต่าง Screen ด้วย Ctrl+a → k จนกว่าจะไม่มีหน้าต่าง Screen และ screen -ls
ในบรรทัดคำสั่งจะแสดง No Sockets found
จากนั้นสร้างหน้าต่างหน้าจอใหม่สำหรับแต่ละอุปกรณ์ ระบบจะเก็บสถานะอุปกรณ์ไว้แม้ว่าจะปิดหน้าจอแล้วก็ตาม
โหนด Thread
หากโทโพโลยีเครือข่าย Thread ไม่เป็นไปตามที่อธิบายไว้ใน Codelab นี้ หรือโหนดตัดการเชื่อมต่อด้วยเหตุผลบางอย่าง (อาจเป็นเพราะเครื่อง Linux ที่ขับเคลื่อนโหนดเข้าสู่โหมดสลีป) คุณควรปิด Thread ล้างข้อมูลเข้าสู่ระบบเครือข่าย และเริ่มอีกครั้งจากขั้นตอนสร้างเครือข่าย Thread
วิธีรีเซ็ต FTD
## FTD Commissioner or FTD Joiner ## ------------------------------------ > thread stop Done > ifconfig down Done > factoryreset Done
คุณรีเซ็ต RCP ได้ในลักษณะเดียวกันผ่าน ot-ctl
ดังนี้
## RCP Joiner ## ---------------- > thread stop Done > ifconfig down Done > factoryreset Done
12. การใช้มัลติแคสต์
Multicast ใช้เพื่อสื่อสารข้อมูลไปยังกลุ่มอุปกรณ์พร้อมกัน ในเครือข่าย Thread จะมีการสงวนที่อยู่เฉพาะสำหรับการใช้งานมัลติแคสต์กับกลุ่มอุปกรณ์ต่างๆ โดยขึ้นอยู่กับขอบเขต
ที่อยู่ IPv6 | ขอบเขต | จัดส่งแล้วที่ |
| ลิงก์เฉพาะ | FTD และ MED ทั้งหมด |
| ลิงก์เฉพาะ | FTD และ Border Router ทั้งหมด |
| Mesh-Local | FTD และ MED ทั้งหมด |
| Mesh-Local | FTD และ Border Router ทั้งหมด |
เนื่องจากเราไม่ได้ใช้ Border Router ใน Codelab นี้ เรามาดูที่อยู่แบบมัลติคาสต์ FTD และ MED 2 รายการกัน
ลิงก์เฉพาะ
ขอบเขต Link-Local ประกอบด้วยอินเทอร์เฟซ Thread ทั้งหมดที่เข้าถึงได้ด้วยการส่งสัญญาณวิทยุครั้งเดียวหรือ "ฮอป" เดียว โทโพโลยีเครือข่ายจะกำหนดว่าอุปกรณ์ใดตอบสนองต่อ Ping ไปยังff02::1
ที่อยู่มัลติแคสต์
Ping ff02::1
จากกรรมาธิการ FTD:
## FTD Commissioner ## ---------------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms
มีอุปกรณ์อื่นๆ อีก 2 เครื่องในเครือข่าย (FTD Joiner และ RCP Joiner) แต่ FTD Commissioner ได้รับการตอบกลับเพียง 1 รายการจากที่อยู่ Link-Local (LLA) ของ FTD Joiner ซึ่งหมายความว่า FTD Joiner เป็นอุปกรณ์เดียวที่ FTD Commissioner สามารถเข้าถึงได้ด้วยการข้ามเพียงครั้งเดียว
ตอนนี้ให้ ping ff02::1
จาก FTD Joiner ดังนี้
## FTD Joiner ## ---------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms 8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms
2 คำตอบ เมื่อตรวจสอบที่อยู่ IPv6 สำหรับอุปกรณ์อื่นๆ เราจะเห็นว่าที่อยู่แรก (ลงท้ายด้วย 4b1d
) คือ LLA ของ FTD Commissioner และที่อยู่สอง (ลงท้ายด้วย 943b
) คือ LLA ของ RCP Joiner
ซึ่งหมายความว่า FTD Joiner เชื่อมต่อกับทั้ง FTD Commissioner และ RCP Joiner โดยตรง ซึ่งเป็นการยืนยันโทโพโลยีของเรา
Mesh-Local
ขอบเขต Mesh-Local ประกอบด้วยอินเทอร์เฟซ Thread ทั้งหมดที่เข้าถึงได้ภายในเครือข่าย Thread เดียวกัน มาดูการตอบกลับการ Ping ไปยังff03::1
ที่อยู่แบบมัลติแคสต์กัน
Ping ff03::1
จากกรรมาธิการ FTD:
## FTD Commissioner ## ---------------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms
คราวนี้กรรมาธิการ FTD ได้รับการตอบกลับ 2 รายการ รายการหนึ่งมาจากตัวระบุเส้นทางการเข้าร่วม FTD (RLOC ซึ่งลงท้ายด้วย b800
) และอีกรายการมาจาก EID ในเครื่องของ Mesh ของผู้เข้าร่วม RCP (ML-EID ซึ่งลงท้ายด้วย d55f
) เนื่องจากขอบเขตในเครื่องของ Mesh ประกอบด้วยเครือข่าย Thread ทั้งหมด ไม่ว่าอุปกรณ์จะอยู่ที่ใดในเครือข่าย อุปกรณ์จะได้รับการสมัครใช้ที่อยู่ ff03::1
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
สังเกตเวลาตอบสนองสำหรับ RCP Joiner ในเอาต์พุต ping ทั้ง 2 รายการ RCP Joiner ใช้เวลานานกว่ามากในการเข้าถึง FTD Commissioner (68 มิลลิวินาที) เมื่อเทียบกับการเข้าถึง FTD Joiner (23 มิลลิวินาที) เนื่องจากต้องมีการส่งต่อ 2 ครั้งเพื่อไปถึงผู้ว่าการ FTD เทียบกับการส่งต่อ 1 ครั้งสำหรับ FTD Joiner
คุณอาจสังเกตเห็นด้วยว่า Ping แบบ Multicast ใน Mesh ตอบกลับด้วย RLOC สำหรับ FTD 2 รายการเท่านั้น ไม่ใช่ RCP Joiner เนื่องจาก FTD เป็นเราเตอร์ภายในเครือข่าย ส่วน RCP เป็นอุปกรณ์ปลายทาง
ตรวจสอบสถานะของผู้เข้าร่วม RCP เพื่อยืนยันสิ่งต่อไปนี้
## RCP Joiner ## ---------------- > state child
13. ส่งข้อความด้วย UDP
บริการแอปพลิเคชันอย่างหนึ่งที่ OpenThread มีให้คือ User Datagram Protocol (UDP) ซึ่งเป็นโปรโตคอลชั้นการรับส่งข้อมูล แอปพลิเคชันที่สร้างขึ้นบน OpenThread สามารถใช้ UDP API เพื่อส่งข้อความระหว่างโหนดในเครือข่าย Thread หรือไปยังอุปกรณ์อื่นๆ ในเครือข่ายภายนอก (เช่น อินเทอร์เน็ต หากเครือข่าย Thread มี Border Router)
ซ็อกเก็ต UDP จะแสดงผ่าน CLI ของ OpenThread มาใช้เพื่อส่งข้อความระหว่าง FTD ทั้ง 2 เครื่องกัน
รับที่อยู่ EID ของ Mesh-Local สำหรับ FTD Joiner เราใช้ที่อยู่นี้เนื่องจากเข้าถึงได้จากทุกที่ภายในเครือข่าย Thread
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:b800 # Routing Locator (RLOC) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) Done
เริ่ม UDP และเชื่อมโยงกับซ็อกเก็ตสำหรับที่อยู่ IPv6 ใดก็ได้
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
เปลี่ยนไปใช้ FTD Commissioner, เริ่ม UDP และเชื่อมต่อกับซ็อกเก็ตที่คุณตั้งค่าใน FTD Joiner โดยใช้ ML-EID ของซ็อกเก็ต
## FTD Commissioner ## ---------------------- > udp open Done > udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212 Done
การเชื่อมต่อ UDP ควรใช้งานได้ระหว่าง 2 โหนด ส่งข้อความจากกรรมาธิการ FTD
## FTD Commissioner ## ---------------------- > udp send hellothere Done
ใน FTD Joiner ระบบได้รับข้อความ UDP แล้ว
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
14. ยินดีด้วย
คุณสร้างเครือข่าย Thread จริงแล้ว
ตอนนี้คุณก็รู้แล้วว่า
- ความแตกต่างระหว่างประเภทอุปกรณ์ บทบาท และขอบเขตของ Thread
- วิธีที่อุปกรณ์ Thread จัดการสถานะของตนเองภายในเครือข่าย
- วิธีส่งข้อความอย่างง่ายระหว่างโหนดโดยใช้ UDP
ขั้นตอนถัดไป
ลองทำแบบฝึกหัดต่อไปนี้โดยอิงจาก Codelab นี้
- แฟลชบอร์ด FTD Joiner เป็น MTD อีกครั้งโดยใช้ไบนารี
ot-cli-mtd
และสังเกตว่าบอร์ดจะไม่เคยอัปเกรดตัวเองเป็นเราเตอร์หรือพยายามเป็นผู้นำ - เพิ่มอุปกรณ์อื่นๆ (ลองใช้แพลตฟอร์มอื่นดู) ลงในเครือข่าย และร่างโทโพโลยีโดยใช้ตารางเราเตอร์และตารางย่อย พร้อมกับ Ping ไปยังที่อยู่แบบหลายผู้รับ
- ใช้ pyspinel เพื่อควบคุม NCP
- แปลง NCP เป็น Border Router โดยใช้ OpenThread Border Router และเชื่อมต่อเครือข่าย Thread กับอินเทอร์เน็ต
อ่านเพิ่มเติม
ดูแหล่งข้อมูล OpenThread ที่หลากหลายได้ที่ openthread.io และ GitHub ซึ่งรวมถึง
- แพลตฟอร์มที่รองรับ - ดูแพลตฟอร์มทั้งหมดที่รองรับ OpenThread
- สร้าง OpenThread - รายละเอียดเพิ่มเติมเกี่ยวกับการสร้างและกำหนดค่า OpenThread
- ข้อมูลเบื้องต้นเกี่ยวกับ Thread - ครอบคลุมแนวคิด Thread ทั้งหมดที่แสดงใน Codelab นี้
ข้อมูลอ้างอิง: