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

1. บทนำ

26b7f4f6b3ea0700.png

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

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

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

แจ้งการติดธง ซึ่งจําเป็นสําหรับ 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 กับอุปกรณ์เทรดจําลองที่จําลองมาจากอุปกรณ์เทรดอีกชุดหนึ่ง

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

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

สร้างกระบวนการ CLI สําหรับอุปกรณ์ เทรดจําลองที่จําลองโดยใช้คอนเทนเนอร์ Docker โดยใช้ไบนารี 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 คือตัวบ่งชี้ไฟล์ที่แสดงถึงบิตที่สําคัญที่สุดของ "Factory-assigned" 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

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

> state
leader
Done

ดูที่อยู่ IPv6 ที่กําหนดให้กับอินเทอร์เฟซชุดข้อความของโหนด 1&#39 (เอาต์พุตของคุณจะแตกต่างออกไป)

> 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 = ตัวระบุตําแหน่งเราเตอร์ (RSAOC)
  • ไม่มี 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&#39

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

กําหนดให้ชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่:

> dataset commit active
Done

วิธีแสดงอินเทอร์เฟซ IPv6

> ifconfig up
Done

การดําเนินการโปรโตคอลชุดข้อความเริ่มต้น:

> thread start
Done

อุปกรณ์จะเริ่มต้นเป็นเด็ก Child Child จะเทียบเท่ากับอุปกรณ์ปลายทาง ซึ่งเป็นอุปกรณ์ชุดข้อความที่ส่งและได้รับการเข้าชม Unicast ด้วยอุปกรณ์ของผู้ปกครองเท่านั้น

> state
child
Done

คุณจะเห็นการเปลี่ยนสถานะจาก child เป็น router ภายใน 2 นาที เราเตอร์เทรดสามารถกําหนดเส้นทางการรับส่งข้อมูลระหว่างอุปกรณ์เทรดได้ หรือเรียกว่าผู้เผยแพร่โฆษณาหลัก

> state
router
Done

ยืนยันเครือข่าย

วิธีง่ายๆ ในการยืนยันเครือข่ายที่ทํางานร่วมกันคือการดูตารางเราเตอร์

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

ในโหนด 2 ให้ดาวน์โหลด RSAOC16 RSAOC16 คือ 16 บิตสุดท้ายของที่อยู่ RSAOC IPv6 ของอุปกรณ์

> rloc16
5800
Done

ในโหนด 1 ให้ตรวจสอบตารางเราเตอร์สําหรับ โหนด 2&#39 RSAOC16 ตรวจสอบว่าโหนด 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 |

พบ RSAOC ของโหนด 2&#39 จาก 0x5800 ในตาราง ซึ่งยืนยันว่าเชื่อมต่อกับ Mesh

2. โหนด Ping 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 โหนดออฟไลน์

กลับไปที่โหนด 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:/#

ดูการอ้างอิง CLI ของ OpenThread เพื่อสํารวจคําสั่ง CLI ที่มีทั้งหมด

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

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

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

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

d6a67e8a0d0b5dcb.png

Docker

สําหรับโหนดแต่ละโหนด (หน้าต่างเทอร์มินัล) ในแบบฝึกหัดที่เหลือ โปรดตรวจสอบว่าคุณเรียกใช้คอนเทนเนอร์ Docker ที่มีบิลด์ OpenThread แล้ว หากดําเนินการต่อจากการออกกําลังกายก่อนหน้า คุณควรมีข้อความแจ้งของ bash 2 รายการภายในคอนเทนเนอร์ 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 ให้สร้างกระบวนการ 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

ในฐานะอุปกรณ์เชื่อมโยง อุปกรณ์ (โหนด 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 แบบฝัง 1 รายการ) และอินสแตนซ์ 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&#39:

> 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
>

ตามที่อธิบายไว้ในขั้นตอนจําลองเครือข่ายชุดข้อความ ที่อยู่หนึ่งจะเป็นแบบลิงก์ในพื้นที่ (fe80) และมี 3 ที่อยู่เป็น Mesh-local (fd) EID คือที่อยู่ Mesh-local ที่ไม่มี ff:fe00 ในที่อยู่ ในเอาต์พุตตัวอย่างนี้ EID คือ fd55:cf34:dea5:7994:460:872c:e807:c4ab

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

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

เปิดหน้าต่างเทอร์มินัลที่ 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

รับโหนด 2&#39 ของ eui64 เพื่อจํากัดการเข้าถึงการผนวกที่เฉพาะเจาะจง

> 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) ได้ตรวจสอบสิทธิ์ตัวเองกับค่าคอมมิชชัน (โหนด 1) เรียบร้อยแล้ว และได้รับข้อมูลรับรองเครือข่ายชุดข้อความ

จากนั้นจึงเข้าร่วมโหนด 2 ในเครือข่ายชุดข้อความ (อีกครั้งในหน้าต่างเทอร์มินัลที่ 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 และกลับไปที่คอนโซล's 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 Prompt คุณอาจต้องตรวจสอบว่าโฆษณาทํางานและรีสตาร์ท / ป้อนอีกครั้งตามความจําเป็นหรือไม่

วิธีแสดงคอนเทนเนอร์ 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

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

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

หรือลองใช้เราเตอร์ BorderThread Border ในคอนเทนเนอร์ของ Docker