1. บทนำ

OpenThread ที่ Google เปิดตัวเป็นการใช้งานโปรโตคอลเครือข่าย Thread แบบโอเพนซอร์ส Google Nest ได้เปิดตัว OpenThread เพื่อให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมให้บริการแก่นักพัฒนาซอฟต์แวร์อย่างกว้างขวางเพื่อเร่งการพัฒนาผลิตภัณฑ์สำหรับบ้านอัจฉริยะ
ข้อกำหนดของ Thread กำหนดโปรโตคอลการสื่อสารแบบไร้สายที่เชื่อถือได้ ปลอดภัย และใช้พลังงานต่ำจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งที่ใช้ IPv6 สำหรับแอปพลิเคชันในบ้าน OpenThread ใช้เลเยอร์เครือข่าย Thread ทั้งหมด ซึ่งรวมถึง IPv6, 6LoWPAN, IEEE 802.15.4 ที่มีการรักษาความปลอดภัย MAC, การสร้างลิงก์ Mesh และการกำหนดเส้นทาง Mesh
Codelab นี้จะแนะนำวิธีจำลองเครือข่าย Thread ในอุปกรณ์จำลองโดยใช้ Docker
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่าเครื่องมือเชนบิลด์ OpenThread
- วิธีจำลองเครือข่าย Thread
- วิธีตรวจสอบสิทธิ์โหนด Thread
- วิธีจัดการเครือข่าย Thread ด้วย OpenThread Daemon
สิ่งที่คุณต้องมี
- Docker
- ความรู้พื้นฐานเกี่ยวกับ Linux, การกำหนดเส้นทางเครือข่าย
2. ตั้งค่า Docker
Codelab นี้ออกแบบมาเพื่อใช้ Docker ในเครื่อง Linux, Mac OS X หรือ Windows เราขอแนะนำให้ใช้สภาพแวดล้อม Linux
ติดตั้ง Docker
ติดตั้ง Docker ในระบบปฏิบัติการที่คุณเลือก
ดึงอิมเมจ Docker
เมื่อติดตั้ง Docker แล้ว ให้เปิดหน้าต่างเทอร์มินัลและดึงopenthread/environmentอิมเมจ Docker รูปภาพนี้มี OpenThread และ OpenThread Daemon ที่สร้างไว้ล่วงหน้าและพร้อมใช้งานสำหรับ Codelab นี้
$ docker pull openthread/environment:latest
โปรดทราบว่าการดาวน์โหลดอาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์
ในหน้าต่างเทอร์มินัล ให้เริ่มคอนเทนเนอร์ Docker จากอิมเมจและเชื่อมต่อกับ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. จำลองเครือข่าย Thread
แอปพลิเคชันตัวอย่างที่คุณจะใช้ใน Codelab นี้แสดงแอปพลิเคชัน OpenThread ที่มีฟังก์ชันน้อยที่สุดซึ่งแสดงอินเทอร์เฟซการกำหนดค่าและการจัดการ OpenThread ผ่านอินเทอร์เฟซบรรทัดคำสั่ง (CLI) พื้นฐาน
แบบฝึกหัดนี้จะแนะนำขั้นตอนขั้นต่ำที่จำเป็นในการ Ping อุปกรณ์ Thread ที่จำลองเครื่องหนึ่งจากอุปกรณ์ Thread ที่จำลองอีกเครื่องหนึ่ง
รูปที่ด้านล่างอธิบายโทโพโลยีเครือข่าย Thread พื้นฐาน สำหรับการฝึกนี้ เราจะจำลองโหนด 2 โหนดภายในวงกลมสีเขียว ได้แก่ Thread Leader และ Thread Router ที่มีการเชื่อมต่อเดียวระหว่างกัน

สร้างเครือข่าย
1. เริ่มโหนด 1
หากยังไม่ได้ดำเนินการ ให้เริ่มคอนเทนเนอร์ Docker ในหน้าต่างเทอร์มินัล แล้วเชื่อมต่อกับเชลล์ 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 สำหรับอุปกรณ์ Thread ที่จำลองโดยใช้ไบนารี 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 + ตัวอธิบายไฟล์) อินสแตนซ์แต่ละรายการของอุปกรณ์ Thread ที่จำลองใน Codelab นี้จะใช้ตัวอธิบายไฟล์ที่แตกต่างกัน
หมายเหตุ: ใช้เฉพาะตัวอธิบายไฟล์ของ 1 ขึ้นไปตามที่ระบุไว้ใน Codelab นี้เมื่อสร้างกระบวนการสำหรับอุปกรณ์จำลอง ระบบสงวนตัวอธิบายไฟล์ของ 0 ไว้สำหรับการใช้งานอื่นๆ
สร้างชุดข้อมูลการดำเนินงานใหม่และส่งเป็นชุดข้อมูลที่ใช้งานอยู่ ชุดข้อมูลการทำงานคือการกำหนดค่าสำหรับเครือข่าย Thread ที่คุณสร้าง
> 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
> thread start Done
รอสักครู่แล้วตรวจสอบว่าอุปกรณ์ได้กลายเป็น Thread Leader แล้ว ผู้นำคืออุปกรณ์ที่มีหน้าที่จัดการการกำหนดรหัสเราเตอร์
> state leader Done
ดูที่อยู่ IPv6 ที่กำหนดให้กับอินเทอร์เฟซ Thread ของโหนด 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= ลิงก์เฉพาะ
ประเภทที่อยู่ภายใน Mesh จะได้รับการจัดประเภทเพิ่มเติมดังนี้
- มี
ff:fe00= ตัวระบุตำแหน่งเราเตอร์ (RLOC) - ไม่มี
ff:fe00= ตัวระบุปลายทาง (EID)
ระบุ EID ในเอาต์พุตของคอนโซลและจดบันทึกไว้เพื่อใช้ในภายหลัง ในเอาต์พุตตัวอย่างด้านบน EID คือ
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. เริ่มต้นโหนด 2
เปิดเทอร์มินัลใหม่และเรียกใช้ bash shell ในคอนเทนเนอร์ Docker ที่กำลังทำงานอยู่เพื่อใช้กับ Node 2
$ docker exec -it codelab_otsim_ctnr bash
ที่พรอมต์ bash ใหม่นี้ ให้เรียกใช้กระบวนการ CLI ด้วยอาร์กิวเมนต์ 2 นี่คืออุปกรณ์ Thread จำลองเครื่องที่ 2
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
หมายเหตุ: หากไม่เห็นข้อความแจ้ง > หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
กำหนดค่าคีย์เครือข่าย Thread และ PAN ID โดยใช้ค่าเดียวกับชุดข้อมูลการทำงานของโหนด 1 ดังนี้
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่
> dataset commit active Done
เปิดอินเทอร์เฟซ IPv6
> ifconfig up Done
เริ่มการดำเนินการโปรโตคอล Thread
> thread start Done
อุปกรณ์จะเริ่มต้นตัวเองเป็นอุปกรณ์ของเด็ก อุปกรณ์ย่อยของ Thread เทียบเท่ากับอุปกรณ์ปลายทาง ซึ่งเป็นอุปกรณ์ Thread ที่ส่งและรับการรับส่งข้อมูลแบบ Unicast กับอุปกรณ์หลักเท่านั้น
> state child Done
ภายใน 2 นาที คุณควรเห็นสถานะเปลี่ยนจาก child เป็น router เราเตอร์ Thread สามารถกำหนดเส้นทางการรับส่งข้อมูลระหว่างอุปกรณ์ Thread ได้ ซึ่งเรียกอีกอย่างว่า "ผู้ปกครอง"
> state router Done
ยืนยันเครือข่าย
วิธีง่ายๆ ในการยืนยันเครือข่าย Mesh คือการดูตารางเราเตอร์
1. ตรวจสอบการเชื่อมต่อ
รับ RLOC16 ในโหนด 2 RLOC16 คือ 16 บิตสุดท้ายของที่อยู่ IPv6 ของ RLOC ของอุปกรณ์
> 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. Ping โหนด 1 จากโหนด 2
ยืนยันการเชื่อมต่อระหว่างอุปกรณ์ Thread ที่จำลอง 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 ระหว่างอุปกรณ์ Thread ที่จำลอง 2 เครื่องได้แล้ว ให้ทดสอบเครือข่าย Mesh โดยนำโหนด 1 โหนดออกจากระบบ
กลับไปที่โหนด 1 แล้วหยุด Thread โดยทำดังนี้
> thread stop Done
เปลี่ยนไปใช้โหนด 2 แล้วตรวจสอบสถานะ ภายใน 2 นาที โหนด 2 จะตรวจพบว่าผู้นำ (โหนด 1) ออฟไลน์ และคุณควรเห็นโหนด 2 เปลี่ยนไปเป็นleaderของเครือข่าย
> state router Done ... > state leader Done
เมื่อได้รับการยืนยันแล้ว ให้หยุด Thread และรีเซ็ต Node 2 เป็นค่าเริ่มต้นก่อนออกจากพรอมต์ Docker bash การรีเซ็ตเป็นค่าเริ่มต้นจะช่วยให้มั่นใจได้ว่าข้อมูลเข้าสู่ระบบเครือข่าย Thread ที่เราใช้ในแบบฝึกหัดนี้จะไม่ถูกนำไปใช้ในแบบฝึกหัดถัดไป
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
คุณอาจต้องกด enter 2-3 ครั้งเพื่อเรียกพรอมต์ > กลับมาหลังจากใช้คำสั่ง factoryreset อย่าออกจากคอนเทนเนอร์ Docker
นอกจากนี้ ให้รีเซ็ตเป็นค่าเริ่มต้นและออกจากโหนด 1 โดยทำดังนี้
> factoryreset > > exit root@c0f3912a74ff:/#
ดูแหล่งอ้างอิง CLI ของ OpenThread เพื่อสำรวจคำสั่ง CLI ที่ใช้ได้ทั้งหมด
4. ตรวจสอบสิทธิ์โหนดด้วยการจัดสรร
ในแบบฝึกหัดก่อนหน้านี้ คุณได้ตั้งค่าเครือข่าย Thread ด้วยอุปกรณ์จำลอง 2 เครื่องและยืนยันการเชื่อมต่อ อย่างไรก็ตาม การดำเนินการนี้จะอนุญาตให้การรับส่งข้อมูล IPv6 แบบลิงก์เฉพาะที่ไม่ได้ตรวจสอบสิทธิ์ผ่านระหว่างอุปกรณ์เท่านั้น หากต้องการกำหนดเส้นทางการรับส่งข้อมูล IPv6 ทั่วโลกระหว่างอุปกรณ์ (และอินเทอร์เน็ตผ่าน Thread Border Router) คุณต้องตรวจสอบสิทธิ์โหนด
อุปกรณ์เครื่องหนึ่งต้องทำหน้าที่เป็นผู้ดูแลระบบเพื่อตรวจสอบสิทธิ์ คอมมิชชันเนอร์คือเซิร์ฟเวอร์การตรวจสอบสิทธิ์ที่ได้รับการเลือกตั้งในปัจจุบันสำหรับอุปกรณ์ Thread ใหม่ และผู้ให้สิทธิ์ในการระบุข้อมูลเข้าสู่ระบบเครือข่ายที่จำเป็นสำหรับอุปกรณ์ในการเข้าร่วมเครือข่าย
ในแบบฝึกหัดนี้ เราจะใช้โทโพโลยีแบบ 2 โหนดเหมือนเดิม สำหรับการตรวจสอบสิทธิ์ Thread Leader จะทำหน้าที่เป็น Commissioner และ Thread Router จะทำหน้าที่เป็น Joiner

Docker
สำหรับแต่ละโหนด (หน้าต่างเทอร์มินัล) ในแบบฝึกหัดที่เหลือ ให้ตรวจสอบว่าคุณกำลังเรียกใช้คอนเทนเนอร์ Docker ด้วยบิลด์ OpenThread หากทำต่อจากแบบฝึกหัดก่อนหน้า คุณควรเปิดพรอมต์ bash 2 รายการไว้ในคอนเทนเนอร์ Docker เดียวกัน หากไม่ ให้ดูขั้นตอนการแก้ปัญหา Docker หรือเพียงแค่ทำแบบฝึกหัดจำลองเครือข่าย Thread อีกครั้ง
1. สร้างเครือข่าย
ในโหนด 1 ให้เรียกใช้กระบวนการ CLI ดังนี้
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
หมายเหตุ: หากไม่เห็นข้อความแจ้ง > หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
สร้างชุดข้อมูลการปฏิบัติงานใหม่ ยืนยันให้เป็นชุดข้อมูลที่ใช้งานอยู่ และเริ่ม Thread โดยทำดังนี้
> 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
> thread start Done
รอสักครู่แล้วตรวจสอบว่าอุปกรณ์ได้กลายเป็น Thread Leader แล้วหรือไม่ โดยทำดังนี้
> state leader Done
2. เริ่มต้นบทบาทผู้ดูแลระบบ
ขณะที่ยังอยู่ในโหนด 1 ให้เริ่มบทบาทผู้ดูแลระบบโดยทำดังนี้
> commissioner start Done
อนุญาตให้ผู้เข้าร่วมทุกคน (โดยใช้ไวลด์การ์ด *) ที่มีJ01NME ข้อมูลเข้าสู่ระบบของผู้เข้าร่วมสามารถคอมมิชชันในเครือข่ายได้ Joiner คืออุปกรณ์ที่ผู้ดูแลระบบที่เป็นมนุษย์เพิ่มลงในเครือข่าย Thread ที่ได้รับมอบหมาย
> commissioner joiner add * J01NME Done
3. เริ่มบทบาทผู้เข้าร่วม
ในหน้าต่างเทอร์มินัลที่ 2 ในคอนเทนเนอร์ Docker ให้สร้างกระบวนการ CLI ใหม่ นี่คือโหนด 2
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2
ในโหนด 2 ให้เปิดใช้บทบาท Joiner โดยใช้J01NMEข้อมูลเข้าสู่ระบบ Joiner
> ifconfig up Done > joiner start J01NME Done
... รอสักครู่เพื่อรับการยืนยัน ...
Join success
ในฐานะอุปกรณ์ที่เข้าร่วม (โหนด 2) อุปกรณ์ได้ตรวจสอบสิทธิ์ตัวเองกับผู้ดูแลระบบ (โหนด 1) เรียบร้อยแล้ว และได้รับข้อมูลเข้าสู่ระบบเครือข่ายเทรด
ตอนนี้เมื่อตรวจสอบสิทธิ์โหนด 2 แล้ว ให้เริ่มเทรดโดยทำดังนี้
> thread start Done
4. ตรวจสอบการตรวจสอบสิทธิ์เครือข่าย
ตรวจสอบ state ในโหนด 2 เพื่อตรวจสอบว่าตอนนี้ได้เข้าร่วมเครือข่ายแล้ว ภายใน 2 นาที โหนด 2 จะเปลี่ยนจาก child เป็น router ดังนี้
> state child Done ... > state router Done
5. รีเซ็ตการกำหนดค่า
รีเซ็ตการกำหนดค่าเพื่อเตรียมพร้อมสำหรับแบบฝึกหัดถัดไป ในแต่ละโหนด ให้หยุด Thread รีเซ็ตเป็นค่าเริ่มต้น และออกจากอุปกรณ์ Thread ที่จำลอง
> thread stop Done > factoryreset > > exit root@c0f3912a74ff:/#
คุณอาจต้องกด enter 2-3 ครั้งเพื่อเรียกพรอมต์ > กลับมาหลังจากใช้คำสั่ง factoryreset
5. จัดการเครือข่ายด้วย OpenThread Daemon
สำหรับแบบฝึกหัดนี้ เราจะจำลองอินสแตนซ์ CLI 1 รายการ (อุปกรณ์ Thread SoC แบบฝังเดียว) และอินสแตนซ์ Radio Co-Processor (RCP) 1 รายการ
ot-daemon เป็นโหมดของแอป OpenThread Posix ที่ใช้ซ็อกเก็ต UNIX เป็นอินพุตและเอาต์พุต เพื่อให้แกนหลักของ OpenThread ทำงานเป็นบริการได้ ไคลเอ็นต์สามารถสื่อสารกับบริการนี้ได้โดยเชื่อมต่อกับซ็อกเก็ตโดยใช้ OpenThread CLI เป็นโปรโตคอล
ot-ctl คือ CLI ที่ ot-daemon จัดเตรียมไว้ให้เพื่อจัดการและกำหนดค่า RCP เราจะใช้สิ่งนี้เพื่อเชื่อมต่อ RCP กับเครือข่ายที่สร้างโดยอุปกรณ์ Thread
Docker
สำหรับแต่ละโหนด (หน้าต่างเทอร์มินัล) ในแบบฝึกหัดนี้ ให้ตรวจสอบว่าคุณกำลังเรียกใช้คอนเทนเนอร์ Docker ด้วยบิลด์ OpenThread หากทำต่อจากแบบฝึกหัดก่อนหน้า คุณควรเปิดbashพรอมต์ 2 รายการภายในคอนเทนเนอร์ Docker เดียวกันอยู่แล้ว หากไม่ ให้ดูขั้นตอนการแก้ปัญหา Docker
ใช้ ot-daemon
แบบฝึกหัดนี้จะใช้หน้าต่างเทอร์มินัล 3 หน้าต่าง ซึ่งสอดคล้องกับรายการต่อไปนี้
- อินสแตนซ์ CLI ของอุปกรณ์ Thread จำลอง (โหนด 1)
ot-daemonprocess- อินสแตนซ์
ot-ctlCLI
1. เริ่มโหนด 1
ในหน้าต่างเทอร์มินัลแรก ให้สร้างกระบวนการ CLI สำหรับอุปกรณ์ Thread ที่จำลองขึ้น
root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1
หมายเหตุ: หากไม่เห็นข้อความแจ้ง > หลังจากเรียกใช้คำสั่งนี้ ให้กด enter
สร้างชุดข้อมูลการปฏิบัติงานใหม่ ยืนยันให้เป็นชุดข้อมูลที่ใช้งานอยู่ และเริ่ม Thread โดยทำดังนี้
> 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
> thread start Done
ดูที่อยู่ IPv6 ที่กำหนดให้กับอินเทอร์เฟซ Thread ของโหนด 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 >
ดังที่อธิบายไว้ในขั้นตอนจำลองเครือข่าย Thread ที่อยู่หนึ่งเป็นแบบลิงก์เฉพาะที่ (fe80) และอีก 3 รายการเป็นแบบเมชเฉพาะที่ (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 verbose flag เพื่อให้คุณเห็นเอาต์พุตบันทึกและยืนยันว่ากำลังทำงานอยู่
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 เพื่อเข้าร่วมเครือข่าย
เรายังไม่ได้มอบหมายให้ Node 2 (ot-daemon RCP) ทำงานในเครือข่าย Thread ใดๆ ot-ctl จึงเข้ามามีบทบาทในจุดนี้ ot-ctl ใช้ CLI เดียวกันกับแอป OpenThread CLI คุณจึงควบคุมโหนด ot-daemon ได้ในลักษณะเดียวกับอุปกรณ์ Thread อื่นๆ ที่จำลอง
เปิดหน้าต่างเทอร์มินัลที่ 3 แล้วเรียกใช้คอนเทนเนอร์ที่มีอยู่
$ 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 ของ Node 2 เพื่อจำกัดการเข้าร่วมเฉพาะผู้เข้าร่วมที่ต้องการ
> eui64 18b4300000000001 Done
ในโหนด 1 (หน้าต่างเทอร์มินัลแรก) ให้เริ่ม Commissioner และจำกัดการเข้าร่วมเฉพาะ eui64 นั้น
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
ในหน้าต่างเทอร์มินัลที่ 3 ให้เปิดอินเทอร์เฟซเครือข่ายสำหรับโหนด 2 แล้วเข้าร่วมเครือข่าย
> ifconfig up Done > joiner start J01NME Done
... รอสักครู่เพื่อรับการยืนยัน ...
Join success
ในฐานะอุปกรณ์ที่เข้าร่วม RCP (โหนด 2) ได้ตรวจสอบสิทธิ์ของตัวเองกับ Commissioner (โหนด 1) เรียบร้อยแล้ว และได้รับข้อมูลเข้าสู่ระบบเครือข่าย Thread
ตอนนี้ให้เข้าร่วมโหนด 2 กับเครือข่าย Thread (อีกครั้งในหน้าต่างเทอร์มินัลที่ 3)
> thread start Done
4. ตรวจสอบการตรวจสอบสิทธิ์เครือข่าย
ในเทอร์มินัลที่ 3 ให้ตรวจสอบ state ในโหนด 2 เพื่อตรวจสอบว่าตอนนี้ได้เข้าร่วมเครือข่ายแล้ว ภายใน 2 นาที โหนด 2 จะเปลี่ยนจาก child เป็น router ดังนี้
> state child Done ... > state router Done
5. ตรวจสอบการเชื่อมต่อ
ในหน้าต่างเทอร์มินัลที่ 3 ให้ออกจาก ot-ctl โดยใช้ Ctrl+D หรือคำสั่ง exit แล้วกลับไปที่คอนโซล bash ของคอนเทนเนอร์ จากคอนโซลนี้ ให้ Ping โหนด 1 โดยใช้ EID ของโหนดด้วยคำสั่ง ping6 หากot-daemonอินสแตนซ์ RCP เข้าร่วมและสื่อสารกับเครือข่าย Thread ได้สำเร็จ การ 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
- จำลองเครือข่าย Thread
- ตรวจสอบสิทธิ์โหนด Thread
- จัดการเครือข่าย Thread ด้วย OpenThread Daemon
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Thread และ OpenThread ได้ที่แหล่งข้อมูลต่อไปนี้