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 บิลด์ Toolchain
- วิธีจำลองเครือข่าย 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
โปรดทราบว่าการดาวน์โหลดอาจใช้เวลา 2-3 นาที
ในหน้าต่างเทอร์มินัล ให้เริ่มคอนเทนเนอร์ 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 จะลบคอนเทนเนอร์เมื่อคุณออกจากคอนเทนเนอร์ โปรดอย่าใช้ตัวเลือกนี้หากไม่ต้องการให้ระบบลบคอนเทนเนอร์
โปรดทราบว่าต้องใช้ Flag ต่อไปนี้สำหรับ 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 และ Mesh Extender ที่มีการเชื่อมต่อเดียวระหว่างกัน

สร้างเครือข่าย
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= Router Locator (RLOC) - ไม่มี
ff:fe00= ตัวระบุปลายทาง (EID)
ระบุ EID ในเอาต์พุตของคอนโซลและจดบันทึกไว้เพื่อใช้ในภายหลัง ในเอาต์พุตตัวอย่างด้านบน EID คือ
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. เริ่มต้นโหนด 2
เปิดเทอร์มินัลใหม่และเรียกใช้bashเชลล์ในคอนเทนเนอร์ 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 Mesh Extender สามารถกำหนดเส้นทางการรับส่งข้อมูลระหว่างอุปกรณ์ Thread ได้ หรือที่เรียกว่า "ผู้ปกครอง"
> state router Done
ยืนยันเครือข่าย
วิธีง่ายๆ ในการยืนยันเครือข่ายที่ทำงานร่วมกันคือการดูตารางเราเตอร์
1. ตรวจสอบการเชื่อมต่อ
ในโหนด 2 ให้รับ RLOC16 RLOC16 คือ 16 บิตสุดท้ายของที่อยู่ IPv6 ของ RLOC ของอุปกรณ์
> rloc16 5800 Done
ในโหนด 1 ให้ตรวจสอบตารางเราเตอร์สำหรับ RLOC16 ของโหนด 2 ตรวจสอบว่า Node 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 เครื่องได้แล้ว ให้ทดสอบเครือข่ายที่ทำงานร่วมกันโดยนำโหนด 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 และ Mesh Extender จะทำหน้าที่เป็น 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) เรียบร้อยแล้ว และได้รับข้อมูลเข้าสู่ระบบเครือข่าย Thread
ตอนนี้เมื่อตรวจสอบสิทธิ์โหนด 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-daemonกระบวนการ- อินสแตนซ์
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 เพื่อให้คุณเห็นเอาต์พุตบันทึกและยืนยันว่ากำลังทำงานอยู่
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 (หน้าต่างเทอร์มินัลแรก) ให้เริ่มคอมมิชชันเนอร์และจำกัดการเข้าร่วมเฉพาะ 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
ตอนนี้ให้เข้าร่วม Node 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 ได้ที่แหล่งข้อมูลต่อไปนี้