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.
  • Thread sınır yönlendiricisini 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önlendiricisinde Thread ağı oluşturma
  • Cihazların Thread ağına güvenli bir şekilde eklenmesini sağlar.
  • Thread düğümleri arasında IPv6 adresini ping'leme.
  • UDP ile Thread 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 Border Router 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 Sınır Yönlendiricisi SDK'sını klonlayın.

ESP-THREAD-BR, resmi ESP Thread sınır yönlendiricisi SDK'sıdır. Thread sınır yönlendiricisi 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 göz atabilirsiniz:

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

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

$ idf.py menuconfig

Component config > OpenThread > Enable Joiner'ı seçin, ardından derleme ve flash işlemini yapın.

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

ESP Thread Sınır Yönlendiricisi 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önlendiricisi Board'daki cihaza açıkça yüklenmesi gerekmez. Sınır Yönlendirici ikili program dosyasına dahil edilir ve ilk başlatmada (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 göz atabilirsiniz:

$ 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 komisyon üyesi özelliğini etkinleştirin:

$ idf.py menuconfig

Bileşen yapılandırması > OpenThread > Komisyoncuyu Etkinleştir'i seçin, ardından derleyin ve yükleyin.

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

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

Artık ESP Thread Sınır Yönlendiricisi Kartı (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ü Mesh Extender olarak ayarlayın (CLI ve günlüklerde router olarak adlandırılır).

> 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, güvenlik devreye alma işlemi aracılığıyla Board2'yi 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'ını, örneğin J01NME, Joiner Credential ile birlikte belirtin. 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 Komisyon Üyesi'nde yeni oluşturduğunuz Katılımcı Kimlik Bilgisi ile katılımcı 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ğını başlatabilir ve bu ağa 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ü Mesh Extender olarak ayarlayın (CLI ve günlüklerde router olarak adlandırılır).

> 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 ileti 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 Sınır Yönlendiricisi kartına bir Thread sınır yönlendiricisi oluşturma ve yükleme.
  • ESP Monitor ve OpenThread KSA ile Thread düğümlerini manuel olarak yönetme.
  • Thread sınır yönlendiricisinde Thread ağı oluşturma
  • Cihazların Thread ağına güvenli bir şekilde eklenmesini sağlar.
  • Thread düğümleri arasında IPv6 adresini ping'leme.
  • UDP ile Thread 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'a göz atın:

Referans: