1. Giriş

Google tarafından yayınlanan OpenThread, Thread ağ protokolünün açık kaynaklı bir uygulamasıdır. Google Nest, Nest ürünlerinde kullanılan teknolojiyi geliştiricilerin kullanımına sunarak bağlantılı ev ürünlerinin geliştirilmesini hızlandırmak için OpenThread'i yayınladı.
Thread spesifikasyonu, ev uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güç tüketen kablosuz cihazdan cihaza iletişim protokolünü tanımlar. OpenThread, IPv6, 6LoWPAN, MAC güvenliği ile IEEE 802.15.4, Mesh Link Establishment ve Mesh Routing dahil olmak üzere tüm Thread ağ katmanlarını uygular.
Bu Codelab'de, simüle edilmiş cihazlarda Thread ağı simülasyonu yapma konusunda size yol gösterilir.
Neler öğreneceksiniz?
- OpenThread derleme araç zinciri nasıl ayarlanır?
- Thread ağı simülasyonu yapma
- Thread düğümlerinin kimliği nasıl doğrulanır?
- OpenThread Daemon ile Thread ağını yönetme
İhtiyacınız olanlar
- git
- Linux ve ağ yönlendirme hakkında temel bilgiler
2. Derleme sistemini ayarlama
Git
Bu Codelab'i tamamlamak için Git gereklidir. Devam etmeden önce indirip yükleyin.
Yüklendikten sonra OpenThread'i indirmek ve oluşturmak için işletim sisteminize özel talimatları uygulayın.
Mac OS X için XCode
OpenThread'i Mac OS X'e yüklemek ve derlemek için XCode gereklidir.
XCode yüklendikten sonra XCode Command Line Tools'u yükleyin:
$ xcode-select --install
Linux / Mac OS X'te geliştirme
Bu yükleme talimatları Ubuntu Server 14.04 LTS ve Mac OS X Sierra 10.12.6'da test edilmiştir.
OpenThread'i yükleyin. bootstrap komutları, araç zincirinin yüklendiğinden ve ortamın doğru şekilde yapılandırıldığından emin olmanızı sağlar:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
Windows'u kullanma
Windows'u tercih ediyorsanız bu Codelab'in Docker sürümünü denemenizi öneririz.
3. OpenThread uygulamalarını oluşturma
Yükleme tamamlandıktan sonra örnek OpenThread uygulamasını oluşturun. Bu Codelab'de simülasyon örneğini kullanıyoruz.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Şimdi OpenThread arka plan programını oluşturun:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Thread ağı simülasyonu
Bu Codelab'de kullanacağınız örnek uygulama, OpenThread yapılandırma ve yönetim arayüzlerini temel bir komut satırı arayüzü (CLI) üzerinden kullanıma sunan minimum düzeyde bir OpenThread uygulamasını gösterir.
Bu alıştırma, bir simüle edilmiş Thread cihazından başka bir simüle edilmiş Thread cihazına ping göndermek için gereken minimum adımları gösterir.
Aşağıdaki şekilde temel bir Thread ağ topolojisi açıklanmaktadır. Bu alıştırmada, yeşil daire içindeki iki düğümü (bir Thread lideri ve aralarında tek bağlantı olan bir Thread yönlendiricisi) simüle edeceğiz.

Bir düğüme ping gönderme
1. 1. Düğümü Başlatma
openthread dizinine gidin ve ot-cli-ftd ikili programını kullanarak simüle edilmiş bir Thread cihazı için KSA sürecini başlatın.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Not: Bu komutu çalıştırdıktan sonra > istemini görmüyorsanız enter tuşuna basın.
Bu ikili program, POSIX üzerinde simüle edilmiş bir OpenThread cihazı uygular. IEEE 802.15.4 radyo sürücüsü, UDP'nin üzerinde uygulanır (IEEE 802.15.4 çerçeveleri, UDP yükleri içinde iletilir).
1 bağımsız değişkeni, simüle edilmiş cihaz için "fabrika tarafından atanmış" IEEE EUI-64'ün en az önemli bitlerini temsil eden bir dosya tanımlayıcısıdır. Bu değer, IEEE 802.15.4 radyo emülasyonu için bir UDP bağlantı noktasına bağlanırken de kullanılır (bağlantı noktası = 9000 + dosya tanımlayıcısı). Bu Codelab'deki her bir simüle edilmiş Thread cihazı örneği farklı bir dosya tanımlayıcısı kullanır.
Not: Simüle edilmiş bir cihaz için işlem oluştururken yalnızca bu Codelab'de belirtildiği gibi 1 veya daha büyük dosya tanımlayıcılarını kullanın. 0 dosya tanımlayıcısı başka bir kullanım için ayrılmıştır.
Yeni bir operasyonel veri kümesi oluşturun ve bunu etkin veri kümesi olarak kaydedin. İşletim Veri Kümesi, oluşturduğunuz Thread ağının yapılandırmasıdır.
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Bu veri kümesini etkin veri kümesi olarak kaydedin:
> dataset commit active Done
IPv6 arayüzünü açın:
> ifconfig up Done
Start Thread protokol işlemi:
> thread start Done
Birkaç saniye bekleyin ve cihazın Thread lideri olduğunu doğrulayın. Lider, yönlendirici kimliği atamasını yönetmekten sorumlu cihazdır.
> state leader Done
1. düğümün Thread arayüzüne atanmış IPv6 adreslerini görüntüleyin (çıktınız farklı olacaktır):
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
Belirli IPv6 adresi türlerini not edin:
fd= mesh-local ile başlarfe80ile başlar = bağlantı yerel
Ağa özgü adres türleri daha ayrıntılı olarak sınıflandırılır:
ff:fe00= Yönlendirici Bulucu (RLOC) içerirff:fe00= Uç nokta tanımlayıcısı (EID) içermiyor
Konsol çıkışınızda EID'yi belirleyin ve daha sonra kullanmak üzere not edin. Yukarıdaki örnek çıktıda EID:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. 2. Düğümü Başlatma
Yeni bir terminal açın, openthread dizinine gidin ve CLI sürecini başlatın. Bu, ikinci simüle edilmiş Thread cihazınızdır:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Not: Bu komutu çalıştırdıktan sonra > istemini görmüyorsanız enter tuşuna basın.
İş parçacığı ağı anahtarını ve PAN kimliğini, 1. düğümün operasyonel veri kümesiyle aynı değerleri kullanarak yapılandırın:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Bu veri kümesini etkin veri kümesi olarak kaydedin:
> dataset commit active Done
IPv6 arayüzünü açın:
> ifconfig up Done
Start Thread protokol işlemi:
> thread start Done
Cihaz, kendisini çocuk cihazı olarak başlatır. Thread Child, yalnızca bir Parent cihazla tek noktaya yayın trafiği ileten ve alan bir Thread cihazı olan End Device'a eşdeğerdir.
> state child Done
2 dakika içinde durumun child'dan router'ya değiştiğini görürsünüz. Thread yönlendirici, Thread cihazları arasındaki trafiği yönlendirebilir. Üst öğe olarak da adlandırılır.
> state router Done
Ağı doğrulama
Bağlantılı ağı doğrulamanın kolay bir yolu, yönlendirici tablosuna bakmaktır.
1. Bağlantıyı kontrol edin
2. düğümde RLOC16'yı alın. RLOC16, cihazın RLOC IPv6 adresinin son 16 bitidir.
> rloc16 5800 Done
1. düğümde, 2. düğümün RLOC16'sı için yönlendirici tablosunu kontrol edin. 2. düğümün önce yönlendirici durumuna geçtiğinden emin olun.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
1. düğümün 0xa800 RLOC'si tabloda bulunarak ağa bağlı olduğu onaylanır.
2. Node 2'den Node 1'e ping atma
İki simüle edilmiş Thread cihazı arasındaki bağlantıyı doğrulayın. 2. düğümde, ping 1. düğüme atanan EID:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
> CLI istemine dönmek için enter tuşuna basın.
Ağı test etme
Artık iki simüle edilmiş Thread cihazı arasında başarılı bir şekilde ping işlemi gerçekleştirebildiğinize göre bir düğümü çevrimdışı duruma getirerek bağlantılı ağı test edin.
1. düğüme dönün ve iş parçacığını durdurun:
> thread stop Done
2. düğüme geçin ve durumu kontrol edin. İki dakika içinde 2. düğüm, liderin (1. düğüm) çevrimdışı olduğunu algılar ve 2. düğümün ağın leader olarak geçiş yaptığını görürsünüz:
> state router Done ... > state leader Done
Onaylandıktan sonra Thread'i durdurun ve çıkmadan önce 2. düğümü fabrika ayarlarına sıfırlayın. Fabrika ayarlarına sıfırlama işlemi, bu alıştırmada kullandığımız Thread ağı kimlik bilgilerinin bir sonraki alıştırmaya aktarılmamasını sağlamak için yapılır.
> thread stop Done > factoryreset > > exit
Ayrıca, Node 1'i fabrika ayarlarına sıfırlayın ve çıkın:
> factoryreset > > exit
Kullanılabilir tüm KSA komutlarını incelemek için OpenThread KSA Referansı'na bakın.
5. Düğümleri devreye alma ile kimlik doğrulama
Önceki alıştırmada, iki simüle edilmiş cihazla bir Thread ağı kurmuş ve bağlantıyı doğrulamıştınız. Ancak bu yalnızca kimliği doğrulanmamış IPv6 bağlantı yerel trafiğinin cihazlar arasında geçmesine izin verir. Global IPv6 trafiğini aralarında (ve Thread sınır yönlendiricisi aracılığıyla internette) yönlendirmek için düğümlerin kimliği doğrulanmalıdır.
Kimlik doğrulaması yapmak için bir cihazın Komisyon Üyesi olarak hareket etmesi gerekir. Yetkilendirilmiş kullanıcı, yeni Thread cihazları için şu anda seçilmiş kimlik doğrulama sunucusudur ve cihazların ağa katılması için gereken ağ kimlik bilgilerini sağlayan yetkilidir.
Bu alıştırmada, daha önce kullandığımız iki düğümlü topolojiyi kullanacağız. Kimlik doğrulama için Thread lideri, yetkili olarak; Thread yönlendirici ise katılımcı olarak görev yapar.

1. Ağ oluşturun
Önceki alıştırmadan devam ediyorsanız iki terminal penceresi açık olmalıdır. Açık değilse ikisinin de açık ve kullanıma hazır olduğundan emin olun. Biri 1. düğüm, diğeri 2. düğüm olarak kullanılır.
1. düğümde CLI işlemini oluşturun:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Not: Bu komutu çalıştırdıktan sonra > istemini görmüyorsanız enter tuşuna basın.
Yeni bir Operasyonel Veri Kümesi oluşturun, bunu etkin olarak kaydedin ve Thread'i başlatın:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
Bu veri kümesini etkin veri kümesi olarak kaydedin:
> dataset commit active Done
IPv6 arayüzünü açın:
> ifconfig up Done
Start Thread protokol işlemi:
> thread start Done
Birkaç saniye bekleyin ve cihazın Thread lideri olduğunu doğrulayın:
> state leader Done
2. Komisyon üyesi rolünü başlatma
Hâlâ 1. Düğüm'deyken Komisyon Üyesi rolünü başlatın:
> commissioner start Done
* joker karakterini kullanarak J01NME Katılımcı Kimlik Bilgisi'ne sahip tüm katılımcıların ağa katılmasına izin verin. Katılımcı, bir insan yönetici tarafından görevlendirilmiş bir Thread ağına eklenen bir cihazdır.
> commissioner joiner add * J01NME Done
3. Birleştirici rolünü başlatma
İkinci bir terminal penceresinde yeni bir CLI işlemi oluşturun. Bu, 2. düğümdür.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
2. düğümde, J01NME Joiner Credential'ı kullanarak Joiner rolünü etkinleştirin.
> ifconfig up Done > joiner start J01NME Done
... onay için birkaç saniye bekleyin ...
Join success
Katılımcı olarak cihaz (2. düğüm), Komisyoner (1. düğüm) ile kimliğini başarıyla doğruladı ve Thread ağı kimlik bilgilerini aldı.
2. düğümün kimliği doğrulandığına göre Thread'i başlatın:
> thread start Done
4. Ağ kimlik doğrulamasını doğrulama
Node 2'deki state öğesini kontrol ederek ağa katıldığını doğrulayın. İki dakika içinde 2. düğüm child'dan router'ye geçer:
> state child Done ... > state router Done
5. Yapılandırmayı sıfırlama
Bir sonraki alıştırmaya hazırlanmak için yapılandırmayı sıfırlayın. Her düğümde Thread'i durdurun, fabrika ayarlarına sıfırlama işlemi yapın ve simüle edilmiş Thread cihazından çıkın:
> thread stop Done > factoryreset > > exit
factoryreset komutundan sonra > istemini geri getirmek için enter tuşuna birkaç kez basmanız gerekebilir.
6. OpenThread Daemon ile ağı yönetme
Bu alıştırmada bir CLI örneğini (tek bir yerleşik SoC Thread cihazı) ve bir Radyo Yardımcı İşlemcisi (RCP) örneğini simüle edeceğiz.
ot-daemon, OpenThread çekirdeğinin hizmet olarak çalışabilmesi için giriş ve çıkış olarak UNIX soketi kullanan OpenThread Posix uygulamasının bir modudur. Bir istemci, protokol olarak OpenThread CLI'yı kullanarak sokete bağlanarak bu hizmetle iletişim kurabilir.
ot-ctl, RCP'yi yönetmek ve yapılandırmak için ot-daemon tarafından sağlanan bir CLI'dır. Bunu kullanarak RCP'yi Thread cihazı tarafından oluşturulan ağa bağlayacağız.
ot-daemon'u kullanma
Bu alıştırmada, aşağıdakilere karşılık gelen üç terminal penceresi kullanılacaktır:
- Simüle edilmiş Thread cihazının (Node 1) KSA örneği
ot-daemonsüreciot-ctlCLI örneği
Önceki alıştırmadan devam ediyorsanız iki terminal penceresi açık olmalıdır. Üçüncü bir terminal penceresi açarak bu alıştırma için üç terminal penceresinin kullanılabilir olduğundan emin olun.
1. 1. Düğümü Başlatma
İlk terminal penceresinde, simüle edilmiş Thread cihazınız için KSA sürecini başlatın:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Not: Bu komutu çalıştırdıktan sonra > istemini görmüyorsanız enter tuşuna basın.
Yeni bir Operasyonel Veri Kümesi oluşturun, bunu etkin olarak kaydedin ve Thread'i başlatın:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
Bu veri kümesini etkin veri kümesi olarak kaydedin:
> dataset commit active Done
IPv6 arayüzünü açın:
> ifconfig up Done
Start Thread protokol işlemi:
> thread start Done
1. düğümün Thread arayüzüne atanmış IPv6 adreslerini görüntüleyin:
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
Simüle edilmiş bir Thread ağı adımında açıklandığı gibi, bir adres bağlantı yerel (fe80), üç adres ise ağ yereldir (fd). EID, adresinde ff:fe00 içermeyen ağ yerel adresidir. Bu örnek çıktıda EID fd55:cf34:dea5:7994:460:872c:e807:c4ab'dir.
ipaddr çıktınızdaki düğümle iletişim kurmak için kullanılacak EID'yi belirleyin.
2. ot-daemon'u başlatma
İkinci terminal penceresinde openthread dizinine gidin ve Node 2 olarak adlandıracağımız bir RCP düğümü için ot-daemon'yi başlatın. Günlük çıktısını görebilmek ve çalıştığını onaylayabilmek için -v verbose işaretini kullanın ve sudo işaretini kullandığınızdan emin olun:
$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty://build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
Başarılı olduğunda ayrıntılı moddaki ot-daemon, aşağıdakine benzer bir çıktı oluşturur:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
Bu terminali açık bırakın ve arka planda çalışmaya devam edin. Bu pencereye başka komut girmeyeceksiniz.
3. Ağa katılmak için ot-ctl'yi kullanma
Node 2'yi (ot-daemon RCP) henüz herhangi bir Thread ağına atamadık. Bu noktada ot-ctl devreye girer. ot-ctl, OpenThread CLI uygulamasıyla aynı CLI'yı kullanır. Bu nedenle, ot-daemon düğümlerini diğer simüle edilmiş Thread cihazlarıyla aynı şekilde kontrol edebilirsiniz.
Üçüncü bir terminal penceresinde ot-ctl'ı başlatın:
$ sudo ./build/posix/src/posix/ot-ctl >
Not: Bu komutu çalıştırdıktan sonra > istemini görmüyorsanız enter tuşuna basın.
Bu üçüncü terminal penceresinde, ikinci terminal penceresinde ot-daemon ile başlattığınız Node 2'yi (RCP düğümü) yönetmek için ot-ctl komutunu kullanacaksınız. 2. düğümün state değerini kontrol edin:
> state disabled Done
Katılma işlemini belirli bir katılımcıyla kısıtlamak için Node 2'nin eui64 değerini alın:
> eui64 18b4300000000001 Done
1. düğümde (ilk terminal penceresi) Komisyon Üyesi'ni başlatın ve katılımı yalnızca bu eui64 ile sınırlayın:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
2. düğümde (üçüncü terminal penceresi) ağ arayüzünü etkinleştirin ve ağa katılın:
> ifconfig up Done > joiner start J01NME Done
... onay için birkaç saniye bekleyin ...
Join success
Katılımcı olarak RCP (Node 2), Komisyon Üyesi (Node 1) ile kimliğini başarıyla doğrulamış ve Thread ağı kimlik bilgilerini almıştır.
Şimdi 2. düğümü Thread ağına bağlayın:
> thread start Done
4. Ağ kimlik doğrulamasını doğrulama
Node 2'deki state öğesini kontrol ederek ağa katıldığını doğrulayın. İki dakika içinde 2. düğüm child'dan router'ye geçer:
> state child Done ... > state router Done
5. Bağlantıyı doğrulama
ot-ctl'dan Ctrl+D veya exit komutunu kullanarak çıkın ve ana makinenizin komut satırında ping6 komutuyla EID'sini kullanarak 1. düğüme ping gönderin. ot-daemon RCP örneği Thread ağına başarıyla katılır ve ağ ile iletişim kurarsa ping başarılı olur:
$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
7. Tebrikler!
OpenThread'i kullanarak ilk Thread ağınızı başarıyla simüle ettiniz. Mükemmel!
Bu Codelab'de şunları öğrendiniz:
- OpenThread derleme araç zincirini ayarlama
- Thread ağı simülasyonu
- Thread düğümlerinin kimliğini doğrulama
- OpenThread Daemon ile Thread ağını yönetme
Daha fazla bilgi edinmek isterseniz aşağıdaki referansları inceleyin: