สร้างเครือข่ายเทรดด้วย 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

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

  • การสร้างและแฟลชไบนารี 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. เริ่มต้นใช้งาน

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

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

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

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

คอมมิตชุดข้อมูลนี้เป็นชุดข้อมูลที่ใช้งานอยู่

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

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 ของบอร์ด 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 แล้ว

esp_ot_final_topology.jpg

ตอนนี้คุณก็รู้แล้วว่า

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

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