1. บทนำ
OpenThread ของ Google เป็นการใช้งานแบบโอเพนซอร์สของโปรโตคอลเครือข่าย Thread Google Nest ได้เปิดตัว OpenThread เพื่อทำให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมใช้งานในวงกว้างสำหรับนักพัฒนาซอฟต์แวร์เพื่อเร่งการพัฒนาผลิตภัณฑ์สำหรับบ้านที่เชื่อมต่อ
ข้อกำหนดของเทรดกำหนดโปรโตคอลการสื่อสารระหว่างอุปกรณ์ไร้สายที่เสถียร ปลอดภัย และใช้พลังงานต่ำ โดยใช้ IPv6 สำหรับแอปพลิเคชันในบ้าน OpenThread ใช้เลเยอร์เครือข่ายเทรดทั้งหมดซึ่งรวมถึง IPv6, 6LoWPAN, IEEE 802.15.4 ที่มีการรักษาความปลอดภัย MAC, Mesh Link Generatement และ Mesh Routing
Codelab นี้จะแนะนำการจำลองเครือข่ายเทรดในอุปกรณ์ที่จำลองโดยใช้ Docker
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่าเครื่องมือเชนบิลด์ของ OpenThread
- วิธีจำลองเครือข่ายเทรด
- วิธีตรวจสอบสิทธิ์โหนดเทรด
- วิธีจัดการเครือข่าย Thread ด้วย OpenThread Daemon
สิ่งที่ต้องมี
- Docker
- ความรู้พื้นฐานเกี่ยวกับ Linux, การกำหนดเส้นทางเครือข่าย
2. ตั้งค่า Docker
Codelab นี้ได้รับการออกแบบมาเพื่อใช้ Docker บนเครื่อง Linux, Mac OS X หรือ Windows Linux เป็นสภาพแวดล้อมที่แนะนำ
ติดตั้ง Docker
ติดตั้ง Docker ในระบบปฏิบัติการที่ต้องการ
ดึงอิมเมจ Docker
เมื่อติดตั้ง Docker แล้ว ให้เปิดหน้าต่างเทอร์มินัลและดึงอิมเมจ Docker openthread/environment
อิมเมจนี้มี OpenThread และ OpenThread Daemon ที่สร้างไว้ล่วงหน้าและพร้อมใช้งานสำหรับ Codelab นี้
$ docker pull openthread/environment:latest
โปรดทราบว่าการดาวน์โหลดอย่างสมบูรณ์อาจใช้เวลาสักครู่
ในหน้าต่างเทอร์มินัล ให้เริ่มคอนเทนเนอร์ Docker จากอิมเมจและเชื่อมต่อกับ Shell bash
โดยใช้คำสั่งต่อไปนี้
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
ตัวเลือก --rm
จะลบคอนเทนเนอร์เมื่อคุณออกจากคอนเทนเนอร์ อย่าใช้ตัวเลือกนี้หากคุณไม่ต้องการลบคอนเทนเนอร์
จดบันทึกแฟล็กที่จำเป็นสำหรับ Codelab นี้
--sysctl net.ipv6.conf.all.disable_ipv6=0
— เป็นการเปิดใช้งาน IPv6 ในคอนเทนเนอร์--cap-add=net_admin
— เปิดใช้ความสามารถของ NET_ADMIN ซึ่งจะช่วยให้เรียกใช้การดำเนินการที่เกี่ยวข้องกับเครือข่าย เช่น การเพิ่มเส้นทาง IP ได้
เมื่ออยู่ในคอนเทนเนอร์แล้ว คุณควรเห็นข้อความแจ้งในลักษณะนี้
root@c0f3912a74ff:/#
ในตัวอย่างด้านบน c0f3912a74ff
คือรหัสคอนเทนเนอร์ รหัสคอนเทนเนอร์สำหรับอินสแตนซ์ของคอนเทนเนอร์ Docker จะแตกต่างจากรหัสที่แสดงในข้อความแจ้งสำหรับ Codelab นี้
การใช้ Docker
Codelab นี้จะสมมติว่าคุณทราบพื้นฐานของการใช้ Docker คุณควรอยู่ในคอนเทนเนอร์ Docker ทั่วทั้ง Codelab
3. จำลองเครือข่ายเทรด
แอปพลิเคชันตัวอย่างที่คุณจะใช้สำหรับ Codelab นี้แสดงให้เห็นแอปพลิเคชัน OpenThread ที่เรียบง่ายซึ่งแสดงการกำหนดค่าและอินเทอร์เฟซการจัดการ OpenThread ผ่านอินเทอร์เฟซบรรทัดคำสั่ง (CLI)
แบบฝึกหัดนี้จะอธิบายขั้นตอนขั้นต่ำที่จำเป็นในการใช้คำสั่ง ping กับอุปกรณ์เทรดที่จำลองขึ้นมา 1 เครื่องจากอุปกรณ์เทรดจำลองเครื่องอื่น
ภาพด้านล่างอธิบายโทโพโลยีเครือข่ายเทรดพื้นฐาน สำหรับแบบฝึกหัดนี้ เราจะจำลองโหนด 2 โหนดภายในวงกลมสีเขียว ได้แก่ ตัวนำเทรดและเราเตอร์เทรด (Thread Router) ที่มีจุดเชื่อมต่อเดียว
สร้างเครือข่าย
1. เริ่มต้นโหนด 1
หากยังไม่ได้ดำเนินการ ให้เริ่มคอนเทนเนอร์ Docker ในหน้าต่างเทอร์มินัลแล้วเชื่อมต่อกับ Shell bash
โดยใช้คำสั่งต่อไปนี้
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
ในคอนเทนเนอร์ Docker ให้สร้างกระบวนการ CLI สำหรับอุปกรณ์เทรดที่จำลองโดยใช้ไบนารี ot-cli-ftd
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
หมายเหตุ: หากคุณไม่เห็นข้อความแจ้งเกี่ยวกับ >
หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
ไบนารีนี้ใช้อุปกรณ์ OpenThread ไดรเวอร์วิทยุ IEEE 802.15.4 จะทำงานบน UDP (เฟรม IEEE 802.15.4 จะส่งภายในเพย์โหลด UDP)
อาร์กิวเมนต์ของ 1
คือตัวบอกไฟล์ที่แสดงถึงบิตที่มีค่าน้อยที่สุดของ "กำหนดจากโรงงาน" IEEE EUI-64 สำหรับอุปกรณ์ที่จำลอง ค่านี้จะใช้เมื่อเชื่อมโยงกับพอร์ต UDP สำหรับการจำลองวิทยุ IEEE 802.15.4 (พอร์ต = 9000 + ข้อบ่งชี้ไฟล์) อินสแตนซ์แต่ละรายการของอุปกรณ์เทรดจำลองใน Codelab จะใช้ข้อบ่งชี้ไฟล์ที่แตกต่างกัน
หมายเหตุ: ใช้เฉพาะข้อบ่งชี้ไฟล์ตั้งแต่ 1
ขึ้นไปตามที่ระบุไว้ใน Codelab เมื่อสร้างกระบวนการสำหรับอุปกรณ์ที่จำลอง ตัวอธิบายไฟล์ของ 0
สงวนไว้สำหรับการใช้งานอื่น
สร้างชุดข้อมูลด้านการปฏิบัติงานใหม่และกำหนดให้เป็นชุดข้อมูลที่ใช้งานอยู่ ชุดข้อมูลการดำเนินการคือการกำหนดค่าสำหรับเครือข่ายเทรดที่คุณกำลังสร้าง
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่:
> dataset commit active Done
เรียกใช้อินเทอร์เฟซ IPv6:
> ifconfig up Done
เริ่มการดำเนินการโปรโตคอลเทรด:
> thread start Done
รอสักครู่และยืนยันว่าอุปกรณ์เป็นผู้นำเทรด Leader เป็นอุปกรณ์ที่รับผิดชอบในการจัดการการกำหนดรหัสเราเตอร์
> state leader Done
ดูที่อยู่ IPv6 ที่กำหนดให้กับอินเทอร์เฟซเทรดของโหนด 1 (เอาต์พุตของคุณจะแตกต่างออกไป)
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
โปรดทราบประเภทที่อยู่ IPv6 ต่อไปนี้
- ขึ้นต้นด้วย
fd
= Mesh-local - ขึ้นต้นด้วย
fe80
= link-local
ระบบจะจัดประเภทที่อยู่ในพื้นที่ทำงานร่วมกันเพิ่มเติมดังนี้
- มี
ff:fe00
= เครื่องระบุตำแหน่งเราเตอร์ (RLOC) - ไม่มี
ff:fe00
= ตัวระบุปลายทาง (EID)
ระบุ EID ในเอาต์พุตของคอนโซลแล้วจดบันทึกไว้ใช้ในภายหลัง ในเอาต์พุตตัวอย่างด้านบน EID คือ
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. เริ่มต้นโหนด 2
เปิดเทอร์มินัลใหม่และเรียกใช้ Shell bash
ในคอนเทนเนอร์ Docker ที่กำลังทำงานอยู่เพื่อใช้กับโหนด 2
$ docker exec -it codelab_otsim_ctnr bash
ในข้อความแจ้ง bash
ใหม่นี้ ให้สร้างกระบวนการ CLI ด้วยอาร์กิวเมนต์ 2
นี่คืออุปกรณ์เทรดจำลองเครื่องที่ 2 ของคุณ
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
หมายเหตุ: หากคุณไม่เห็นข้อความแจ้งเกี่ยวกับ >
หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
กำหนดค่าคีย์เครือข่ายเทรดและรหัส PAN โดยใช้ค่าเดียวกันกับชุดข้อมูลการดำเนินการของโหนด 1 ดังนี้
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่:
> dataset commit active Done
เรียกใช้อินเทอร์เฟซ IPv6:
> ifconfig up Done
เริ่มการดำเนินการโปรโตคอลเทรด:
> thread start Done
อุปกรณ์จะเริ่มต้นการทำงานเองในฐานะผู้เผยแพร่โฆษณาย่อย ผู้เผยแพร่โฆษณาย่อยเทรดเทียบเท่ากับอุปกรณ์ปลายทาง ซึ่งเป็นอุปกรณ์เทรดที่ส่งและรับการรับส่งข้อมูลแบบ Unicast ด้วยอุปกรณ์หลักเท่านั้น
> state child Done
คุณควรเห็นการเปลี่ยนสถานะจาก child
เป็น router
ภายใน 2 นาที เราเตอร์เทรดสามารถกำหนดเส้นทางการรับส่งข้อมูลระหว่างอุปกรณ์เทรด นอกจากนี้ยังเรียกว่า "ผู้เผยแพร่โฆษณาหลัก"
> state router Done
ยืนยันเครือข่าย
วิธีง่ายๆ ในการตรวจสอบเครือข่ายที่ทำงานร่วมกันคือการดูที่ตารางเราเตอร์
1. ตรวจสอบการเชื่อมต่อ
ในโหนด 2 ให้รับ RLOC16 RLOC16 คือ 16 บิตสุดท้ายของที่อยู่ RLOC IPv6 ของอุปกรณ์
> rloc16 5800 Done
ในโหนด 1 ให้ตรวจสอบตารางเราเตอร์สำหรับ RLOC16 ของโหนด 2 ตรวจสอบว่าโหนด 2 เปลี่ยนเป็นสถานะของเราเตอร์ก่อน
> router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+--------+-------+---+--------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
พบ RLOC ของ 0x5800
ของโหนด 2 ในตารางเพื่อยืนยันว่าโหนดเชื่อมต่อกับ Mesh
2. ปิงโหนด 1 จากโหนด 2
ยืนยันการเชื่อมต่อระหว่างอุปกรณ์เทรดจำลองทั้ง 2 เครื่อง ในโหนด 2 ping
EID ที่กำหนดให้กับโหนด 1:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
กด enter
เพื่อกลับไปยังพรอมต์ CLI ของ >
ทดสอบเครือข่าย
ตอนนี้คุณสามารถใช้คำสั่ง ping ระหว่างอุปกรณ์เทรดที่จำลอง 2 เครื่องได้สำเร็จ ให้ทดสอบเครือข่ายที่ทำงานร่วมกันโดยทำให้โหนดหนึ่งโหนดออฟไลน์
กลับไปที่โหนด 1 และหยุดเทรด:
> thread stop Done
เปลี่ยนไปใช้โหนด 2 และตรวจสอบสถานะ ภายใน 2 นาที โหนด 2 จะตรวจพบว่าตัวนำ (โหนด 1) ออฟไลน์อยู่ และคุณควรเห็นการเปลี่ยนโหนด 2 เป็น leader
ของเครือข่าย
> state router Done ... > state leader Done
เมื่อยืนยันแล้ว ให้หยุด Thread และรีเซ็ตโหนด 2 เป็นค่าเริ่มต้นก่อนที่จะออกกลับไปยังข้อความแจ้ง bash
ของ Docker มีการรีเซ็ตเป็นค่าเริ่มต้นเพื่อให้มั่นใจว่าข้อมูลเข้าสู่ระบบเครือข่ายเทรดที่เราใช้ในแบบฝึกหัดนี้จะไม่ถูกนำไปใช้ในแบบฝึกหัดครั้งถัดไป
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
คุณอาจต้องกด enter
2-3 ครั้งเพื่อนำข้อความแจ้ง >
กลับมาหลังจากคำสั่ง factoryreset
โปรดอย่าออกจากคอนเทนเนอร์ Docker
รีเซ็ตเป็นค่าเริ่มต้นและออกจากโหนด 1 ด้วย:
> factoryreset > > exit root@c0f3912a74ff:/#
ดูการอ้างอิง CLI ของ OpenThread เพื่อสำรวจคำสั่ง CLI ทั้งหมดที่มี
4. ตรวจสอบสิทธิ์โหนดด้วยการค่าคอมมิชชัน
ในแบบฝึกหัดก่อนหน้า คุณตั้งค่าเครือข่ายเทรดด้วยอุปกรณ์จำลอง 2 เครื่องและการเชื่อมต่อที่ยืนยันแล้ว อย่างไรก็ตาม วิธีนี้จะอนุญาตเฉพาะการรับส่งข้อมูลภายในลิงก์ของ IPv6 ที่ไม่ผ่านการตรวจสอบสิทธิ์เท่านั้นที่จะผ่านระหว่างอุปกรณ์ได้ ในการกำหนดเส้นทางการรับส่งข้อมูล IPv6 ทั่วโลกระหว่างโดเมน (และอินเทอร์เน็ตผ่าน Thread Border Router) โหนดจะต้องได้รับการตรวจสอบสิทธิ์
หากต้องการตรวจสอบสิทธิ์ อุปกรณ์ 1 เครื่องต้องทำหน้าที่เป็นค่าคอมมิชชัน Commissioner เป็นเซิร์ฟเวอร์การตรวจสอบสิทธิ์ที่ได้รับเลือกในปัจจุบันสำหรับอุปกรณ์เทรดใหม่ และผู้ให้สิทธิ์ระบุข้อมูลเข้าสู่ระบบเครือข่ายที่จำเป็นสำหรับอุปกรณ์เพื่อเข้าร่วมเครือข่าย
ในแบบฝึกหัดนี้ เราจะใช้โทโพโลยีแบบ 2 โหนดเช่นเดียวกับก่อนหน้านี้ สำหรับการตรวจสอบสิทธิ์ ตัวนำเทรดจะทำหน้าที่เป็นค่าคอมมิชชัน หรือเราเตอร์เทรดในฐานะผู้ผนวก
Docker
สำหรับโหนด (หน้าต่างเทอร์มินัล) แต่ละรายการในแบบฝึกหัดที่เหลือ ให้ตรวจสอบว่าคุณกำลังเรียกใช้คอนเทนเนอร์ Docker ด้วยบิลด์ OpenThread หากดำเนินการต่อจากแบบฝึกหัดก่อนหน้า คุณจะยังมีข้อความแจ้ง bash
2 รายการภายในคอนเทนเนอร์ Docker เดียวกันเปิดอยู่แล้ว หากไม่เห็น โปรดดูขั้นตอนการแก้ปัญหา Docker หรือทำซ้ำแบบฝึกหัดจำลองเครือข่ายเทรด
1. สร้างเครือข่าย
สร้างกระบวนการ CLI ในโหนด 1 ดังนี้
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
หมายเหตุ: หากคุณไม่เห็นข้อความแจ้งเกี่ยวกับ >
หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
สร้างชุดข้อมูลด้านการปฏิบัติงานใหม่ คอมมิตให้เป็นชุดข้อมูลที่ใช้งานอยู่ และเริ่มเทรด:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่:
> dataset commit active Done
เรียกใช้อินเทอร์เฟซ IPv6:
> ifconfig up Done
เริ่มการดำเนินการโปรโตคอลเทรด:
> thread start Done
รอสักครู่และตรวจสอบว่าอุปกรณ์กลายเป็น Thread Leader แล้ว
> state leader Done
2. เริ่มต้นบทบาทค่าคอมมิชชัน
ขณะที่ยังอยู่ในโหนด 1 ให้เริ่มบทบาทผู้ช่วยโดยดำเนินการดังนี้
> commissioner start Done
อนุญาตให้ Joiner ทั้งหมด (โดยใช้ไวลด์การ์ด *
) พร้อมข้อมูลเข้าสู่ระบบ Joiner J01NME
เพื่อคอมมิชชันไปยังเครือข่าย Joiner คืออุปกรณ์ที่เพิ่มโดยผู้ดูแลระบบที่เป็นมนุษย์ไปยังเครือข่ายเทรดที่ได้รับการว่าจ้าง
> commissioner joiner add * J01NME Done
3. เริ่มต้นบทบาทผู้เข้าร่วม
ในหน้าต่างเทอร์มินัลที่ 2 สร้างกระบวนการ CLI ใหม่ในคอนเทนเนอร์ Docker นี่คือโหนด 2
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
ในโหนด 2 ให้เปิดใช้บทบาทผู้ผสานโดยใช้ข้อมูลเข้าสู่ระบบของตัวเข้าร่วม J01NME
> ifconfig up Done > joiner start J01NME Done
... รอสักครู่เพื่อยืนยัน ...
Join success
ในฐานะ Joiner อุปกรณ์ (โหนด 2) ได้ตรวจสอบสิทธิ์ตัวเองกับ Commissioner (โหนด 1) เรียบร้อยแล้ว และได้รับข้อมูลรับรองเครือข่าย Thread
ตอนนี้โหนด 2 ได้รับการตรวจสอบแล้ว ให้เริ่มเทรด:
> thread start Done
4. ตรวจสอบการตรวจสอบสิทธิ์เครือข่าย
ตรวจสอบ state
ในโหนด 2 เพื่อยืนยันว่าได้เข้าร่วมเครือข่ายแล้ว โหนด 2 จะเปลี่ยนจาก child
เป็น router
ภายใน 2 นาที:
> state child Done ... > state router Done
5. รีเซ็ตการกำหนดค่า
โปรดรีเซ็ตการกำหนดค่าเพื่อเตรียมพร้อมสำหรับการออกกำลังกายถัดไป ในแต่ละโหนด ให้หยุด Thread รีเซ็ตเป็นค่าเริ่มต้น แล้วออกจากอุปกรณ์ Thread ที่จำลองขึ้น
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
คุณอาจต้องกด enter
2-3 ครั้งเพื่อนำข้อความแจ้ง >
กลับมาหลังจากคำสั่ง factoryreset
5. จัดการเครือข่ายด้วย OpenThread Daemon
สำหรับแบบฝึกหัดนี้ เราจะจำลองอินสแตนซ์ CLI (อุปกรณ์ SoC Thread แบบฝังเดี่ยว) และอินสแตนซ์ Radio Co-Processor (RCP) 1 อินสแตนซ์
ot-daemon
คือโหมดของแอป OpenThread Posix ที่ใช้ UNIX Socket เป็นอินพุตและเอาต์พุตเพื่อให้ OpenThread Core ทำงานเป็นบริการได้ ไคลเอ็นต์จะสื่อสารกับบริการนี้ได้โดยเชื่อมต่อกับซ็อกเก็ตโดยใช้ OpenThread CLI เป็นโปรโตคอล
ot-ctl
เป็น CLI จาก ot-daemon
เพื่อจัดการและกำหนดค่า RCP ด้วยการใช้วิธีนี้ เราจะเชื่อมต่อ RCP กับเครือข่ายที่สร้างโดยอุปกรณ์เทรด
Docker
สำหรับโหนดแต่ละรายการ (หน้าต่างเทอร์มินัล) ในแบบฝึกหัดนี้ ให้ตรวจสอบว่าคุณใช้คอนเทนเนอร์ Docker ที่มีบิลด์ OpenThread หากดำเนินการต่อจากแบบฝึกหัดก่อนหน้า คุณควรมีข้อความแจ้ง bash
2 รายการภายในคอนเทนเนอร์ Docker เดียวกันเปิดอยู่แล้ว หากไม่เห็น ให้ไปที่ขั้นตอนการแก้ปัญหา Docker
ใช้ ot-daemon
แบบฝึกหัดนี้จะใช้หน้าต่างเทอร์มินัล 3 หน้าต่าง ซึ่งสอดคล้องกับเงื่อนไขต่อไปนี้
- อินสแตนซ์ CLI ของอุปกรณ์เทรดจำลอง (โหนด 1)
ot-daemon
กระบวนการ- อินสแตนซ์ CLI
ot-ctl
รายการ
1. เริ่มต้นโหนด 1
ในหน้าต่างเทอร์มินัลแรก ให้สร้างกระบวนการ CLI สำหรับอุปกรณ์เทรดที่จำลองขึ้นมา
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
หมายเหตุ: หากคุณไม่เห็นข้อความแจ้งเกี่ยวกับ >
หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
สร้างชุดข้อมูลด้านการปฏิบัติงานใหม่ คอมมิตให้เป็นชุดข้อมูลที่ใช้งานอยู่ และเริ่มเทรด:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่:
> dataset commit active Done
เรียกใช้อินเทอร์เฟซ IPv6:
> ifconfig up Done
เริ่มการดำเนินการโปรโตคอลเทรด:
> thread start Done
ดูที่อยู่ IPv6 ที่กำหนดให้กับอินเทอร์เฟซเทรดของโหนด 1 ดังนี้
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
ตามที่อธิบายไว้ในขั้นตอนจำลองเครือข่ายเทรด ที่อยู่ 1 รายการคือลิงก์ภายใน (fe80
) และที่อยู่ 3 รายการเป็นแบบ Mesh ภายใน (fd
) EID คือที่อยู่ภายในที่ทำงานร่วมกัน ซึ่งไม่มี ff:fe00
ในที่อยู่ ในเอาต์พุตตัวอย่างนี้ EID คือ fd55:cf34:dea5:7994:460:872c:e807:c4ab
ระบุ EID ที่เฉพาะเจาะจงจากเอาต์พุต ipaddr
ซึ่งจะใช้ในการสื่อสารกับโหนด
2. เริ่มต้น ot-daemon
ในหน้าต่างเทอร์มินัลที่ 2 ให้สร้างโหนดอุปกรณ์ tun
และตั้งค่าสิทธิ์การอ่าน/เขียน ดังนี้
root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200 root@c0f3912a74ff:/# chmod 600 /dev/net/tun
อุปกรณ์นี้ใช้สำหรับการส่งและรับแพ็กเก็ตในอุปกรณ์เสมือน คุณอาจพบข้อผิดพลาดหากสร้างอุปกรณ์ไว้แล้ว ซึ่งเป็นเรื่องปกติและคุณไม่ต้องสนใจ
เริ่มต้น ot-daemon
สำหรับโหนด RCP ซึ่งเราเรียกว่าโหนด 2 ใช้แฟล็กแบบละเอียดของ -v
เพื่อให้คุณเห็นเอาต์พุตของบันทึกและยืนยันว่ากำลังทำงานอยู่
root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+forkpty:///openthread/build/examples/apps/ncp/ot-rcp?forkpty-arg=2'
เมื่อสําเร็จ ot-daemon
ในโหมดแบบละเอียดจะสร้างเอาต์พุตที่คล้ายกับตัวอย่างต่อไปนี้
ot-daemon[31]: Running OPENTHREAD/297a880; POSIX; Feb 1 2022 04:43:39 ot-daemon[31]: Thread version: 3 ot-daemon[31]: Thread interface: wpan0 ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb 1 2022 04:42:50
เปิดเทอร์มินัลนี้ทิ้งไว้และทำงานในเบื้องหลัง คุณไม่ต้องป้อนคำสั่งใดๆ เพิ่มเติม
3. ใช้ ot-ctl เพื่อเข้าร่วมเครือข่าย
เรายังไม่ได้มอบหมายโหนด 2 (RCP ของ ot-daemon
) ให้แก่เครือข่ายเทรด นี่คือสิ่งที่ ot-ctl
จะเข้ามาช่วย ot-ctl
ใช้ CLI เดียวกับแอป OpenThread CLI คุณจึงควบคุมโหนด ot-daemon
รายการได้ในลักษณะเดียวกันกับอุปกรณ์เทรดจำลองอื่นๆ
เปิดหน้าต่างเทอร์มินัลที่สามและเรียกใช้คอนเทนเนอร์ที่มีอยู่
$ docker exec -it codelab_otsim_ctnr bash
เมื่ออยู่ในคอนเทนเนอร์แล้ว ให้เริ่มot-ctl
:
root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl >
คุณจะใช้ ot-ctl
ในหน้าต่างเทอร์มินัลที่ 3 นี้เพื่อจัดการโหนด 2 (โหนด RCP) ที่เริ่มต้นในหน้าต่างเทอร์มินัลที่ 2 ด้วย ot-daemon
ตรวจสอบ state
ของโหนด 2:
> state disabled Done
รับ eui64
ของโหนด 2 เพื่อจำกัดการเข้าร่วมเฉพาะผู้ผนวกที่ระบุ
> eui64 18b4300000000001 Done
ในโหนด 1 (หน้าต่างเทอร์มินัลแรก) ให้เริ่มต้นค่าคอมมิชชันและจำกัดการเข้าร่วมเฉพาะ eui64 ดังกล่าวเท่านั้น
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
ในหน้าต่างเทอร์มินัลที่สาม ให้เปิดอินเทอร์เฟซเครือข่ายสำหรับโหนด 2 และเข้าร่วมเครือข่าย:
> ifconfig up Done > joiner start J01NME Done
... รอสักครู่เพื่อยืนยัน ...
Join success
ในฐานะ Joiner นั้น RCP (โหนด 2) ได้ตรวจสอบสิทธิ์ตัวเองกับ Commissioner (โหนด 1) เรียบร้อยแล้ว และได้รับข้อมูลรับรองเครือข่ายเทรด
จากนั้นรวมโหนด 2 กับเครือข่ายเทรด (อีกครั้งในหน้าต่างเทอร์มินัลที่สาม)
> thread start Done
4. ตรวจสอบการตรวจสอบสิทธิ์เครือข่าย
ในเทอร์มินัลที่ 3 ให้ตรวจสอบ state
ในโหนด 2 เพื่อยืนยันว่าได้เข้าร่วมเครือข่ายแล้ว โหนด 2 จะเปลี่ยนจาก child
เป็น router
ภายใน 2 นาที:
> state child Done ... > state router Done
5. ตรวจสอบการเชื่อมต่อ
ในหน้าต่างเทอร์มินัลที่ 3 ให้ออกจาก ot-ctl
โดยใช้คำสั่ง Ctrl+D หรือ exit
แล้วกลับไปที่คอนโซล bash
ของคอนเทนเนอร์ จากคอนโซลนี้ ใช้คำสั่ง ping โหนด 1 โดยใช้ EID พร้อมกับคำสั่ง ping6
หากอินสแตนซ์ RCP ot-daemon
เข้าร่วมและสื่อสารกับเครือข่ายเทรดได้สำเร็จ คําสั่ง ping จะสําเร็จดังนี้
root@c0f3912a74ff:/# ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
6. การแก้ปัญหา Docker
หากคุณออกจากคอนเทนเนอร์ Docker แล้ว
bash
ข้อความแจ้ง คุณอาจต้องตรวจสอบว่าการแจ้งเตือนทำงานอยู่หรือไม่ แล้วรีสตาร์ท / ป้อนอีกครั้งตามต้องการ คอนเทนเนอร์ Docker ที่คุณสร้างโดยที่ไม่ได้ใช้ตัวเลือก --rm
ควรยังคงอยู่
วิธีแสดงคอนเทนเนอร์ Docker ที่ทำงานอยู่
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
หากต้องการแสดงคอนเทนเนอร์ Docker ทั้งหมด (ทั้งที่ทำงานอยู่และหยุดทำงานแล้ว) ให้ทำดังนี้
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 505fc57ffc72 environment "bash" 10 minutes ago Up 10 minutes codelab_otsim_ctnr
หากไม่เห็นคอนเทนเนอร์ codelab_otsim_ctnr
ในเอาต์พุตของคำสั่ง docker ps
ใดคำสั่งหนึ่ง ให้เรียกใช้อีกครั้ง
$ docker run --name codelab_otsim_ctnr -it --rm \ --sysctl net.ipv6.conf.all.disable_ipv6=0 \ --cap-add=net_admin openthread/environment bash
ใช้ตัวเลือก --rm
เฉพาะในกรณีที่ต้องการให้ลบคอนเทนเนอร์เมื่อออกจากคอนเทนเนอร์เท่านั้น
หากคอนเทนเนอร์หยุดทำงาน (แสดงอยู่ใน docker ps -a
แต่ไม่ใช่ docker ps
) ให้รีสตาร์ทคอนเทนเนอร์ด้วยคำสั่งต่อไปนี้
$ docker start -i codelab_otsim_ctnr
หากคอนเทนเนอร์ Docker ทำงานอยู่ (แสดงอยู่ใน docker ps
) ให้เชื่อมต่อคอนเทนเนอร์ในแต่ละเทอร์มินัลอีกครั้ง ดังนี้
$ docker exec -it codelab_otsim_ctnr bash
"ไม่อนุญาตให้ดำเนินการ" ข้อผิดพลาด
หากคุณพบข้อผิดพลาด Operation not permitted
รายการเมื่อสร้างโหนด OpenThread ใหม่ (โดยใช้คำสั่ง mknod
) ให้ตรวจสอบว่าคุณกำลังเรียกใช้ Docker ในฐานะผู้ใช้รูทตามคำสั่งที่ระบุไว้ใน Codelab นี้ Codelab นี้ไม่รองรับการเรียกใช้ Docker ในโหมดไร้รูท
7. ยินดีด้วย
คุณจำลองเครือข่าย Thread แรกโดยใช้ OpenThread สำเร็จแล้ว ยอดเยี่ยม!
คุณได้เรียนรู้วิธีทำสิ่งต่อไปนี้ใน Codelab แล้ว
- เริ่มต้นและจัดการคอนเทนเนอร์ Docker ของ OpenThread Simulation Docker
- จำลองเครือข่ายเทรด
- ตรวจสอบสิทธิ์โหนดเทรด
- จัดการเครือข่าย Thread ด้วย OpenThread Daemon
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Thread และ OpenThread ได้จากข้อมูลอ้างอิงต่อไปนี้