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, Thread® ağ protokolünün bağlı ev için ürünlerin geliştirilmesini hızlandırmak üzere tasarlanmış açık kaynaklı bir uygulamasıdır. Thread Specification (İş Parçacığı Spesifikasyonu), ev ve ticari bina uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güçlü bir kablosuz cihazdan cihaza iletişim protokolü tanımlar.

Espressif, OpenThread yığınını FreeRTOS ve LwIP'ye göre taşıyarak geliştiricilerin Thread ağlarını hızlıca oluşturabilmesini sağladı. İlgili kaynak kodu, GitHub'dan edinilebilir. Aynı zamanda Espressif, RTOS'ya dayalı bir Thread Kenarlık Yönlendirici de uyguladı.

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

Espressif_hardware_setup.jpg

Neler öğreneceksiniz?

  • OpenThread CLI ikili programları oluşturma ve bunları ESP kartlarına yükleme.
  • Sınır yönlendiricisi oluşturuluyor ve ESP İş Parçacığı Sınır Yönlendirici kartına yanıp sönüyor.
  • Thread düğümlerini ESP Monitor ve OpenThread CLI ile manuel olarak yönetme.
  • İş Parçacığı Kenarlığı Yönlendirici'de Thread ağı oluşturma.
  • Cihazların Thread ağında devreye alınmasını güvenli hale getirme.
  • Thread düğümleri arasında IPv6 adresi pingleme.
  • UDP ile Thread düğümleri arasında mesaj iletme.

Gerekenler

Donanım:

  • IEEE 802.15.4 modüllerine sahip 2 ESP ana kartı.
  • 1 ESP İş Parçacığı Sınırı Freze 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'ndaki talimatları uygulayın.

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

ESP-THREAD-BR, resmi ESP Thread Kenarlık Yönlendirici SDK'sıdır. İş Parçacığı Yönlendiricisi derlemek için tüm temel ağ özelliklerini destekler ve hızlı ürünleştirme için ürün düzeyinde zengin özellikler entegre eder.

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

3. Geliştirme ve flaş

IEEE 802.15.4 modülleriyle ESP anakartlarında ot-cli-ftd ikili dosyası oluşturmak ve yüklemek için daha ayrıntılı bilgi için ESP-IDF örneğine (ot_cli) bakabilirsiniz:

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

Birleştirici özelliğini menü yapılandırması aracılığıyla etkinleştirin:

$ idf.py menuconfig

Bileşen yapılandırması > OpenThread > Joiner'ı etkinleştirin, ardından derleme ve Flash'ı başlatın.

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

ot-br ikili programını ESP İş Parçacığı Sınır Yönlendirici Kartı'nda oluşturmak ve yüklemek için önce RCP ikili dosyasını oluşturmanız gerekir. Bu RCP ikili dosyasının, ESP İş Parçacığı Sınırı Yönlendirici Kartı'nda cihaza açıkça yüklenmesi gerekmez. Sınır Yönlendirici ikili dosyasına eklenir ve ilk önyüklemede (veya RCP donanım yazılımı değiştirildiğinde) ESP32-H2 çipine yanıp söner. Daha ayrıntılı bilgi için ESP Thread BR dokümanlarına 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

Menü konfigürasyonu aracılığıyla komisyon üyesi özelliğini etkinleştirin:

$ idf.py menuconfig

Bileşen yapılandırması > OpenThread > Commissioner'ı etkinleştir, ardından derleme ve flash.

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

4. İş Parçacığı Kenarlığı Yönlendirici'de Thread ağı oluşturma

Artık ESP Thread Border Router Board (BR Commissioner) üzerindeki 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

Thread protokolü işlemini başlatın:

> 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. Thread ağına ağ anahtarı aracılığıyla katılın

Bu codelab'de, BR biçimli ağa katılmak için IEEE 802.15.4 modülüne sahip iki ESP panosu hazırlanmaktadır. Bu oturumda, Pano1'i ağa ekleyeceğiz.

BR'den ağ anahtarını al:

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

Bu ağ anahtarını, IEEE 802.15.4 modülleriyle bir ESP kartına (Board1 Birleştirici) 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

Thread protokolü işlemini başlatın:

> 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. Alt öğe 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 komisyon aracılığıyla Thread ağına katılın

Bu oturumda, Board2'yi (Board2) güvenlik yetkilendirmesi aracılığıyla ağa ekleyeceğiz:

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

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

Pano2 için ağ bilgilerini 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 (komisyon sorumlusu) komisyoncuyu başlatın ve Birleştirme Kimlik Bilgileriyle birlikte katılabilecek cihazın eui64 bilgisini (ör. J01NME) belirtin. Birleştirici Kimlik Bilgisi, 6 ila 32 karakter uzunluğunda olan ve tüm büyük harfli alfanümerik karakterlerden (okunabilirlik için I, O, Q ve Z hariç 0-9 ve A-Y hariç) oluşan cihaza özgü bir dizedir.

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

Board2 Joiner'a geçin. BR Commissioner'da yeni ayarladığınız Katılımcı Kimlik Bilgisi ile birleştirici rolünü başlatın:

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

Yaklaşık bir dakika içinde kimlik doğrulamanın başarılı olduğuna dair bir onay alırsınız:

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

Bu işlemin ardından BR Commissioner tarafından oluşturulan Thread ağına başlayabilir ve katılabilirsiniz.

Thread protokolü işlemini başlatın:

> 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ğıda gösterilen topolojiyle bir Thread ağı elde edersiniz:

esp_ot_tp_LRR.jpg

7. Thread düğümleri arasında IPv6 adresi pingleme

İki kart arasında iletişim kurmak için ping komutunu kullanabilirsiniz. Her kartın 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'yi pinglemek 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 Thread düğümleri arasında mesaj iletme

Bu oturumda, iki Thread cihazı arasında nasıl mesaj göndereceğinizi öğreneceksiniz. Örneğin, udp'yi açıp 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 Pano1'den BR MLE-ID adresine ve 20617 bağlantı noktasına bir mesaj gönderin:

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

BR'de alınan mesajı görebilirsiniz:

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

9. Tebrikler!

ESP ana panellerini kullanarak fiziksel bir Thread ağı oluşturdunuz.

esp_ot_final_topology.jpg

Artık şunları biliyorsunuz:

  • OpenThread CLI ikili programları oluşturma ve bunları ESP kartlarına yükleme.
  • ESP İş Parçacığı Sınır Yönlendirici kartına yanıp sönen bir sınır yönlendiricisi oluşturuluyor.
  • Thread düğümlerini ESP Monitor ve OpenThread CLI ile manuel olarak yönetme.
  • İş Parçacığı Kenarlığı Yönlendirici'de Thread ağı oluşturma.
  • Cihazların Thread ağında devreye alınmasını güvenli hale getirme.
  • Thread düğümleri arasında IPv6 adresi pingleme.
  • 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: