Membangun Thread Network dengan ESP32H2 dan ESP Thread Border Router Board

1. Pengantar

26b7f4f6b3ea0700.png

OpenThread, yang dirilis oleh tim Google Nest, adalah implementasi open source dari protokol jaringan Thread® yang dirancang untuk mempercepat pengembangan produk untuk rumah yang terhubung. Spesifikasi Thread menentukan protokol komunikasi nirkabel perangkat ke perangkat yang andal, aman, dan berdaya rendah berbasis IPv6 untuk aplikasi bangunan rumah dan komersial.

Espressif telah mem-port stack OpenThread berdasarkan FreeRTOS dan LwIP, sehingga memungkinkan developer membangun jaringan Thread dengan cepat. Kode sumber terkait dapat diperoleh dari GitHub. Pada saat yang sama, Espressif juga telah mengimplementasikan Router Pembatas Thread berdasarkan RTOS.

Dalam Codelab ini, Anda akan memprogram OpenThread di hardware sebenarnya, membuat dan mengelola jaringan Thread, serta mengirim pesan antar-node.

Espressif_hardware_setup.jpg

Yang akan Anda pelajari

  • Mem-build dan mem-flash biner OpenThread CLI ke board ESP.
  • Mem-build dan mem-flash router pembatas ke board Router Pembatas Thread ESP.
  • Mengelola node Thread secara manual dengan ESP Monitor dan OpenThread CLI.
  • Membentuk jaringan Thread di Router Pembatas Thread.
  • Mengamankan komisioning perangkat ke jaringan Thread.
  • Melakukan ping alamat IPv6 antar-node Thread.
  • Mengirim pesan antar-node Thread dengan UDP.

Yang akan Anda butuhkan

Hardware:

  • 2 board ESP dengan modul IEEE 802.15.4.
  • 1 Board Router Pembatas Thread ESP.

Software:

2. Memulai

  1. Penginstalan ESP-IDF.

Ikuti Panduan Pemrograman ESP-IDF untuk menginstal lingkungan pengembangan software.

  1. Kloning ESP Thread Border Router SDK.

ESP-THREAD-BR adalah SDK Router pembatas Thread ESP resmi. SDK ini mendukung semua fitur jaringan dasar untuk mem-build Router Pembatas Thread dan mengintegrasikan fitur tingkat produk yang lengkap untuk produk yang cepat.

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

3. Mem-build dan mem-flash

Untuk mem-build dan mem-flash file biner ot-cli-ftd di board ESP dengan modul IEEE 802.15.4, Anda dapat melihat contoh ESP-IDF ot_cli untuk mengetahui detail selengkapnya:

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

Aktifkan fitur joiner melalui menuconfig:

$ idf.py menuconfig

Component config > OpenThread > Enable Joiner, lalu build dan flash.

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

Untuk mem-build dan mem-flash file biner ot-br di Board Router Pembatas Thread ESP, Anda harus mem-build file biner RCP terlebih dahulu. File biner RCP ini tidak perlu di-flash secara eksplisit ke perangkat di Board Router Pembatas Thread ESP. File ini akan disertakan dalam file biner Router Pembatas dan di-flash ke chip ESP32-H2 saat booting pertama (atau firmware RCP diubah). Anda dapat melihat dokumen ESP Thread BR untuk mengetahui detail selengkapnya:

$ 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

Aktifkan fitur commissioner melalui menuconfig:

$ idf.py menuconfig

Component config > OpenThread > Enable Commissioner, lalu build dan flash.

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

4. Membentuk jaringan Thread di Router Pembatas Thread

Sekarang Anda dapat membentuk jaringan Thread menggunakan command line OpenThread di Board Router Pembatas Thread ESP (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

Tetapkan set data ini sebagai set data aktif:

> dataset commit active
Done

Aktifkan antarmuka IPv6:

> ifconfig up
I (59329) OPENTHREAD: Platform UDP bound to port 49153
Done
I (59329) OT_STATE: netif up

Mulai operasi protokol 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

Setelah beberapa saat, periksa status perangkat. Statusnya harus Pemimpin.

> state
leader
Done
> 

5. Bergabung ke jaringan Thread melalui networkkey

Dalam codelab ini, dua board ESP dengan modul IEEE 802.15.4 disiapkan untuk bergabung ke jaringan yang dibentuk BR. Pada sesi ini, kita akan menambahkan Board1 ke jaringan.

Dapatkan networkkey dari BR:

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

Tetapkan networkkey ini ke satu board ESP (Board1 Joiner) dengan modul IEEE 802.15.4:

## Board1 Joiner ##
----------------------
> dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01
Done

Tetapkan set data ini sebagai set data aktif:

> dataset commit active
Done

Aktifkan antarmuka IPv6:

> ifconfig up
Done
I (20308) OT_STATE: netif up

Mulai operasi protokol 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

Setelah beberapa saat, periksa status perangkat. Statusnya harus Anak.

> state
child
Done

Tetapkan peran ke Mesh Extender (disebut sebagai router di CLI dan log).

> 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. Bergabung ke jaringan Thread melalui komisioning aman

Pada sesi ini, kita akan menambahkan Board2 ke jaringan melalui komisioning keamanan:

Dapatkan PSKc dan panid dari BR Commissioner:

## BR Commissioner ##
----------------------
> pskc
54e7f18d2575014da94db09df29c5df0
Done
> panid
0x1444
Done

Konfigurasi informasi jaringan ke Board2:

## Board2 Joiner ##
----------------------
> dataset pskc 54e7f18d2575014da94db09df29c5df0
Done
> dataset panid 0x1444
Done

Tetapkan set data ini sebagai set data aktif:

## Board2 Joiner ##
----------------------
> dataset commit active 
Done

Aktifkan antarmuka IPv6:

## Board2 Joiner ##
----------------------
> ifconfig up
Done
I (29146) OT_STATE: netif up

Dapatkan eui64 dari Board2:

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

Di BR Commissioner, mulai commissioner dan tentukan eui64 perangkat yang dapat bergabung, beserta Kredensial Joiner, misalnya J01NME. Kredensial Joiner adalah string khusus perangkat yang terdiri dari karakter alfanumerik huruf besar (0-9 dan A-Y, tidak termasuk I, O, Q, dan Z agar mudah dibaca), dengan panjang antara 6 dan 32 karakter.

## BR Commissioner ##
----------------------
> commissioner start
Commissioner: petitioning
Done
Commissioner: active
> commissioner joiner add 4831b7fffec02be1 J01NME
Done

Beralih ke Board2 Joiner. Mulai peran joiner dengan Kredensial Joiner yang baru saja Anda siapkan di BR Commissioner:

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

Dalam waktu sekitar satu menit, Anda akan mendapatkan konfirmasi autentikasi yang berhasil:

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

Setelah itu, Anda dapat memulai dan bergabung ke jaringan Thread yang dibentuk oleh BR Commissioner.

Mulai operasi protokol 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

Tetapkan peran ke Mesh Extender (disebut sebagai router di CLI dan log).

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

Sekarang Anda mendapatkan jaringan Thread dengan topologi yang ditunjukkan di bawah ini:

esp_ot_tp_LRR.jpg

7. Melakukan ping alamat IPv6 antar-node Thread

Anda dapat menggunakan perintah ping untuk berkomunikasi antara dua board. Gunakan perintah ipaddr untuk mencetak alamat IPv6 setiap board:

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

Misalnya, untuk melakukan ping MLE-ID Board2 dari BR Commissioner, Anda dapat menjalankan perintah ini di 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. Mengirim pesan antar-node Thread dengan UDP

Pada sesi ini, Anda akan mempelajari cara mengirim pesan antara dua perangkat Thread. Misalnya, buka udp dan ikat di port 20617 serta dengarkan semua alamat di BR:

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

Kemudian, kirim pesan dari Board1 ke alamat dan port 20617 MLE-ID BR:

## Board1 Joiner ##
----------------------
> udp open
Done
> udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP

Anda dapat melihat pesan yang diterima di BR:

## BR Commissioner ##
----------------------
3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP

9. Selamat!

Anda telah membuat jaringan Thread fisik menggunakan board ESP.

esp_ot_final_topology.jpg

Sekarang Anda mengetahui:

  • Mem-build dan mem-flash biner OpenThread CLI ke board ESP.
  • Mem-build router pembatas dan mem-flashnya ke board Router Pembatas Thread ESP.
  • Mengelola node Thread secara manual dengan ESP Monitor dan OpenThread CLI.
  • Membentuk jaringan Thread di Router Pembatas Thread.
  • Mengamankan komisioning perangkat ke jaringan Thread.
  • Melakukan ping alamat IPv6 antar-node Thread.
  • Mengirim pesan antar-node Thread dengan UDP.

Bacaan lebih lanjut

Lihat openthread.io dan GitHub untuk berbagai resource OpenThread, termasuk:

Referensi: