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

1. บทนำ

26b7f4f6b3ea0700.png

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 ที่มีการเชื่อมต่อเดียวระหว่างกัน

6e3aa07675f902dc.png

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

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

d6a67e8a0d0b5dcb.png

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

  1. อินสแตนซ์ CLI ของอุปกรณ์ Thread จำลอง (โหนด 1)
  2. ot-daemon กระบวนการ
  3. อินสแตนซ์ ot-ctl CLI

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 ได้ที่แหล่งข้อมูลต่อไปนี้

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