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