1. Giriş

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.

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
- ESP-IDF kurulumu.
Yazılım geliştirme ortamını yüklemek için lütfen ESP-IDF Programlama Kılavuzu'nu inceleyin.
- 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 >

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:

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.

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:
- Desteklenen Platformlar: OpenThread'i destekleyen tüm platformları keşfedin.
- OpenThread'i derleme: OpenThread'i derleme ve yapılandırma hakkında daha fazla bilgi
- Thread Primer: Bu Codelab'de yer alan tüm Thread kavramlarını kapsar.
Referans: