ESP32H2 ve ESP Thread Kenarlık Freze Kartı ile İş Parçacığı Oluşturma

1. Giriş

26b7f4f6b3ea0700.png

Google Nest ekibi tarafından yayınlanan OpenThread, bağlantılı ev ürünlerinin geliştirilmesini hızlandırmak için tasarlanmış Thread® ağ protokolünün açık kaynaklı bir uygulamasıdır. Thread Spesifikasyonu, ev ve ticari bina uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güç tüketen kablosuz cihazdan cihaza iletişim protokolünü tanımlar.

Espressif, FreeRTOS ve LwIP'ye dayalı OpenThread yığınını taşıyarak geliştiricilerin Thread ağlarını hızlı bir şekilde oluşturmasını sağladı. İlgili kaynak kodunu GitHub'dan edinebilirsiniz. Aynı zamanda Espressif, RTOS tabanlı bir Thread sınır yönlendirici de uygulamıştır.

Bu Codelab'de, gerçek donanım üzerinde OpenThread'i programlayacak, Thread ağı oluşturup yönetecek ve düğümler arasında mesaj ileteceksiniz.

Espressif_hardware_setup.jpg

Neler öğreneceksiniz?

  • OpenThread CLI ikili dosyalarını ESP kartlarına oluşturma ve yükleme
  • Sınır yönlendiriciyi ESP Thread Border Router kartına derleme ve yükleme.
  • ESP Monitor ve OpenThread KSA ile Thread düğümlerini manuel olarak yönetme.
  • Thread sınır yönlendiricide Thread ağı oluşturma
  • Cihazların Thread ağına güvenli bir şekilde eklenmesini sağlama.
  • Thread düğümleri arasında IPv6 adresini ping'leme.
  • UDP ile ileti dizisi düğümleri arasında mesaj iletme.

İhtiyacınız olanlar

Donanım:

  • IEEE 802.15.4 modülleri içeren 2 ESP kartı.
  • 1 ESP Thread sınır yönlendirici kartı.

Yazılım:

2. Başlarken

  1. ESP-IDF kurulumu.

Yazılım geliştirme ortamını yüklemek için lütfen ESP-IDF Programlama Kılavuzu'nu inceleyin.

  1. ESP Thread Border Router SDK'sını klonlayın.

ESP-THREAD-BR, resmi ESP Thread Border Router SDK'sıdır. Thread Border Router oluşturmak için tüm temel ağ özelliklerini destekler ve hızlı ürünleştirme için zengin ürün düzeyinde özellikler içerir.

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

3. Derleme ve yükleme

IEEE 802.15.4 modülleri içeren ESP kartlarında ot-cli-ftd ikili program dosyasını oluşturma ve yükleme hakkında daha fazla bilgi için ESP-IDF örneği ot_cli'ye bakabilirsiniz:

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

menuconfig aracılığıyla birleştirme özelliğini etkinleştirin:

$ idf.py menuconfig

Component config > OpenThread > Enable Joiner'ı seçin, ardından derleyin ve flash'leyin.

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

ESP Thread Sınır Yönlendirici Kartında ot-br ikili program dosyasını oluşturup yüklemek için önce RCP ikili program dosyasını oluşturmanız gerekir. Bu RCP ikili program dosyasının, ESP Thread Sınır Yönlendirici Kartı'ndaki cihaza açıkça yüklenmesi gerekmez. Sınır Yönlendirici ikili program dosyasına dahil edilir ve ilk başlatma işleminde (veya RCP donanım yazılımı değiştirildiğinde) ESP32-H2 çipine yüklenir. Daha fazla bilgi için ESP Thread BR belgelerine bakabilirsiniz:

$ 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 aracılığıyla komisyoncu özelliğini etkinleştirin:

$ idf.py menuconfig

Component config > OpenThread > Enable Commissioner'ı seçin, ardından derleyin ve yükleyin.

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

4. Thread sınır yönlendiricide Thread ağı oluşturma

Artık ESP Thread Border Router Board (BR Commissioner) üzerinde OpenThread komut satırını kullanarak bir Thread ağı oluşturabilirsiniz:

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

Bu veri kümesini etkin veri kümesi olarak kaydedin:

> dataset commit active
Done

IPv6 arayüzünü açın:

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

Start Thread protokol işlemi:

> 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

Bir süre sonra cihaz durumunu kontrol edin. Lider olmalıdır.

> state
leader
Done
> 

5. Ağ anahtarı aracılığıyla Thread ağına katılma

Bu codelab'de, IEEE 802.15.4 modülleri içeren iki ESP kartı, BR tarafından oluşturulan ağa katılmak üzere hazırlanır. Bu oturumda, Board1'i ağa ekleyeceğiz.

BR'den networkkey'i alın:

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

Bu networkkey'i IEEE 802.15.4 modülleri olan bir ESP kartına (Board1 Joiner) ayarlayın:

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

Bu veri kümesini etkin veri kümesi olarak kaydedin:

> dataset commit active
Done

IPv6 arayüzünü açın:

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

Start Thread protokol işlemi:

> 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

Bir süre sonra cihaz durumunu kontrol edin. Çocuk olmalıdır.

> state
child
Done

Rolü yönlendirici olarak ayarlayın.

> 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. Güvenli devreye alma işlemiyle Thread ağına katılma

Bu oturumda, Board2'yi güvenlik devreye alma işlemiyle ağa ekleyeceğiz:

BR Commissioner'dan PSKc ve panid'yi alın:

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

Ağ bilgilerini Board2'de yapılandırın:

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

Bu veri kümesini etkin veri kümesi olarak kaydedin:

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

IPv6 arayüzünü açın:

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

Board2'den eui64'ü alın:

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

BR Commissioner'da komisyoneri başlatın ve katılabilen cihazın eui64 değerini, Joiner Credential ile birlikte belirtin (örneğin, J01NME). Katılımcı kimlik bilgisi, 6 ila 32 karakter uzunluğunda, cihazlara özel, tamamen büyük harflerden oluşan alfanümerik karakterler (0-9 ve A-Y; okunabilirlik için I, O, Q ve Z hariç) dizisidir.

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

Board2 Joiner'a geçin. BR Commissioner'da yeni oluşturduğunuz birleştirici kimlik bilgisiyle birleştirici rolünü başlatın:

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

Bir dakika içinde başarılı bir kimlik doğrulama onayı alırsınız:

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

Ardından, BR Commissioner tarafından oluşturulan Thread ağına başlayabilir ve katılabilirsiniz.

Start Thread protokol işlemi:

> 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

Rolü yönlendirici olarak ayarlayın.

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

Artık aşağıdaki topolojiye sahip bir Thread ağı elde edersiniz:

esp_ot_tp_LRR.jpg

7. Thread düğümleri arasında IPv6 adresini ping'leme

İki kart arasında iletişim kurmak için ping komutunu kullanabilirsiniz. Her bir Jamboard'un IPv6 adresini yazdırmak için ipaddr komutunu kullanın:

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

Örneğin, BR Commissioner'dan Board2 MLE-ID'ye ping göndermek için BR Commissioner'da şu komutu çalıştırabilirsiniz:

## 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 ile iş parçacığı düğümleri arasında mesaj iletme

Bu oturumda, iki Thread cihazı arasında mesaj göndermeyi öğreneceksiniz. Örneğin, udp'yi açın, 20617 bağlantı noktasına bağlayın ve BR'deki tüm adresleri dinleyin:

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

Ardından, Board1'den BR MLE-ID adresine ve bağlantı noktasına bir mesaj gönderin 20617:

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

Brezilya'da alınan mesajı görebilirsiniz:

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

9. Tebrikler!

ESP kartlarını kullanarak fiziksel bir Thread ağı oluşturdunuz.

esp_ot_final_topology.jpg

Artık şunları biliyorsunuz:

  • OpenThread CLI ikili dosyalarını ESP kartlarına oluşturma ve yükleme
  • ESP Thread Border Router kartına sınır yönlendirici oluşturma ve yükleme
  • ESP Monitor ve OpenThread KSA ile Thread düğümlerini manuel olarak yönetme.
  • Thread sınır yönlendiricide Thread ağı oluşturma
  • Cihazların Thread ağına güvenli bir şekilde eklenmesini sağlama.
  • Thread düğümleri arasında IPv6 adresini ping'leme.
  • UDP ile ileti dizisi düğümleri arasında mesaj iletme.

Daha fazla bilgi

Aşağıdakiler de dahil olmak üzere çeşitli OpenThread kaynakları için openthread.io ve GitHub'u inceleyin:

Referans: