การจําลองเครือข่ายชุดข้อความโดยใช้ OpenThread ใน Docker

1. ข้อมูลเบื้องต้น

26b7f4f6b3ea0700.png

OpenThread ที่เผยแพร่โดย Google เป็นการใช้งานโปรโตคอลโอเพนซอร์สสําหรับเครือข่าย Thread Google Nest ได้เปิดตัว OpenThread เพื่อทําให้เทคโนโลยีที่ใช้ในผลิตภัณฑ์ Nest พร้อมใช้งานอย่างกว้างขวางสําหรับนักพัฒนาซอฟต์แวร์ เพื่อเร่งการพัฒนาผลิตภัณฑ์สําหรับบ้านที่เชื่อมต่อ

ข้อมูลจําเพาะของชุดข้อความกําหนดโปรโตคอลการสื่อสารระหว่างอุปกรณ์ไร้สายที่เชื่อถือได้และมีความปลอดภัยตามมาตรฐาน IPv6 สําหรับแอปพลิเคชันในบ้าน OpenThread ใช้ Thread Network Layer ทั้งหมด ซึ่งรวมถึง IPv6, 6LoWPAN, IEEE 802.15.4 พร้อมระบบ MAC, การสร้าง Mesh Link และ Mesh Routing

Codelab นี้จะแนะนําการจําลองเครือข่าย Thread ในอุปกรณ์ที่จําลองโดยใช้ Docker

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่าห่วงโซ่เครื่องมือบิวด์ของ OpenThread
  • วิธีจําลองเครือข่ายเทรด
  • วิธีตรวจสอบสิทธิ์โหนดชุดข้อความ
  • วิธีจัดการเครือข่ายเทรดด้วย 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

โปรดทราบว่าการดาวน์โหลดอาจใช้เวลา 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 จะลบคอนเทนเนอร์เมื่อคุณออกจากคอนเทนเนอร์ โปรดอย่าใช้ตัวเลือกนี้หากไม่ต้องการให้ลบคอนเทนเนอร์

จดบันทึกแฟล็กที่จําเป็นสําหรับ 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 Leader และ Thread Router ที่มีเส้นเชื่อมต่อ 1 เส้นระหว่างกัน

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 สําหรับอุปกรณ์เธรดที่จําลองโดยใช้ไบนารี 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 สงวนไว้สําหรับการใช้งานอื่นๆ

สร้างชุดข้อมูลการดําเนินการใหม่และคอมมิตเป็นชุดข้อมูลที่ทํางานอยู่ ชุดข้อมูลการดําเนินการคือการกําหนดค่าสําหรับเครือข่ายเทรดที่คุณกําลังสร้าง

> 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

รอสักครู่และตรวจสอบว่าอุปกรณ์เป็นผู้นําชุดข้อความแล้ว ตัวแปรหลักคืออุปกรณ์ที่รับผิดชอบในการจัดการการกําหนดรหัสเราเตอร์

> 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

ประเภทที่อยู่ Mesh-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 นี่คืออุปกรณ์เธรดที่จําลองที่สอง:

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

อุปกรณ์จะตั้งตัวเองเป็นเด็ก Thread Child มีค่าเท่ากับอุปกรณ์ปลายทาง ซึ่งเป็นอุปกรณ์เทรดที่ส่งและรับการรับส่งข้อมูล 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 ของโหนด 2 ของ 0x5800 ในตารางที่ยืนยันว่าเชื่อมต่อกับ Mesh แล้ว

2. ใช้คําสั่ง ping กับโหนด 1 จากโหนด 2

ยืนยันการเชื่อมต่อระหว่างอุปกรณ์เธรดที่จําลอง 2 ชุด ในโหนดที่ 2 pingEID ที่กําหนดให้กับโหนด 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 โหนดมาใช้แบบออฟไลน์

กลับไปที่โหนด 1 และหยุดชุดข้อความ:

> thread stop
Done

เปลี่ยนไปใช้โหนด 2 และตรวจสอบสถานะ ภายใน 2 นาที โหนด 2 ตรวจพบว่าผู้นํา (โหนด 1) ออฟไลน์อยู่ และคุณควรเห็นการเปลี่ยนโหนด 2 เป็น leader ของเครือข่าย

> state
router
Done
...
> state
leader
Done

เมื่อยืนยันแล้ว ให้หยุดชุดข้อความและรีเซ็ตโหนด 2 เป็นค่าเริ่มต้นก่อนที่จะออกไปยังข้อความแจ้งของ Docker bash ระบบจะรีเซ็ตข้อมูลเป็นค่าเริ่มต้นเพื่อให้แน่ใจว่าจะไม่มีการอัปเดตข้อมูลเข้าสู่ระบบเครือข่ายเทรดที่เราใช้ในการฝึกครั้งถัดไป

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

คุณอาจต้องกด enter 2-3 ครั้งเพื่อนําข้อความแจ้ง > กลับมาหลังคําสั่ง factoryreset อย่าออกจากคอนเทนเนอร์ Docker

รีเซ็ตเป็นค่าเริ่มต้นและออกจากโหนด 1

> factoryreset
>
> exit
root@c0f3912a74ff:/#

โปรดดูที่ OpenThread CLI Reference เพื่อดูคําสั่ง CLI ที่มีทั้งหมด

4. ตรวจสอบสิทธิ์โหนดด้วยค่าคอมมิชชัน

ในแบบฝึกหัดก่อนหน้า คุณจะต้องตั้งค่าเครือข่ายเทรดด้วยอุปกรณ์จําลอง 2 เครื่องและการเชื่อมต่อที่ได้รับการยืนยัน อย่างไรก็ตาม การดําเนินการนี้จะอนุญาตให้มีการส่งผ่านลิงก์เฉพาะ IPv6 ที่ไม่ผ่านการตรวจสอบสิทธิ์ระหว่างอุปกรณ์เท่านั้น ในการกําหนดเส้นทางการรับส่งข้อมูล IPv6 ระหว่างกัน (และอินเทอร์เน็ตผ่านเราเตอร์ Thread Border) จะต้องมีการตรวจสอบสิทธิ์โหนด

อุปกรณ์ 1 เครื่องต้องทําหน้าที่เป็นเจ้าหน้าที่เพื่อที่จะตรวจสอบสิทธิ์ ค่าคอมมิชชันคือเซิร์ฟเวอร์การตรวจสอบสิทธิ์ที่ได้รับเลือกในปัจจุบันสําหรับอุปกรณ์เทรดใหม่ รวมถึงผู้ให้สิทธิ์ในการจัดทําข้อมูลรับรองเครือข่ายเพื่อให้อุปกรณ์เข้าร่วมเครือข่าย

ในแบบฝึกหัดนี้ เราจะใช้โทโพโลยีแบบ 2 โหนดแบบเดียวกับก่อนหน้านี้ สําหรับผู้นํา Threader Leader จะทําหน้าที่เป็น Commissioner หรือ Thread Router ในฐานะผู้เชื่อม

d6a67e8a0d0b5dcb.png

Docker

สําหรับโหนด (หน้าต่างเทอร์มินัล) แต่ละรายการในแบบฝึกหัดที่เหลือ ให้ตรวจสอบว่าคุณใช้คอนเทนเนอร์ Docker ที่มีบิวด์ OpenThread อยู่ หากทําแบบฝึกหัดก่อนหน้าต่อ คุณยังควรมีข้อความแจ้ง bash สองรายการภายในคอนเทนเนอร์ Docker เดียวกันเปิดอยู่แล้ว ถ้าไม่ได้ใช้ โปรดดูขั้นตอนการแก้ปัญหาเกี่ยวกับ Docker หรือทําซ้ําแบบจําลองเครือข่ายเทรด

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

ในโหนด 1 ให้สร้างกระบวนการ CLI:

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

รอสักครู่และตรวจสอบว่าอุปกรณ์เป็นผู้นําชุดข้อความไปแล้ว

> state
leader
Done

2. เริ่มบทบาทค่าคอมมิชชัน

ขณะที่ยังอยู่บนโหนด 1 ให้เริ่มบทบาทค่าคอมมิชชัน:

> commissioner start
Done

อนุญาตให้ตัวเชื่อม (โดยใช้ไวลด์การ์ด *) ด้วยข้อมูลเข้าสู่ระบบตัวเชื่อม J01NME เพื่อกําหนดค่าคอมมิชชันให้กับเครือข่าย ตัวเชื่อมเป็นอุปกรณ์ที่ผู้ดูแลระบบที่เป็นมนุษย์เพิ่มเข้ามาในเครือข่ายเทรดค่าคอมมิชชัน

> commissioner joiner add * J01NME
Done

3. เริ่มบทบาทผู้เชื่อม

ในหน้าต่างเทอร์มินัล 2 ในคอนเทนเนอร์ Docker จะสร้างกระบวนการ CLI ใหม่ นี่คือโหนด 2

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

ในโหนด 2 ให้เปิดใช้บทบาทตัวเชื่อมโดยใช้ข้อมูลรับรองตัวเชื่อม J01NME

> 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 stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

คุณอาจต้องกด enter 2-3 ครั้งเพื่อนําข้อความแจ้ง > กลับมาหลังคําสั่ง factoryreset

5. จัดการเครือข่ายด้วย OpenThread Daemon

สําหรับแบบฝึกหัดนี้ เราจะจําลองอินสแตนซ์ CLI 1 อินสแตนซ์ (อุปกรณ์ SoC เทรดที่ฝังอยู่) และอินสแตนซ์ Radio Co-Processor (RCP) 1 อินสแตนซ์

ot-daemon คือโหมดของแอป OpenThread Posix ที่ใช้ซ็อกเก็ต UNIX เป็นอินพุตและเอาต์พุต เพื่อให้แกน OpenOpen ทํางานเป็นบริการ ไคลเอ็นต์สื่อสารกับบริการนี้ได้โดยเชื่อมต่อกับซ็อกเก็ตโดยใช้ 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-Local (fd) EID คือที่อยู่ Mesh-Local ที่ไม่มี ff:fe00 ในที่อยู่ ในเอาต์พุตตัวอย่างนี้ EID คือ fd55:cf34:dea5:7994:460:872c:e807:c4ab

ระบุ EID ที่เฉพาะเจาะจงจากเอาต์พุต ipaddr ซึ่งจะใช้เพื่อสื่อสารกับโหนด

2. เริ่ม Od-ememon

ในหน้าต่างเทอร์มินัลที่สอง ให้สร้างโหนดอุปกรณ์ 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 ได้เหมือนกับอุปกรณ์ Thread อื่นๆ ที่จําลองขึ้นมา

เปิดหน้าต่างเทอร์มินัลที่สามและเรียกใช้คอนเทนเนอร์ที่มีอยู่:

$ 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

ในฐานะผู้เข้าร่วม RCP (Node 2) ได้ตรวจสอบสิทธิ์ตัวเองกับ Commissioner (Node 1) และได้รับข้อมูลรับรอง Thread Network เรียบร้อยแล้ว

จากนั้นเข้าร่วมโหนด 2 กับเครือข่ายชุดข้อความ (ในหน้าต่างเทอร์มินัลที่สามอีกครั้ง)

> thread start
Done

4. ตรวจสอบการตรวจสอบสิทธิ์เครือข่าย

ในเทอร์มินัลที่ 3 ให้ตรวจสอบ state ในโหนด 2 เพื่อยืนยันว่าเข้าร่วมเครือข่ายแล้ว ภายใน 2 นาที โหนด 2 เปลี่ยนจาก child เป็น router:

> state
child
Done
...
> state
router
Done

5. ตรวจสอบการเชื่อมต่อ

ในหน้าต่างเทอร์มินัลที่สาม ให้ออกจาก ot-ctl โดยใช้คําสั่ง Ctrl+D หรือ exit แล้วกลับไปที่คอนโซล bash ของคอนเทนเนอร์ จากคอนโซลนี้ ให้ใช้คําสั่ง ping กับโหนด 1 โดยใช้ EID กับคําสั่ง ping6 ถ้าอินสแตนซ์ ot-daemon ของ RCP เข้าร่วมและสื่อสารกับเครือข่ายเทรดสําเร็จแล้ว จะได้รับคําสั่ง 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. ยินดีด้วย

คุณได้จําลองเครือข่ายเทรดแรกสําเร็จแล้วโดยใช้ OpenThread ยอดเยี่ยม

ใน Codelab นี้ คุณได้เรียนรู้วิธีการต่อไปนี้

  • เริ่มต้นและจัดการคอนเทนเนอร์ Docker การจําลอง OpenThread
  • จําลองเครือข่ายเทรด
  • ตรวจสอบโหนดชุดข้อความ
  • จัดการเครือข่ายเทรดด้วย OpenThread Daemon

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับชุดข้อความและ OpenThread ให้ดูข้อมูลอ้างอิงเหล่านี้

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