1. บทนำ

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

สิ่งที่คุณจะได้เรียนรู้
- การสร้างและแฟลชไบนารี CLI ของ OpenThread ลงในบอร์ด ESP
- การสร้างและแฟลช Border Router ลงในบอร์ด ESP Thread Border Router
- การจัดการโหนด Thread ด้วยตนเองด้วย ESP Monitor และ CLI ของ OpenThread
- การสร้างเครือข่าย Thread บน Thread Border Router
- การรักษาความปลอดภัยในการเตรียมใช้งานอุปกรณ์ในเครือข่าย Thread
- การ Ping ที่อยู่ IPv6 ระหว่างโหนด Thread
- การส่งข้อความระหว่างโหนด Thread ด้วย UDP
สิ่งที่คุณต้องมี
ฮาร์ดแวร์
ซอฟต์แวร์
2. เริ่มต้นใช้งาน
- การติดตั้ง ESP-IDF
โปรดทำตามคู่มือการเขียนโปรแกรม ESP-IDF เพื่อติดตั้งสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
- โคลน ESP Thread Border Router SDK
ESP-THREAD-BR คือ ESP Thread Border Router SDK อย่างเป็นทางการ โดยรองรับฟีเจอร์เครือข่ายพื้นฐานทั้งหมดเพื่อสร้าง 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 โปรดดูรายละเอียดเพิ่มเติมในตัวอย่าง ot_cli ของ ESP-IDF
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
เปิดใช้ฟีเจอร์ Joiner ผ่าน menuconfig โดยทำดังนี้
$ idf.py menuconfig
Component config > OpenThread > Enable 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
เปิดใช้ฟีเจอร์ Commissioner ผ่าน menuconfig โดยทำดังนี้
$ idf.py menuconfig
Component config > OpenThread > Enable 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 นี้เป็น Dataset ที่ใช้งานอยู่โดยทำดังนี้
> 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
รอสักครู่แล้วตรวจสอบสถานะของอุปกรณ์ สถานะควรเป็น Leader
> state leader Done >
5. เข้าร่วมเครือข่าย Thread ผ่าน networkkey
ใน Codelab นี้ เราได้เตรียมบอร์ด ESP 2 บอร์ดที่มีโมดูล IEEE 802.15.4 ไว้สำหรับเข้าร่วมเครือข่ายที่สร้างโดย BR ในเซสชันนี้ เราจะเพิ่ม Board1 ลงในเครือข่าย
รับ networkkey จาก BR โดยทำดังนี้
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
ตั้งค่า networkkey นี้ให้กับบอร์ด ESP (Board1 Joiner) 1 บอร์ดที่มีโมดูล IEEE 802.15.4 โดยทำดังนี้
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
คอมมิต Dataset นี้เป็น Dataset ที่ใช้งานอยู่โดยทำดังนี้
> 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
รอสักครู่แล้วตรวจสอบสถานะของอุปกรณ์ สถานะควรเป็น Child
> state child Done
ตั้งค่าบทบาทเป็น Mesh Extender (เรียกว่า router ใน CLI และบันทึก)
> 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
คอมมิต Dataset นี้เป็น Dataset ที่ใช้งานอยู่โดยทำดังนี้
## Board2 Joiner ## ---------------------- > dataset commit active Done
เปิดอินเทอร์เฟซ IPv6 โดยทำดังนี้
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
รับ eui64 จาก Board2 โดยทำดังนี้
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
ใน BR Commissioner ให้เริ่ม Commissioner และระบุ eui64 ของอุปกรณ์ที่เข้าร่วมได้ พร้อมด้วยข้อมูลเข้าสู่ระบบ Joiner เช่น J01NME ข้อมูลเข้าสู่ระบบ Joiner เป็นสตริงเฉพาะอุปกรณ์ที่ประกอบด้วยอักขระที่เป็นตัวอักษรและตัวเลขทั้งหมด (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 เริ่มบทบาท Joiner ด้วยข้อมูลเข้าสู่ระบบ 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
ตั้งค่าบทบาทเป็น Mesh Extender (เรียกว่า router ใน CLI และบันทึก)
> 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 ของ Board2 จาก 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
จากนั้นส่งข้อความจาก Board1 ไปยังที่อยู่ MLE-ID ของ BR และพอร์ต 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 แล้ว

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