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