1. บทนำ

OpenThread ซึ่งเปิดตัวโดยทีม Google Nest เป็นการใช้งานโปรโตคอลเครือข่าย Thread® แบบโอเพนซอร์สที่ออกแบบมาเพื่อเร่งการพัฒนาผลิตภัณฑ์สำหรับบ้านอัจฉริยะ ข้อกำหนด Thread กำหนดโปรโตคอลการสื่อสารแบบไร้สายที่เชื่อถือได้ ปลอดภัย และใช้พลังงานต่ำจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งซึ่งอิงตาม IPv6 สำหรับแอปพลิเคชันในบ้านและอาคารพาณิชย์
Espressif ได้พอร์ตสแต็ก OpenThread โดยอิงตาม FreeRTOS และ LwIP ซึ่งช่วยให้นักพัฒนาแอปสร้างเครือข่าย Thread ได้อย่างรวดเร็ว คุณสามารถรับซอร์สโค้ดที่เกี่ยวข้องได้จาก GitHub ในขณะเดียวกัน Espressif ยังได้ติดตั้งใช้งาน Thread Border Router ที่อิงตาม RTOS ด้วย
ใน Codelab นี้ คุณจะได้เขียนโปรแกรม OpenThread ในฮาร์ดแวร์จริง สร้างและจัดการเครือข่าย Thread รวมถึงส่งข้อความระหว่างโหนด

สิ่งที่คุณจะได้เรียนรู้
- การสร้างและแฟลชไบนารี OpenThread CLI ไปยังบอร์ด ESP
- สร้างและแฟลช Border Router ไปยังบอร์ด ESP Thread Border Router
- การจัดการโหนด Thread ด้วยตนเองด้วย ESP Monitor และ OpenThread CLI
- การสร้างเครือข่าย Thread ใน Thread Border Router
- การรักษาความปลอดภัยในการจัดสรรอุปกรณ์ไปยังเครือข่าย Thread
- Ping ที่อยู่ IPv6 ระหว่างโหนด Thread
- การส่งข้อความระหว่างโหนด Thread ด้วย UDP
สิ่งที่คุณต้องมี
ฮาร์ดแวร์
- บอร์ด ESP 2 บอร์ดที่มีโมดูล IEEE 802.15.4
- บอร์ด Thread Border Router ของ ESP 1 บอร์ด
ซอฟต์แวร์:
2. เริ่มต้นใช้งาน
- การติดตั้ง ESP-IDF
โปรดทำตามคู่มือการเขียนโปรแกรม ESP-IDF เพื่อติดตั้งสภาพแวดล้อมการพัฒนาซอฟต์แวร์
- โคลน ESP Thread Border Router SDK
ESP-THREAD-BR คือ SDK อย่างเป็นทางการของ ESP Thread Border Router โดยรองรับฟีเจอร์เครือข่ายพื้นฐานทั้งหมดเพื่อสร้าง Thread Border Router และผสานรวมฟีเจอร์ระดับผลิตภัณฑ์ที่หลากหลายเพื่อการผลิตผลิตภัณฑ์อย่างรวดเร็ว
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. สร้างและแฟลช
หากต้องการสร้างและแฟลชไบนารี ot-cli-ftd ในบอร์ด ESP ที่มีโมดูล IEEE 802.15.4 โปรดดูรายละเอียดเพิ่มเติมในตัวอย่าง ESP-IDF ot_cli
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
เปิดใช้ฟีเจอร์ Joiner ผ่าน menuconfig โดยทำดังนี้
$ idf.py menuconfig
การกำหนดค่าคอมโพเนนต์ > OpenThread > เปิดใช้ Joiner จากนั้นสร้างและแฟลช
$ idf.py -p <your-local-port> build flash monitor
หากต้องการสร้างและแฟลชไฟล์ไบนารี ot-br ในบอร์ด ESP Thread Border Router คุณต้องสร้างไฟล์ไบนารี RCP ก่อน ไม่จำเป็นต้องแฟลชไฟล์ไบนารี RCP นี้ไปยังอุปกรณ์ในบอร์ด ESP Thread Border Router อย่างชัดเจน โดยจะรวมอยู่ในไฟล์ไบนารีของ Border Router และแฟลชไปยังชิป ESP32-H2 เมื่อบูตครั้งแรก (หรือมีการเปลี่ยนแปลงเฟิร์มแวร์ RCP) ดูรายละเอียดเพิ่มเติมได้ที่เอกสารประกอบ ESP Thread BR
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
เปิดใช้ฟีเจอร์คอมมิชชันเนอร์ผ่าน menuconfig โดยทำดังนี้
$ idf.py menuconfig
การกำหนดค่าคอมโพเนนต์ > OpenThread > เปิดใช้ Commissioner จากนั้นสร้างและแฟลช
$ idf.py -p <your-local-port> build flash monitor
4. การสร้างเครือข่าย Thread ใน Thread Border Router
ตอนนี้คุณสามารถสร้างเครือข่าย Thread โดยใช้บรรทัดคำสั่ง OpenThread ในบอร์ด ESP Thread Border Router (BR Commissioner) ได้แล้ว
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่
> dataset commit active Done
เปิดอินเทอร์เฟซ IPv6
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
เริ่มการดำเนินการโปรโตคอล Thread
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
รอสักครู่ แล้วตรวจสอบสถานะอุปกรณ์ ซึ่งควรเป็นผู้นำ
> state leader Done >
5. เข้าร่วมเครือข่าย Thread ผ่าน networkkey
ในโค้ดแล็บนี้ เราจะเตรียมบอร์ด ESP 2 บอร์ดที่มีโมดูล IEEE 802.15.4 เพื่อเข้าร่วมเครือข่ายที่สร้างขึ้นโดย BR ในเซสชันนี้ เราจะเพิ่มบอร์ด 1 ลงในเครือข่าย
รับ networkkey จาก BR โดยทำดังนี้
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
ตั้งค่า networkkey นี้ให้กับบอร์ด ESP 1 บอร์ด (Board1 Joiner) ที่มีโมดูล IEEE 802.15.4 โดยทำดังนี้
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่
> dataset commit active Done
เปิดอินเทอร์เฟซ IPv6
> ifconfig up Done I (20308) OT_STATE: netif up
เริ่มการดำเนินการโปรโตคอล Thread
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
รอสักครู่ แล้วตรวจสอบสถานะอุปกรณ์ ซึ่งควรเป็นบุตรหลาน
> state child Done
ตั้งค่าบทบาทเป็น Router
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >

6. เข้าร่วมเครือข่าย Thread ผ่านการจัดสรรที่ปลอดภัย
ในเซสชันนี้ เราจะเพิ่ม Board2 ลงในเครือข่ายผ่านการจัดสรรความปลอดภัย
รับ PSKc และ panid จาก BR Commissioner:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
กำหนดค่าข้อมูลเครือข่ายไปยัง Board2 ดังนี้
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่
## Board2 Joiner ## ---------------------- > dataset commit active Done
เปิดอินเทอร์เฟซ IPv6
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
รับ eui64 จากบอร์ด 2 โดยทำดังนี้
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
ใน BR Commissioner ให้เริ่ม Commissioner และระบุ eui64 ของอุปกรณ์ที่เข้าร่วมได้ พร้อมกับข้อมูลเข้าสู่ระบบของอุปกรณ์ที่เข้าร่วม เช่น J01NME ข้อมูลเข้าสู่ระบบสำหรับเข้าร่วมคือสตริงเฉพาะอุปกรณ์ของอักขระที่เป็นตัวอักษรและตัวเลขคละกันทั้งหมด (0-9 และ A-Y โดยไม่รวม I, O, Q และ Z เพื่อให้อ่านง่าย) ที่มีความยาวระหว่าง 6-32 อักขระ
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
เปลี่ยนไปใช้ Board2 Joiner เริ่มบทบาทผู้เข้าร่วมด้วยข้อมูลเข้าสู่ระบบผู้เข้าร่วมที่คุณเพิ่งตั้งค่าใน BR Commissioner
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
ภายใน 1 นาที คุณจะได้รับการยืนยันว่าการตรวจสอบสิทธิ์สำเร็จ
## Board2 Joiner ## ---------------------- > Join success
หลังจากนั้น คุณจะเริ่มและเข้าร่วมเครือข่าย Thread ที่สร้างโดย BR Commissioner ได้
เริ่มการดำเนินการโปรโตคอล Thread
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
ตั้งค่าบทบาทเป็น Router
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
ตอนนี้คุณมีเครือข่าย Thread ที่มีโทโพโลยีดังที่แสดงด้านล่าง

7. Ping ที่อยู่ IPv6 ระหว่างโหนด Thread
คุณใช้คำสั่ง ping เพื่อสื่อสารระหว่างบอร์ด 2 บอร์ดได้ ใช้คำสั่ง ipaddr เพื่อพิมพ์ที่อยู่ IPv6 ของแต่ละบอร์ด
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
เช่น หากต้องการ Ping MLE-ID ของบอร์ด 2 จาก BR Commissioner คุณสามารถเรียกใช้คำสั่งนี้ใน BR Commissioner
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
8. การส่งข้อความระหว่างโหนด Thread ด้วย UDP
ในเซสชันนี้ คุณจะได้เรียนรู้วิธีส่งข้อความระหว่างอุปกรณ์ Thread 2 เครื่อง ตัวอย่างเช่น เปิด udp และเชื่อมโยงกับพอร์ต 20617 และฟังที่อยู่ทั้งหมดใน BR
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
จากนั้นส่งข้อความจากบอร์ด 1 ไปยังที่อยู่และพอร์ต BR MLE-ID 20617
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
คุณจะเห็นข้อความที่ได้รับใน BR ดังนี้
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. ยินดีด้วย
คุณได้สร้างเครือข่าย Thread จริงโดยใช้บอร์ด ESP แล้ว

ตอนนี้คุณก็รู้แล้วว่า
- การสร้างและแฟลชไบนารี OpenThread CLI ไปยังบอร์ด ESP
- การสร้าง Border Router ที่กะพริบไปยังบอร์ด ESP Thread Border Router
- การจัดการโหนด Thread ด้วยตนเองด้วย ESP Monitor และ OpenThread CLI
- การสร้างเครือข่าย Thread ใน Thread Border Router
- การรักษาความปลอดภัยในการจัดสรรอุปกรณ์ไปยังเครือข่าย Thread
- Ping ที่อยู่ IPv6 ระหว่างโหนด Thread
- การส่งข้อความระหว่างโหนด Thread ด้วย UDP
อ่านเพิ่มเติม
ดูข้อมูลเกี่ยวกับ OpenThread ได้ที่ openthread.io และ GitHub ซึ่งมีแหล่งข้อมูล OpenThread มากมาย เช่น
- แพลตฟอร์มที่รองรับ - ดูแพลตฟอร์มทั้งหมดที่รองรับ OpenThread
- สร้าง OpenThread - รายละเอียดเพิ่มเติมเกี่ยวกับการสร้างและกำหนดค่า OpenThread
- ข้อมูลเบื้องต้นเกี่ยวกับ Thread - ครอบคลุมแนวคิด Thread ทั้งหมดที่แสดงใน Codelab นี้
ข้อมูลอ้างอิง: