1. ข้อมูลเบื้องต้น
OpenThread ที่เผยแพร่โดย Google เป็นการใช้งานโปรโตคอลโอเพนซอร์สสําหรับเครือข่าย Thread® Google Nest ได้เปิดตัว OpenThread เพื่อทําให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมใช้งานอย่างกว้างขวางสําหรับนักพัฒนาซอฟต์แวร์ เพื่อเร่งการพัฒนาผลิตภัณฑ์สําหรับบ้านที่เชื่อมต่อ
ข้อมูลจําเพาะของชุดข้อความกําหนดโปรโตคอลการสื่อสารระหว่างอุปกรณ์ไร้สายที่เชื่อถือได้และมีความปลอดภัยตามมาตรฐาน IPv6 สําหรับแอปพลิเคชันในบ้าน OpenThread ใช้ Thread Network Layer ทั้งหมด ซึ่งรวมถึง IPv6, 6LoWPAN, IEEE 802.15.4 พร้อมระบบ MAC, การสร้าง Mesh Link และ Mesh Routing
ใน Codelab นี้ คุณจะต้องเขียนโปรแกรม OpenThread บนฮาร์ดแวร์จริง สร้างและจัดการเครือข่าย Thread และส่งข้อความระหว่างโหนดต่างๆ
สิ่งที่คุณจะได้เรียนรู้
- การสร้างและกะพริบไบนารี OpenThread CLI ไปยังกระดาน dev
- การสร้าง RCP ที่ประกอบด้วยเครื่อง Linux และ Dev Board
- การสื่อสารกับ RCP โดยใช้ OpenThread Daemon และ
ot-ctl
- จัดการโหนดชุดข้อความด้วยตนเองด้วยหน้าจอ GNU และ OpenThread CLI
- การรักษาความปลอดภัยของอุปกรณ์ในเครือข่าย Thread อย่างปลอดภัย
- มัลติแคสต์ IPv6 ทํางานอย่างไร
- การส่งข้อความระหว่างโหนดชุดข้อความด้วย UDP
สิ่งที่ต้องมี
ฮาร์ดแวร์:
- บอร์ดพัฒนานักพัฒนาซอฟต์แวร์แบบเซมิคอนดักเตอร์แบบนอร์ดิก 3 เครื่อง nRF52840
- สายเชื่อม USB กับไมโคร USB 3 เส้นเพื่อเชื่อมต่อบอร์ด
- เครื่อง Linux ที่มีพอร์ต USB อย่างน้อย 3 พอร์ต
ซอฟต์แวร์:
- สายเครื่องมือ GNU
- เครื่องมือบรรทัดคําสั่ง nRF5x ของนอร์ดิก
- ซอฟต์แวร์ Segger J-Link
- OpenThread
- Git
2. การเริ่มต้นใช้งาน
การจําลอง OpenThread
ก่อนเริ่มต้น คุณอาจต้องศึกษา OpenThread Simulation Codelab เพื่อสร้างความคุ้นเคยกับแนวคิดพื้นฐานของ Thread และ OpenThread CLI
เทอร์มินัลพอร์ตอนุกรม
คุณควรคุ้นเคยกับวิธีเชื่อมต่อกับพอร์ตอนุกรมผ่านเทอร์มินัล Codelab นี้ใช้หน้าจอ GNU และแสดงภาพรวมการใช้งาน แต่สามารถใช้ซอฟต์แวร์เทอร์มินัลอื่นได้
เครื่อง Linux
Codelab นี้ได้รับการออกแบบมาให้ใช้เครื่อง Linux ที่ใช้ i386 หรือ x86 เป็นโฮสต์ในอุปกรณ์ Thread Co-Processor (RCP) และเพื่อแฟลชบอร์ด Thread Development ทั้งหมด มีการทดสอบทุกขั้นตอนบน Ubuntu 14.04.5 LTS (Trusty Tahr)
บอร์ด NRF52840 นอร์ดิกเซมิคอนดักเตอร์
Codelab นี้ใช้nnF52840 PDK Board 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
ของที่เก็บถาวรสําหรับคําแนะนําในการติดตั้ง
ติดตั้งหน้าจอ (ไม่บังคับ)
หน้าจอเป็นเครื่องมือง่ายๆ สําหรับการเข้าถึงอุปกรณ์ที่เชื่อมต่อด้วยพอร์ตอนุกรม Codelab นี้ใช้หน้าจอ คุณอาจใช้แอปพลิเคชันเทอร์มินัลพอร์ตอนุกรมใดก็ได้ตามต้องการ
$ 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
ตอนนี้คุณก็พร้อมสร้างและ OpenOpen ไปยังบอร์ด nRF52840 แล้ว
4. ตั้งค่าตัวเชื่อม RCP
สร้างและแฟลช
สร้างตัวอย่าง OpenThread nRF52840 ด้วยตัวเชื่อมและมีฟังก์ชัน 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 แล้วแฟลชไฟล์เลขฐานสิบหก 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 ในระบบ
คุณต้องใช้พอร์ต nRF USB บนบอร์ด nRF52840 เพื่อสื่อสารกับโฮสต์ RCP (เครื่อง Linux) เนื่องจากบิวด์ OpenThread RCP ช่วยให้สามารถใช้ USB CDC ACM แบบดั้งเดิมเป็นการส่งแบบอนุกรมได้
ถอดปลายสายไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่กะพริบแล้ว แล้วเสียบเข้ากับพอร์ต nRF USB ไมโคร USB ด้านข้างปุ่มรีเซ็ต ตั้งสวิตช์แหล่งพลังงาน nRF เป็น USB
เริ่ม OpenThread Daemon
ในการออกแบบ RCP ให้ใช้ OpenThread Daemon เพื่อสื่อสารและจัดการอุปกรณ์ Thread เริ่มการ 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
ได้เหมือนกับอุปกรณ์ Thread อื่นๆ ที่จําลองขึ้นมา
ในหน้าต่างที่ 2 ให้เริ่ม ot-ctl
$ sudo ./build/posix/src/posix/ot-ctl >
ตรวจสอบ state
ของโหนด 2 (โหนด RCP) ที่คุณเริ่มต้นด้วย ot-daemon
ดังนี้
> state disabled Done
5. ตั้งค่า FTD
โหนดชุดข้อความอีก 2 โหนดที่ใช้ใน Codelab นี้คือ Full Thread Devices (FTD) ในการออกแบบ System-on-Chip (SoC) มาตรฐาน ในการตั้งค่าเวอร์ชัน คนหนึ่งอาจใช้ wpantund
ซึ่งเป็นไดรเวอร์อินเทอร์เฟซเครือข่ายระดับการผลิตเพื่อควบคุมอินสแตนซ์ OpenThread NCP แต่ใน Codelab นี้ เราจะใช้ ot-ctl
หรือ OpenThread CLI
อุปกรณ์ 1 เครื่องทําหน้าที่เป็นค่าคอมมิชชัน เพื่อตรวจสอบสิทธิ์และค่าคอมมิชชันอุปกรณ์ในเครือข่ายดังกล่าวอย่างปลอดภัย อุปกรณ์อีกเครื่องหนึ่งทําหน้าที่เป็นตัวเชื่อมที่ค่าคอมมิชชันจะตรวจสอบสิทธิ์กับเครือข่ายเทรดได้
สร้างและแฟลช
สร้างตัวอย่าง OpenThread FTD สําหรับแพลตฟอร์ม nRF52840 ที่เปิดใช้บทบาท Commissioner และ Joiner ดังนี้
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
ไปยังไดเรกทอรีที่มีไบนารี OpenThread Full Thread Device (FTD) CLI และแปลงเป็นรูปแบบเลขฐานสิบหกดังนี้
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
เสียบสาย USB เข้ากับพอร์ต Micro-USB ที่อยู่ติดกับ PIN ภายนอกของบอร์ด 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 ในระบบ
คุณต้องใช้พอร์ต nRF USB บนกระดาน nRF52840 ในการสื่อสารกับโฮสต์ RCP (เครื่อง Linux) เนื่องจากบิวด์ OpenThread FTD เปิดใช้การใช้ USB CDC ACM แบบดั้งเดิมเป็นการส่งแบบอนุกรม
ถอดปลายสายไมโคร USB ของสาย USB ออกจากพอร์ตแก้ไขข้อบกพร่องของบอร์ด nRF52840 ที่กะพริบแล้ว แล้วเสียบเข้ากับพอร์ต nRF USB ไมโคร USB ด้านข้างปุ่มรีเซ็ต ตั้งสวิตช์แหล่งพลังงาน 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
ทําตามขั้นตอนข้างต้นซ้ําเพื่อติดกระดาน nRF52840 ที่ 3 โดยใช้บิลด์ ot-cli-ftd.hex
ที่มีอยู่ เมื่อเสร็จแล้ว ให้เชื่อมต่อบอร์ดกับคอมพิวเตอร์อีกครั้งโดยใช้พอร์ต USB nRF และตั้งค่าแหล่งจ่ายไฟ nRF เป็น VDD
หากมีโหนดอีก 2 โหนดที่ต่อเชื่อมกับเครื่อง Linux เมื่อแนบแผงที่สามนี้ โหนดนั้นจะปรากฏเป็นพอร์ตอนุกรม /dev/ttyACM2
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
ติดป้ายกํากับกระดานว่า "ตัวเชื่อม"
เมื่อยืนยันโดยใช้หน้าจอ แทนที่จะสร้างอินสแตนซ์ใหม่ของหน้าจอจากบรรทัดคําสั่ง ให้เชื่อมต่อกับอินสแตนซ์ที่มีอยู่อีกครั้ง และสร้างหน้าต่างใหม่ภายในนั้น (ที่คุณใช้สําหรับ FTD Commissioner) ดังนี้
$ screen -r
สร้างหน้าต่างใหม่ภายในหน้าจอด้วยแป้น Ctrl+a → c
พรอมท์บรรทัดคําสั่งใหม่จะปรากฏขึ้น เข้าถึง OpenThread CLI สําหรับตัวเชื่อม FTD
$ screen /dev/ttyACM2 115200
ในหน้าต่างใหม่ ให้กด Return บนแป้นพิมพ์ 2-3 ครั้งเพื่อเรียกพรอมต์ของ OpenThread CLI >
เปิดอินเทอร์เฟซ IPv6 และตรวจสอบที่อยู่ดังนี้
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
ตอนนี้ FTD Joiner CLI อยู่ในหน้าจอเดียวกันกับ FTD Commissioner คุณจะสลับระหว่าง FTD โดยใช้ Ctrl+a → n
ได้
ใช้ Ctrl+a →
d
ออกจากหน้าจอได้ทุกเมื่อ
6. การตั้งค่าหน้าต่างเทอร์มินัล
นับแต่นี้ไป คุณจะสลับระหว่างอุปกรณ์เทรดได้เป็นประจํา ดังนั้นโปรดตรวจสอบว่าทุกอุปกรณ์พร้อมใช้และเข้าถึงได้ง่าย ที่ผ่านมาเราได้ใช้หน้าจอเพื่อเข้าถึง FTD 2 ตัว และเครื่องมือนี้ยังอนุญาตให้แยกหน้าจอในหน้าต่างเทอร์มินัลด้วย ใช้ส่วนนี้เพื่อดูว่าหนึ่งโหนดตอบสนองต่อคําสั่งที่ออกในโหนดอื่นอย่างไร
ตามหลักแล้ว คุณควรจะมีหน้าต่าง 4 บานที่พร้อมใช้งาน ได้แก่
- บริการ / บันทึก
ot-daemon
- ตัวเชื่อม RCP ผ่าน
ot-ctl
- FTD Commissioner ผ่าน OpenThread CLI
- ตัวเชื่อม FTD ผ่าน OpenThread CLI
หากคุณต้องการใช้การกําหนดค่าหรือเครื่องมือเทอร์มินัล / พอร์ตอนุกรมของคุณเอง โปรดข้ามไปยังขั้นตอนถัดไป กําหนดค่าหน้าต่างเทอร์มินัลสําหรับอุปกรณ์ทั้งหมดในลักษณะที่ดีที่สุดสําหรับคุณ
การใช้หน้าจอ
เริ่มเซสชันเพียงเซสชันเดียวเพื่อให้ง่ายต่อการใช้งาน คุณควรมี 1 บัญชีอยู่แล้วตอนตั้งค่า FTD ทั้ง 2 รายการ
คําสั่งทั้งหมดภายในหน้าจอขึ้นต้นด้วย Ctrl+a
คําสั่งพื้นฐานของหน้าจอ:
แนบกับเซสชันหน้าจออีกครั้ง (จากบรรทัดคําสั่ง) |
|
ออกจากเซสชันหน้าจอ | Ctrl+a → |
สร้างหน้าต่างใหม่ในเซสชันหน้าจอ | Ctrl+a → |
สลับไปมาระหว่างหน้าต่างในเซสชันหน้าจอเดียวกัน | Ctrl+a → |
ปิดหน้าต่างปัจจุบันในเซสชันหน้าจอ | Ctrl+a → |
แยกหน้าจอ
หน้าจอจะแยกเทอร์มินัลออกเป็นหลายหน้าต่างได้ดังนี้
เข้าถึงคําสั่งใน 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 อื่น
ทั้งสองอย่างจะแสดงให้เห็นชัดเจน สลับระหว่าง 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
อีกครั้งจากบรรทัดคําสั่ง
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับหน้าจอ ให้ดูที่ข้อมูลอ้างอิงด่วนสําหรับหน้าจอ 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 ลงในเครือข่ายเทรดที่เราเพิ่งสร้างโดยใช้กระบวนการการคอมมิตนอกขอบเขต
ใน FTD Commissioner เราได้จดคีย์เครือข่ายไว้ เช่น 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" รอสักครู่ ตรวจสอบสถานะ 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
จดที่อยู่ Mesh-Local IPv6 (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
ที่นี่) ซึ่งคุณจะใช้ในภายหลัง
เปิดใช้ FTD Commissioner แล้วตรวจสอบเราเตอร์และตารางย่อยเพื่อยืนยันว่าอุปกรณ์ทั้งสองเป็นส่วนหนึ่งของเครือข่ายเดียวกัน ใช้ 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 (ที่อยู่ Mesh-Local ที่ได้รับจากเอาต์พุต ipaddr
ของตัวเชื่อม RCP) เพื่อยืนยันการเชื่อมต่อ ดังนี้
## 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 Commissioner สามารถระบุได้ ดังนี้
## 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 เริ่มต้นบทบาทผู้ผนวกด้วยข้อมูลเข้าสู่ระบบของผู้เข้าที่คุณเพิ่งตั้งค่าบน FTD Commissioner ดังนี้
## 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 ได้เชื่อมต่อกับเครือข่ายในฐานะอุปกรณ์ปิดท้าย (Child) ต่อไปนี้เป็นโทโพโลยีที่อัปเดตแล้วของเรา
10. การทํางานของชุดข้อความ
อุปกรณ์เทรดใน Codelab นี้เป็นอุปกรณ์เทรดเต็มรูปแบบ (FTD) ประเภทหนึ่งที่เรียกว่า End Screen สําหรับอุปกรณ์ที่ผ่านเกณฑ์ (REED) ซึ่งหมายความว่าสามารถทํางานได้เป็นเราเตอร์หรืออุปกรณ์ปลายทาง และโปรโมตตนเองจากอุปกรณ์ระดับบนไปยังเราเตอร์ได้
เทรดรองรับเราเตอร์ได้สูงสุด 32 รายการ แต่พยายามเก็บเราเตอร์ไว้ระหว่าง 16 ถึง 23 เราเตอร์ หาก REED แนบเป็นอุปกรณ์ปิดท้าย (Child) และจํานวนเราเตอร์ต่ํากว่า 16 หลังจากระยะเวลาแบบสุ่มภายในสองนาที จะเลื่อนระดับตัวเองไปยังเราเตอร์โดยอัตโนมัติ
หากคุณมีบุตรหลาน 2 คนในเครือข่ายชุดข้อความหลังจากเพิ่มตัวเชื่อม FTD แล้ว ให้รออย่างน้อย 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 (MAC แบบขยาย = e6cdd2d93249a243
) ได้โปรโมตตัวเองกับเราเตอร์ โปรดทราบว่า RLOC16 ต่างออกไป (b800
แทนที่จะเป็น 0c02
) นั่นเป็นเพราะ RLOC16 ยึดตามรหัสเราเตอร์และรหัสรองของอุปกรณ์ เมื่ออุปกรณ์เปลี่ยนจากเราเตอร์เป็นเราเตอร์ รหัสเราเตอร์และค่ารหัสเด็กจะเปลี่ยนแปลง RLOC16 ด้วย
ยืนยันสถานะใหม่และ RLOC16 บนตัวเชื่อม FTD ดังนี้
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
ดาวน์เกรดตัวเชื่อม FTD
คุณทดสอบลักษณะการทํางานนี้ได้ด้วยการดาวน์เกรดตัวเชื่อม FTD จากเราเตอร์กลับเป็นอุปกรณ์ปลายทางด้วยตนเอง เปลี่ยนสถานะเป็น "ย่อย" และตรวจสอบ RLOC16 ดังนี้
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
กลับไปที่ค่าคอมมิชชัน FTD ตัวเชื่อม FTD ควรปรากฏในตารางย่อย (รหัส = 3) ข้อมูลอาจมีลักษณะทั้งสองอย่างในขณะเปลี่ยน:
## 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 ให้ปิด "ชุดข้อความ" เพื่อนําออกจากเครือข่ายชุดข้อความ ดังนี้
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
ภายใน 2 นาที ตัวเชื่อม FTD จะเป็นผู้นําชุดข้อความใหม่ ตรวจสอบสถานะและที่อยู่ IPv6 ของตัวเชื่อม FTD เพื่อยืนยันดังนี้
## 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) ไปเป็นตัวเชื่อม FTD ซึ่งจะทําให้เกิด 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
คุณอาจต้องรอสัก 2-3 นาทีเพื่อให้ตัวเชื่อม RCP แนบกับตัวเชื่อม FTD แบบลูก ตรวจสอบสถานะและ RLOC16 เพื่อยืนยันว่า
## RCP Joiner ## -------------- > state child > rloc16 b801
เชื่อมต่อ FTD Commissioner อีกครั้ง
เครือข่ายชุดข้อความที่มี 2 โหนดไม่สนุกมากนัก เชิญ FTD Commissioner กลับมาออนไลน์อีกครั้ง
ใน FTD Commissioner ให้เริ่มชุดข้อความใหม่โดยทําดังนี้
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
ภายใน 2 นาที อุปกรณ์จะแนบไปกับเครือข่าย "codelab" โดยอัตโนมัติเป็นอุปกรณ์ปิดท้าย และประชาสัมพันธ์ตัวเองกับเราเตอร์
## FTD Commissioner ## ---------------------- > state router Done
ตรวจสอบตารางเราเตอร์และตารางย่อยในตัวเชื่อม FTD เพื่อยืนยันสิ่งต่อไปนี้
## 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. การใช้มัลติแคสต์
การใช้มัลติแคสต์เพื่อสื่อสารข้อมูลไปยังกลุ่มอุปกรณ์ได้พร้อมกัน ในเครือข่ายชุดข้อความ ระบบจะจองที่อยู่บางรายการไว้สําหรับมัลติแคสต์กับกลุ่มอุปกรณ์ต่างๆ โดยขึ้นอยู่กับขอบเขต
ที่อยู่ IPv6 | ขอบเขต | ส่งถึง |
| ลิงก์-ท้องถิ่น | FTD และ MED ทั้งหมด |
| ลิงก์-ท้องถิ่น | FTD และเราเตอร์ชายแดนทั้งหมด |
| ตาข่าย-ท้องถิ่น | FTD และ MED ทั้งหมด |
| ตาข่าย-ท้องถิ่น | FTD และเราเตอร์ชายแดนทั้งหมด |
เนื่องจากเราไม่ได้ใช้ Border Router ใน Codelab นี้ เรามาดู FTD กับที่อยู่ MED หลายรายการกัน
ลิงก์-ท้องถิ่น
ขอบเขตลิงก์ท้องถิ่นประกอบด้วยอินเทอร์เฟซเทรดทั้งหมดที่เข้าถึงได้โดยการส่งวิทยุหนึ่งครั้ง หรือ "ฮอป" เดียว โทโพโลยีเครือข่ายจะกําหนดอุปกรณ์ที่จะตอบสนองต่อคําสั่ง 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 และผู้เชื่อม RCP) แต่ผู้ออก FTD ได้รับคําตอบเพียง 1 รายการจากที่อยู่ลิงก์ในพื้นที่ของผู้ส่ง (LLA) ซึ่งหมายความว่าตัวเชื่อม FTD จะเป็นอุปกรณ์เดียวที่กรรมาธิการ 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 และที่อยู่ที่สอง (ลงท้ายด้วย 943b
) คือ LLA ของผู้เข้าร่วม RCP
ซึ่งหมายความว่าตัวเชื่อม FTD จะเชื่อมต่อกับทั้ง FTD Commissioner และ 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 ได้รับคําตอบ 2 คําตอบ คําตอบหนึ่งมาจาก Routing Locator (RLOC) ของ FTD Joiner (RLOC, ลงท้ายด้วย b800
) และข้อ 1 จาก RCP Joiner's Mesh-Local EID (ML-EID ที่ลงท้ายด้วย d55f
) เนื่องจากขอบเขต Mesh-local ประกอบด้วยเครือข่ายเทรดทั้งหมด ไม่ว่าอุปกรณ์จะอยู่ในเครือข่ายใด อุปกรณ์จะสมัครรับข้อมูลจากที่อยู่ ff03::1
ใช้คําสั่ง ping ff03::1
จากตัวเชื่อม FTD เพื่อยืนยันลักษณะการทํางานเดียวกัน ดังนี้
## 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 Commissioner (68 มิลลิวินาที) เมื่อเทียบกับตัวเชื่อม FTD (23 มิลลิวินาที) นั่นเป็นเพราะว่าต้องเดินทาง 2 ครั้งเพื่อเดินทางไปยังกรรมาธิการ FTD เมื่อเทียบกับ 1 ฮ็อปสําหรับผู้เข้าร่วม FTD
คุณอาจสังเกตเห็นว่า ping แบบมัลติแคสต์ของ Mesh-Local ตอบกลับด้วย RLOC เฉพาะสําหรับ FTD 2 รายการเท่านั้น ไม่ใช่ตัวเชื่อม RCP เนื่องจาก FTD เป็นเราเตอร์ภายในเครือข่าย ส่วน RCP คืออุปกรณ์ปลายทาง
ตรวจสอบสถานะของตัวเชื่อม RCP เพื่อยืนยัน
## RCP Joiner ## ---------------- > state child
13. ส่งข้อความด้วย UDP
หนึ่งในบริการแอปพลิเคชันที่ OpenThread ให้บริการคือ User Datagram Protocol (UDP) ซึ่งเป็นโปรโตคอล Transport Layer แอปพลิเคชันที่สร้างใน OpenThread สามารถใช้ UDP API เพื่อส่งข้อความระหว่างโหนดต่างๆ ในเครือข่าย Thread หรืออุปกรณ์อื่นๆ ในเครือข่ายภายนอกได้ (เช่น อินเทอร์เน็ต หากเครือข่าย Thread มีเราเตอร์ Border Router)
ซ็อกเก็ต UDP ถูกเปิดเผยผ่าน OpenThread CLI ใช้เพื่อส่งข้อความระหว่าง FTD ทั้งสองราย
รับที่อยู่ EID ของ Mesh-Local สําหรับตัวเชื่อม FTD เราใช้ที่อยู่นี้เพราะเข้าถึงได้จากทุกที่ภายในเครือข่ายชุดข้อความ
## 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 โดยใช้ ML-EID ดังนี้
## FTD Commissioner ## ---------------------- > udp open Done > udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212 Done
การเชื่อมต่อ UDP ควรอยู่ระหว่างโหนด 2 โหนด ส่งข้อความจาก FTD Commissioner:
## 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 โดยใช้ OpenThread Border Router และเชื่อมต่อเครือข่าย Thread กับอินเทอร์เน็ต
อ่านเพิ่มเติม
โปรดดู openthread.io และ GitHub สําหรับทรัพยากร OpenThread ที่หลากหลาย ซึ่งรวมถึง:
- แพลตฟอร์มที่รองรับ — ค้นหาแพลตฟอร์มทั้งหมดที่รองรับ OpenThread
- สร้าง OpenThread — รายละเอียดเพิ่มเติมเกี่ยวกับการสร้างและกําหนดค่า OpenThread
- Thread Primer — ครอบคลุมแนวคิดเทรดทั้งหมดที่แสดงใน Codelab นี้
ข้อมูลอ้างอิง: