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

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:

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.

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