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

1. บทนำ

26b7f4f6b3ea0700.png

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

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

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

Espressif_hardware_setup.jpg

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

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

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

ฮาร์ดแวร์:

  • บอร์ด ESP 2 ชุดพร้อมโมดูล IEEE 802.15.4
  • ESP Thread Border Router Board

ซอฟต์แวร์:

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

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

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

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

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 มีการเปลี่ยนแปลง) ดูรายละเอียดเพิ่มเติมได้ที่เอกสาร Thread ESP 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 จากนั้นสร้างและ Flash

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

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

ตอนนี้คุณสามารถสร้างเครือข่าย Thread โดยใช้บรรทัดคำสั่ง 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. เข้าร่วมเครือข่าย Thread ผ่าน Networkkey

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

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

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

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

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

รับ PSKc และ Panid จากคณะกรรมาธิการของบราซิล:

## 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 ข้อมูลเข้าสู่ระบบ 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 เริ่มต้นบทบาทผู้ผนวกด้วยเอกสารรับรองผู้เข้าร่วมที่คุณเพิ่งตั้งค่าในคณะกรรมาธิการบราซิล ดังนี้

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

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

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

หลังจากนั้น คุณจะเริ่มต้นและเข้าร่วมเครือข่ายชุดข้อความที่คณะกรรมาธิการบราซิล (BR) ได้

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

> 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 เพื่อสื่อสารระหว่างกระดานสองกระดานใดก็ได้ ใช้คำสั่ง 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

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

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

ดู openthread.io และ GitHub สำหรับทรัพยากรต่างๆ ของ OpenThread เช่น

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