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

1. เกริ่นนำ

26b7f4f6b3ea0700.png

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

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

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

Espressif_hardware_setup.jpg

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

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

สิ่งที่ต้องมี

ฮาร์ดแวร์:

  • บอร์ด ESP 2 เครื่องที่มีโมดูล IEEE 802.15.4
  • บอร์ดขอบเราเตอร์ ESP Thread Border Router 1 ตัว

ซอฟต์แวร์:

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

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

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

  1. โคลน SDK ของ ESP Thread Border Router

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 โปรดดูรายละเอียดเพิ่มเติมที่ตัวอย่าง ESP-IDF ot_cli

$ cd <your-idf-path>/examples/openthread/ot_cli
$ idf.py set-target <your-board-type>

เปิดใช้ฟีเจอร์ตัวเชื่อมผ่าน Menuconfig:

$ idf.py menuconfig

การกำหนดค่าคอมโพเนนต์ > OpenThread > เปิดใช้ Joiner จากนั้นสร้างและ Flash

$ idf.py -p <your-local-port> build flash monitor

สำหรับการสร้างและแฟลชไฟล์ไบนารี ot-br บน ESP Thread Border Router Board คุณต้องสร้างไฟล์ไบนารี RCP ก่อน ไฟล์ไบนารี RCP นี้ไม่จำเป็นต้องได้รับการแฟลชอย่างชัดแจ้งไปยังอุปกรณ์บน ESP Thread Border Router Board โดยจะอยู่ในไฟล์ไบนารีของ Border Router และแฟลชไปยังชิป ESP32-H2 เมื่อเปิดเครื่องครั้งแรก (หรือเมื่อเปลี่ยนเฟิร์มแวร์ RCP) ดูรายละเอียดเพิ่มเติมได้ที่เอกสารสำหรับชุดข้อความของ ESP

$ 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 จากนั้นสร้างแล้ว Flash

$ idf.py -p <your-local-port> build flash monitor

4. การสร้างเครือข่ายเทรดบน Border Router ของเทรด

ขณะนี้คุณสามารถสร้างเครือข่ายเทรดโดยใช้บรรทัดคำสั่ง OpenThread ใน ESP Thread Border Router Board (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 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. เข้าร่วมเครือข่ายเทรดผ่านคีย์เครือข่าย

ใน Codelab นี้มีบอร์ด ESP 2 อันที่มีโมดูล IEEE 802.15.4 สำหรับเข้าร่วมเครือข่ายที่สร้างขึ้น BR ในเซสชันนี้ เราจะเพิ่ม Board1 ในเครือข่าย

รับคีย์เครือข่ายจากบราซิล:

## BR Commissioner ##
----------------------
> networkkey
731ab6a60a64a0a0b14b259b86b2be01
Done
> 

ตั้งค่าคีย์เครือข่ายนี้เป็นกระดาน ESP (Board1 Joiner) 1 อันที่มีโมดูล 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 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

กำหนดบทบาทเป็นเราเตอร์

> 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. เข้าร่วมเครือข่ายเทรดผ่านการจัดเตรียมที่ปลอดภัย

ในเซสชันนี้ เราจะเพิ่ม Board2 ในเครือข่ายผ่านการมอบหมายความปลอดภัย

รับ PSKc และตรวจสอบค่าธรรมเนียมจาก 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 จาก Board2:

## Board2 Joiner ##
----------------------
> eui64
4831b7fffec02be1
Done

ใน BR Commissioner ให้เริ่มต้นค่าคอมมิชชันและระบุ eui64 ของอุปกรณ์ที่เข้าร่วมได้ รวมถึงข้อมูลเข้าสู่ระบบของ Joiner เช่น 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 เริ่มต้นบทบาท Joiner ด้วยข้อมูลเข้าสู่ระบบ Joiner ที่เพิ่งตั้งค่าใน BR Commissioner ดังนี้

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

ภายในเวลาประมาณ 1 นาที คุณจะได้รับการยืนยันการตรวจสอบสิทธิ์ที่เสร็จสมบูรณ์ ดังนี้

## Board2 Joiner ##
----------------------
>
Join success

หลังจากนั้นคุณจะเริ่มและเข้าร่วมเครือข่ายเทรดที่ก่อตั้งโดย BR Commissioner ได้

เริ่มการดำเนินการโปรโตคอลเทรด:

> 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

กำหนดบทบาทเป็นเราเตอร์

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

ตอนนี้คุณจะได้รับเครือข่ายเทรดที่มีโทโพโลยีที่แสดงด้านล่าง

esp_ot_tp_LRR.jpg

7. ใช้คำสั่ง Ping ที่อยู่ IPv6 ระหว่างโหนดเทรด

คุณสามารถใช้คำสั่ง 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 Board2 MLE-ID จาก 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. การส่งข้อความระหว่างโหนดเทรดด้วย UDP

ในเซสชันนี้ คุณจะได้เรียนรู้วิธีส่งข้อความระหว่างอุปกรณ์เทรด 2 เครื่อง เช่น เปิด udp แล้วเชื่อมโยงบนพอร์ต 20617 และฟังที่อยู่ทั้งหมดบน BR ดังนี้

## BR Commissioner ##
----------------------
> udp open
Done
> udp bind :: 20617
I (1298739) OPENTHREAD: Platform UDP bound to port 20617
Done

จากนั้นส่งข้อความจาก Board1 ไปยังที่อยู่ 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. ยินดีด้วย

คุณได้สร้างเครือข่ายเทรดจริงโดยใช้บอร์ด ESP

esp_ot_final_topology.jpg

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

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

อ่านเพิ่มเติม

ไปที่ openthread.io และ GitHub เพื่อดูทรัพยากรของ OpenThread มากมาย ได้แก่

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