การจำลองเครือข่ายเทรดโดยใช้ OpenThread ใน Docker

1. บทนำ

26b7f4f6b3ea0700.png

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) ที่มีจุดเชื่อมต่อเดียว

6e3aa07675f902dc.png

สร้างเครือข่าย

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 โหนดเช่นเดียวกับก่อนหน้านี้ สำหรับการตรวจสอบสิทธิ์ ตัวนำเทรดจะทำหน้าที่เป็นค่าคอมมิชชัน หรือเราเตอร์เทรดในฐานะผู้ผนวก

d6a67e8a0d0b5dcb.png

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 หน้าต่าง ซึ่งสอดคล้องกับเงื่อนไขต่อไปนี้

  1. อินสแตนซ์ CLI ของอุปกรณ์เทรดจำลอง (โหนด 1)
  2. ot-daemon กระบวนการ
  3. อินสแตนซ์ 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 ได้จากข้อมูลอ้างอิงต่อไปนี้

หรือลองใช้ OpenThread Border Router ในคอนเทนเนอร์ Docker