สร้างเครือข่ายเทรดด้วย ESP32H2 และ ESP Thread Border Router Board

1. บทนำ

26b7f4f6b3ea0700.png

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

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

ใน Codelab นี้ คุณจะได้เขียนโปรแกรม OpenThread บนฮาร์ดแวร์จริง สร้างและจัดการเครือข่าย Thread รวมถึงส่งข้อความระหว่างโหนด

Espressif_hardware_setup.jpg

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

  • การสร้างและแฟลชไบนารี CLI ของ OpenThread ลงในบอร์ด ESP
  • การสร้างและแฟลช Border Router ลงในบอร์ด ESP Thread Border Router
  • การจัดการโหนด Thread ด้วยตนเองด้วย ESP Monitor และ CLI ของ OpenThread
  • การสร้างเครือข่าย Thread บน Thread Border Router
  • การรักษาความปลอดภัยในการเตรียมใช้งานอุปกรณ์ในเครือข่าย Thread
  • การ Ping ที่อยู่ IPv6 ระหว่างโหนด Thread
  • การส่งข้อความระหว่างโหนด Thread ด้วย UDP

สิ่งที่คุณต้องมี

ฮาร์ดแวร์

  • บอร์ด ESP 2 บอร์ดที่มีโมดูล IEEE 802.15.4
  • บอร์ด ESP Thread Border Router 1 บอร์ด

ซอฟต์แวร์

2. เริ่มต้นใช้งาน

  1. การติดตั้ง ESP-IDF

โปรดทำตามคู่มือการเขียนโปรแกรม ESP-IDF เพื่อติดตั้งสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

  1. โคลน 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
> 

esp_ot_tp_LR.jpg

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 ที่มีโทโพโลยีดังที่แสดงด้านล่าง

esp_ot_tp_LRR.jpg

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 แล้ว

esp_ot_final_topology.jpg

ตอนนี้คุณทราบข้อมูลต่อไปนี้แล้ว

  • การสร้างและแฟลชไบนารี 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 นี้

ข้อมูลอ้างอิง