1. บทนำ
OpenThread ของ Google เป็นการใช้งานแบบโอเพนซอร์สของโปรโตคอลเครือข่าย Thread® Google Nest ได้เปิดตัว OpenThread เพื่อทำให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมใช้งานในวงกว้างสำหรับนักพัฒนาซอฟต์แวร์เพื่อเร่งการพัฒนาผลิตภัณฑ์สำหรับบ้านที่เชื่อมต่อ
ข้อกำหนดของเทรดกำหนดโปรโตคอลการสื่อสารระหว่างอุปกรณ์ไร้สายที่เสถียร ปลอดภัย และใช้พลังงานต่ำ โดยใช้ IPv6 สำหรับแอปพลิเคชันในบ้าน OpenThread ใช้เลเยอร์เครือข่ายเทรดทั้งหมดซึ่งรวมถึง IPv6, 6LoWPAN, IEEE 802.15.4 ที่มีการรักษาความปลอดภัย MAC, Mesh Link Generatement และ Mesh Routing
ใน Codelab นี้ คุณจะได้เขียนโปรแกรม OpenThread บนฮาร์ดแวร์จริง สร้างและจัดการเครือข่ายเทรด และส่งข้อความระหว่างโหนดต่างๆ
สิ่งที่คุณจะได้เรียนรู้
- สร้างและแฟลชไบนารี 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 ชุด
ติดตั้ง 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 ใช้สำหรับการสร้าง
เราขอแนะนำให้วางไฟล์ที่เก็บถาวรที่แยกออกมาใน /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 จะติดขึ้นมา
หากเป็นกระดานแรกที่ต่อเชื่อมกับเครื่อง Linux จะปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM0
(บอร์ด nRF52840 ทั้งหมดจะใช้ ttyACM
เป็นตัวระบุพอร์ตอนุกรม)
$ ls /dev/ttyACM* /dev/ttyACM0
จดหมายเลขซีเรียลของบอร์ด nRF52840 ที่ใช้สำหรับ RCP ดังนี้
ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง 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
เริ่มต้น 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 ดังต่อไปนี้
ไปที่ตำแหน่งของเครื่องมือบรรทัดคำสั่ง 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
ยืนยันงานสร้าง
ยืนยันบิลด์ที่สำเร็จโดยการเข้าถึง 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 บานที่พร้อมใช้งานทันที ได้แก่
- บริการ / บันทึก
ot-daemon
รายการ - ตัวเข้าร่วม RCP ผ่าน
ot-ctl
- คณะกรรมาธิการ FTD ผ่าน OpenThread CLI
- ตัวเชื่อม FTD ผ่าน OpenThread CLI
หากต้องการใช้การกำหนดค่าหรือเครื่องมือเทอร์มินัล / พอร์ตอนุกรมของคุณเอง ให้ข้ามไปยังขั้นตอนถัดไป กำหนดค่าหน้าต่างเทอร์มินัลสำหรับอุปกรณ์ทั้งหมดในแบบที่เหมาะกับคุณมากที่สุด
การใช้หน้าจอ
เพื่อการใช้งานที่ง่าย โปรดเริ่มเซสชันหน้าจอเพียง 1 เซสชันเท่านั้น คุณควรมี FTD ตั้งแต่ตอนตั้งค่า FTD ทั้ง 2 แบบอยู่แล้ว
คำสั่งทั้งหมดในหน้าจอเริ่มต้นด้วย Ctrl+a
คำสั่งพื้นฐานสำหรับหน้าจอ
แนบเซสชันหน้าจออีกครั้ง (จากบรรทัดคำสั่ง) |
|
ออกจากเซสชันหน้าจอ | Ctrl+a → |
สร้างหน้าต่างใหม่ภายในเซสชันหน้าจอ | Ctrl+a → |
สลับระหว่างหน้าต่างในเซสชันหน้าจอเดียวกัน | Ctrl+a → |
ปิดใช้งานหน้าต่างปัจจุบันในเซสชันหน้าจอ | Ctrl+a → |
แยกหน้าจอ
เมื่อใช้ Screen คุณสามารถแยกเทอร์มินัลออกเป็นหลายหน้าต่างได้ โดยทำตามขั้นตอนต่อไปนี้
เข้าถึงคำสั่งใน screen
ได้โดยใช้ Ctrl+a ทุกคำสั่งควรเริ่มต้นด้วยชุดคีย์การเข้าถึงนี้
หากคุณติดตาม Codelab มาตลอด ก็ควรจะมี 2 หน้าต่าง (FTD Commissioner, FTD Joiner) ในอินสแตนซ์หน้าจอเดียวกัน หากต้องการแบ่งหน้าจอระหว่างหน้าจอทั้งสอง ให้เข้าสู่เซสชันหน้าจอที่มีอยู่ก่อน ดังนี้
$ screen -r
คุณควรใช้งานอุปกรณ์ FTD เครื่องใดเครื่องหนึ่ง ทำตามขั้นตอนต่อไปนี้ในหน้าจอ
- Ctrl+a →
S
เพื่อแบ่งหน้าต่างในแนวนอน - Ctrl+a →
Tab
เพื่อเลื่อนเคอร์เซอร์ไปยังหน้าต่างใหม่ที่ว่างเปล่า - Ctrl+a →
n
เพื่อเปลี่ยนหน้าต่างใหม่นั้นไปยังหน้าต่างใหม่ - หากเป็นเหมือนกับหน้าต่างด้านบน ให้กด 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 → |
แยกหน้าต่างในแนวตั้ง | Ctrl+a → |
แยกหน้าต่างในแนวนอน | Ctrl+a → |
ข้ามไปยังหน้าต่างถัดไปที่แสดงอยู่ | Ctrl+a → |
สลับหน้าต่างที่แสดงไปข้างหน้าหรือข้างหลัง | Ctrl+a → |
เปลี่ยนชื่อหน้าต่างปัจจุบัน | Ctrl+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 โหนดตามที่เห็นได้จากแผนภาพโทโพโลยีนี้
แผนภาพโทโพโลยี
ขณะที่คุณดำเนินการส่วนที่เหลือของ Codelab เราจะแสดงแผนภาพโทโพโลยีเทรดใหม่เมื่อสถานะของเครือข่ายเปลี่ยนแปลง บทบาทของโหนดจะแสดงดังต่อไปนี้
เราเตอร์จะเป็นรูปห้าเหลี่ยมเสมอ และอุปกรณ์ปลายทางจะเป็นวงกลมเสมอ ตัวเลขในแต่ละโหนดจะแสดงถึงรหัสเราเตอร์หรือรหัสย่อยที่แสดงในเอาต์พุต 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 นี่คือโทโพโลยีที่อัปเดตของเรา:
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 ด้วย
ยืนยันสถานะใหม่และ RLOC16 ใน FTD Joiner
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
ดาวน์เกรดเครื่องมือเข้าร่วม FTD
คุณทดสอบลักษณะการทำงานนี้ได้โดยการดาวน์เกรดเครื่องมือเข้าร่วม FTD ด้วยตนเองจากเราเตอร์กลับไปเป็นอุปกรณ์ปลายทาง เปลี่ยนสถานะเป็น "ย่อย" และตรวจสอบ RLOC16 ดังนี้
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
เมื่อย้อนกลับไปที่ค่าคอมมิชชัน 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
นำผู้นำออก
ผู้นำจะได้รับการเลือกตั้งด้วยตนเองจาก 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
ตรวจสอบตารางย่อย โปรดสังเกตว่ามี 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
เครือข่ายเทรดของเราประกอบด้วยโหนด 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 | ขอบเขต | ส่งถึง |
| ลิงก์ในพื้นที่ | FTD และ MED ทั้งหมด |
| ลิงก์ในพื้นที่ | FTD และ Border Router ทั้งหมด |
| ตาข่ายท้องถิ่น | FTD และ MED ทั้งหมด |
| ตาข่ายท้องถิ่น | 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 จะเข้าถึงได้ด้วยฮ็อปครั้งเดียว
กำลังใช้คำสั่ง 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
ซึ่งหมายความว่า 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
ใช้คำสั่ง 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 ในเอาต์พุต 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. ยินดีด้วย
คุณได้สร้างเครือข่ายเทรดจริงแล้ว
ตอนนี้คุณทราบประเด็นต่อไปนี้แล้ว
- ความแตกต่างระหว่างประเภทอุปกรณ์เทรด บทบาท และขอบเขต
- วิธีที่อุปกรณ์เทรดจัดการสถานะของตนภายในเครือข่าย
- วิธีส่งข้อความง่ายๆ ระหว่างโหนดโดยใช้ UDP
ขั้นตอนถัดไป
จาก Codelab นี้ ลองทำตามแบบฝึกหัดต่อไปนี้
- เปลี่ยนกระดาน FTD Joiner เป็น MTD โดยใช้ไบนารี
ot-cli-mtd
และสังเกตเห็นว่าไม่ได้อัปเกรดตัวเองเป็นเราเตอร์หรือพยายามเป็นผู้นำ - เพิ่มอุปกรณ์ (ลองใช้แพลตฟอร์มอื่น) ไปยังเครือข่ายและร่างการจำแนกประเภทโดยใช้ตารางเราเตอร์และตารางย่อย ตลอดจนคำสั่ง ping ไปยังที่อยู่มัลติแคสต์
- ใช้ pyspinel เพื่อควบคุม NCP
- แปลง NCP เป็น Border Router โดยใช้ OpenThread Border Router และเชื่อมต่อเครือข่าย Thread กับอินเทอร์เน็ต
อ่านเพิ่มเติม
ดู openthread.io และ GitHub สำหรับทรัพยากรต่างๆ ของ OpenThread เช่น
- แพลตฟอร์มที่รองรับ — ค้นหาแพลตฟอร์มทั้งหมดที่รองรับ OpenThread
- สร้าง OpenThread — รายละเอียดเพิ่มเติมเกี่ยวกับการสร้างและกำหนดค่า OpenThread
- Thread Primer — ครอบคลุมแนวคิดเทรดทั้งหมดใน Codelab นี้
ข้อมูลอ้างอิง: