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, bağlı ev için ürünlerin geliştirilmesini hızlandırmak amacıyla geliştiricilerin genel olarak kullanabilmesi için OpenThread'i kullanıma sundu.
İleti dizisi spesifikasyonu, ev uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güçlü kablosuz cihazdan cihaza iletişim protokolü tanımlar. OpenThread; IPv6, 6LoWPAN, IEEE 802.15.4 MAC güvenliği, Örgü Bağlantısı Oluşturma ve Örgü Yönlendirme dahil tüm Thread ağ iletişimi katmanlarını uygular.
Bu Codelab, simüle edilmiş cihazlarda bir Thread ağının simülasyonunu yapmanıza yardımcı olur.
Neler öğreneceksiniz?
- OpenThread derleme araç zinciri nasıl kurulur?
- Mesaj dizisi ağını simüle etme
- Mesaj dizisi düğümlerinin kimliğini doğrulama
- Bir Thread ağını OpenThread Daemon ile yönetme
Gerekenler
- git
- Linux ile ilgili temel bilgiler, ağ yönlendirme
2. Derleme sistemini ayarlama
Git
Bu Codelab'i tamamlamak için Git gereklidir. Devam etmeden önce indirin ve yükleyin.
Yüklendikten sonra, OpenThread'i indirmek ve oluşturmak için işletim sisteminizin talimatlarını uygulayın.
Mac OS X için XCode
Mac OS X'te OpenThread'i yüklemek ve oluşturmak için XCode gerekir.
XCode yüklendikten sonra XCode Command Line Tools'u yükleyin:
$ xcode-select --install
Linux / Mac OS X üzerinde derleme
Bu yükleme talimatları Ubuntu Server 14.04 LTS ve Mac OS X Sierra 10.12.6 sürümlerinde test edilmiştir.
OpenThread'i yükleyin. bootstrap
komutları, araç zincirinin yüklü olduğundan ve ortamın düzgün şekilde yapılandırıldığından emin olur:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap $ ./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 işleminiz 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 Daemon'ı oluşturun:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Mesaj dizisi ağını simüle etme
Bu Codelab için kullanacağınız örnek uygulama, OpenThread yapılandırmasını ve yönetim arayüzlerini temel bir komut satırı arayüzü (CLI) üzerinden açığa çıkaran en küçük OpenThread uygulamasını gösterir.
Bu alıştırmada, simüle edilmiş başka bir Thread cihazından simüle edilmiş bir Thread cihazına ping göndermek için gereken minimum adımlar adım adım anlatılmaktadır.
Aşağıdaki şekilde temel bir Thread ağ topolojisi açıklanmaktadır. Bu alıştırmada, yeşil daire içindeki iki düğümü simüle edeceğiz: aralarından birinde tek bir bağlantı olan bir Mesaj Dizisi Lideri ve Mesaj Dizisi Yönlendiricisi.
Düğüm pingleme
1. Düğüm 1'i başlat
openthread
dizinine gidin ve ot-cli-ftd
ikili programını kullanarak simüle edilmiş bir Thread cihazı için CLI işlemi oluşturun.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Not: Bu komutu çalıştırdıktan sonra >
istemini görmezseniz enter
tuşuna basın.
Bu ikili program, POSIX'in üst kısmında simüle edilen bir OpenThread cihazı uygular. IEEE 802.15.4 radyo sürücüsü, UDP'nin üzerine uygulanır (IEEE 802.15.4 çerçeveler UDP yükleri içinde iletilir).
1
bağımsız değişkeni, simüle edilen cihaz için "fabrikada atanmış" IEEE EUI-64 bitlerinin en az önemli bitlerini temsil eden bir dosya tanımlayıcısıdır. Bu değer, IEEE 802.15.4 radyo emülasyonu (bağlantı noktası = 9000 + dosya açıklayıcı) için bir UDP bağlantı noktasına bağlanırken de kullanılır. Bu Codelab'de simülasyonu yapılan her ileti dizisi cihazının her bir örneği farklı bir açıklayıcı tanımlayıcı 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ı kullanın. 0
dosya açıklayıcısı başka kullanım için ayrılmıştır.
Yeni bir operasyonel veri kümesi oluşturup etkin veri kümesi olarak kaydedin. Operasyonel 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
Thread protokol işlemini başlatın:
> thread start Done
Birkaç saniye bekleyin ve cihazın Mesaj Dizisi Lideri olduğunu doğrulayın. Lider, yönlendirici kimliği atamasını yönetmekten sorumlu cihazdır.
> state leader Done
Düğüm 1'in İleti Dizisi arayüzüne atanan IPv6 adreslerini görüntüleyin (çıkışı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 adres türlerini not alın:
fd
= örgü-yerel ile başlarfe80
ile başlar = link-local
Örgü yerel adres türleri daha fazla sınıflandırılır:
ff:fe00
içerir = Yönlendirici Bulucu (RLOC)ff:fe00
içermez = Uç Nokta Tanımlayıcısı (EID)
Konsol çıkışınızdaki EID'yi tanımlayın ve daha sonra kullanmak üzere kaydedin. Yukarıdaki örnek çıktıda EID:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Düğüm 2'yi başlat
Yeni bir terminal açıp openthread
dizinine gidin ve KSA işlemini oluşturun. Bu, simüle edilmiş ikinci Thread cihazınız:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Not: Bu komutu çalıştırdıktan sonra >
istemini görmezseniz enter
tuşuna basın.
Thread Ağ Anahtarı ve PAN Kimliğini, Düğüm 1'in Operasyonel Veri Kümesi ile 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
Thread protokol işlemini başlatın:
> thread start Done
Cihaz, kendini bir Çocuk olarak başlatır. İş parçacığı alt öğesi, yalnızca üst cihazla tek yönlü trafik aktaran ve alan son iş parçacığı cihazı olan son cihaza eşdeğerdir.
> state child Done
2 dakika içinde child
durumundan router
durumuna geçiş yapıldığını görürsünüz. Thread Yönlendirici, trafiği Thread cihazları arasında yönlendirebilir. Bu şekilde "Ebeveyn" olarak da adlandırılır.
> state router Done
Ağı doğrulama
Örgü ağını doğrulamanın kolay bir yolu, yönlendirici tablosuna bakmaktır.
1. Bağlantıyı kontrol edin
Düğüm 2'de RLOC16'yı edinin. RLOC16, cihazın RLOC IPv6 adresinin son 16 bitidir.
> rloc16 5800 Done
Düğüm 1'de, Düğüm 2'nin RLOC16 yönlendiricisini kontrol edin. İlk olarak Düğüm 2'nin 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 |
Düğüm 1'in 0xa800
RLOC'u tabloda, ağın bağlı olduğunu doğrular.
2. Düğüm 2'den Düğüm 1 pinglensin
Simülasyonu yapılan iki Thread cihazı arasındaki bağlantıyı doğrulayın. Düğüm 2'de, ping
Düğüm 1'e 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
>
KSA istemine dönmek için enter
düğmesine basın.
Ağı test etme
Artık simüle edilmiş iki ileti dizisi cihazı arasında başarılı bir şekilde ping' oluşturabileceğinize göre bir düğümü çevrimdışı tutarak örgü ağını test edin.
Düğüm 1'e dönün ve İleti Dizisini durdurun:
> thread stop Done
Düğüm 2'ye geçin ve durumu kontrol edin. Düğüm 2, iki dakika içinde öncünün (1. düğüm) çevrimdışı olduğunu algılar ve 2. düğümün, ağın leader
olduğu bir geçiş görürsünüz:
> state router Done ... > state leader Done
Onaylandıktan sonra çıkış yapmadan önce ileti dizisini durdurun ve Düğüm 2'yi fabrika ayarlarına sıfırlayın. Bu alıştırmada kullandığımız Thread ağ kimlik bilgilerinin bir sonraki egzersize taşınmadığından emin olmak için fabrika ayarlarına sıfırlama işlemi yapıldı.
> thread stop Done > factoryreset > > exit
Ayrıca, fabrika ayarlarına sıfırlayıp Düğüm 1'den çıkın:
> factoryreset > > exit
Mevcut tüm CLI komutlarını keşfetmek için OpenThread CLI Referansı bölümüne bakın.
5. Komisyon ile düğümleri doğrulayın
Önceki alıştırmada, simüle edilmiş iki cihaz ve doğrulanmış bağlantı içeren bir Thread ağı oluşturuyorsunuz. Ancak bu sayede yalnızca kimliği doğrulanmamış IPv6 bağlantı yerel trafiğinin cihazlar arasında geçmesine izin verilir. Genel IPv6 trafiğini aralarında (ve Thread satır yönlendiricisi üzerinden internetlerde) yönlendirmek için düğümlerin kimliği doğrulanmalıdır.
Kimlik doğrulaması için bir cihazın Komisyoncu olarak işlem yapması gerekir. Komisyon görevlisi, yeni Thread cihazları için şu anda seçilmiş olan kimlik doğrulama sunucusu ve cihazların ağa katılması için gereken ağ kimlik bilgilerini sağlama yetkisidir.
Bu alıştırmada, daha önce olduğu gibi iki düğümlü topolojiyi kullanacağız. İleti Dizisi Yöneticisi, kimlik doğrulama için Komisyoncu olarak, Thread Yönlendiricisi ise Tamamlayıcı olarak hareket eder.
1. Ağ oluşturun
Önceki alıştırmaya devam ediyorsanız halihazırda iki terminal pencerenizin açık olması gerekir. Etkin değilse iki cihazın da açık ve kullanıma hazır olduğundan emin olun. Biri Düğüm 1, diğeri Düğüm 2 olarak işlev görür.
Düğüm 1'de KSA işlemi oluşur:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Not: Bu komutu çalıştırdıktan sonra >
istemini görmezseniz enter
tuşuna basın.
Yeni bir operasyonel veri kümesi oluşturun, etkin veri kümesi olarak kaydedin ve ileti dizisini 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
Thread protokol işlemini başlatın:
> thread start Done
Birkaç saniye bekleyin ve cihazın bir Mesaj Dizisi Lideri olduğunu doğrulayın:
> state leader Done
2. Komisyoncu rolünü başlatın
Düğüm 1'den ayrılmadan Komisyoncu rolünü başlatın:
> commissioner start Done
J01NME
Birleştirici Kimlik ile, herhangi bir Birleştirici'nin (*
joker karakterini kullanarak) ağa komisyon almasına izin verin. Tamamlayıcı, gerçek bir yönetici tarafından, yürütülen bir iş parçacığı ağına eklenen bir cihazdır.
> commissioner joiner add * J01NME Done
3. Düzenleyen rolünü başlatma
İkinci bir terminal penceresinde yeni bir KSA işlemi oluşturun. Bu Düğüm 2'dir.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Düğüm 2'de J01NME
Tamamlayıcı Kimliği'ni kullanarak Birleştirici rolünü etkinleştirin.
> ifconfig up Done > joiner start J01NME Done
... onay için birkaç saniye bekleyin ...
Join success
Birleştirilmiş olan cihaz (Düğüm 2), Komite (Node 1) ile kimlik doğrulamasını başarıyla gerçekleştirmiş ve Thread Ağ kimlik bilgisini almıştır.
Düğüm 2'nin kimliği doğrulandıktan sonra İleti Dizisini başlatın:
> thread start Done
4. Ağ kimlik doğrulamasını doğrulama
Düğüm 2'de state
ağının ağa katıldığını doğrulamak için kontrol edin. Düğüm 2, iki dakika içinde child
ürününden router
ürününe geçer:
> state child Done ... > state router Done
5. Yapılandırmayı sıfırla
Bir sonraki egzersize hazırlanmak için yapılandırmayı sıfırlayın. Her Düğümde, İleti Dizisini durdurun, fabrika ayarlarına sıfırlayın ve simüle edilmiş İleti Dizisi cihazından çıkın:
> thread stop Done > factoryreset > > exit
>
komutunu factoryreset
komutundan sonra geri getirmek için birkaç kez enter
düğmesine basmanız gerekebilir.
6. OpenThread Daemon ile ağı yönetin
Bu alıştırmada bir CLI örneği (tek bir yerleşik SoC Thread cihazı) ve bir Radyo Ortak İşlemci (RCP) örneği simüle edeceğiz.
ot-daemon
, giriş ve çıkış olarak bir UNIX soketi kullanan bir OpenThread Posix uygulaması modudur. Böylece, OpenThread core hizmet olarak çalışabilir. İstemciler, 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 KSA'dır. Bu seçeneği kullanarak RCP'yi Thread cihazı tarafından oluşturulan ağa bağlayacağız.
Ot Daemon kullanın
Bu alıştırmada, aşağıdaki ifadelere karşılık gelen üç terminal penceresi kullanılacaktır:
- Thread simülasyonu cihazının CLI örneği (Düğüm 1)
ot-daemon
işlemot-ctl
KSA örneği
Önceki alıştırmaya devam ederseniz halihazırda iki terminal penceresi açmış olmanız gerekir. Bu alıştırmada kullanabileceğiniz üç terminal penceresi bulunduğundan emin olmak için üçüncü bir pencere açın.
1. Düğüm 1'i başlat
İlk terminal penceresinde, simüle edilmiş Thread cihazınızla ilgili CLI sürecini oluşturun:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Not: Bu komutu çalıştırdıktan sonra >
istemini görmezseniz enter
tuşuna basın.
Yeni bir operasyonel veri kümesi oluşturun, etkin veri kümesi olarak kaydedin ve ileti dizisini 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
Thread protokol işlemini başlatın:
> thread start Done
Düğüm 1'in İleti Dizisi arayüzüne atanan 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 >
İleti dizisi ağını simüle etme adımında açıklandığı gibi, bir adres yerel bağlantıdır (fe80
), üçü de örgü-yerel (fd
). EID, adreste ff:fe00
içermeyen örgü-yerel adrestir. Bu örnek çıkışta EID, fd55:cf34:dea5:7994:460:872c:e807:c4ab
şeklindedir.
ipaddr
çıkışınızdaki belirli EID'yi tanımlayın. Bu kimlik, düğümle iletişim kurmak için kullanılır.
2. Ot Daemon'u Başlat
İkinci terminal penceresinde, openthread
dizinine gidin ve bir RCP düğümü için ot-daemon
başlatın. Düğüm 2 olarak adlandıracağız. Günlük çıktısını görüp çalışıp çalıştığını onaylayabilmek için -v
ayrıntılı işaretini kullanın ve sudo
etiketini 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'
İşlem başarılı olduğunda ayrıntılı modda ot-daemon
aşağıdakine benzer çıkışlar 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 arka planda açık ve çalışır durumda bırakın. Buraya başka komut girmeyeceksiniz.
3. Ağa katılmak için ot-ctl kullanma
Düğüm 2'yi (ot-daemon
RCP), henüz herhangi bir Thread ağına atamadık. ot-ctl
bu noktada devreye girer. ot-ctl
, OpenThread CLI uygulamasıyla aynı CLI'yı kullanır. Bu nedenle, ot-daemon
düğümlerini diğer Thread simülasyonundaki cihazlarla 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örmezseniz enter
tuşuna basın.
ot-daemon
ile ikinci terminal penceresinde başlattığınız Düğüm 2'yi (RCP düğümü) yönetmek için bu üçüncü terminal penceresinde ot-ctl
kullanacaksınız. Düğüm 2'nin state
değerini kontrol edin:
> state disabled Done
Belirli bir birleştiriciyle katılımı kısıtlamak için Düğüm 2'nin eui64
kodunu alın:
> eui64 18b4300000000001 Done
Düğüm 1'de (ilk terminal penceresi), komisyoncuyu başlatın ve birleştirme işlemini yalnızca bu eui64 ile kısıtlayın:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
Düğüm 2'de (üçüncü terminal penceresi) ağ arayüzünü açın ve ağa katılın:
> ifconfig up Done > joiner start J01NME Done
... onay için birkaç saniye bekleyin ...
Join success
Birleşim olarak RCP (Node 2), yüksek güvenlik komisyonu (1. düğüm) ile kimlik doğrulamasını başarıyla gerçekleştirdi ve Thread ağ kimlik bilgilerini aldı.
Şimdi Düğüm 2'yi Thread ağına birleştirin:
> thread start Done
4. Ağ kimlik doğrulamasını doğrulama
Düğüm 2'de state
ağının ağa katıldığını doğrulamak için kontrol edin. Düğüm 2, iki dakika içinde child
ürününden router
ürününe geçer:
> state child Done ... > state router Done
5. Bağlantıyı doğrulama
Ctrl+D veya exit
komutunu kullanarak ot-ctl
cihazından çıkın ve ana makinenizin komut satırında EID'yi ping6
komutuyla kullanarak Düğüm 1'i pingleyin. ot-daemon
RCP örneği başarıyla Thread ağına bağlanıp bu ağ ile iletişim kuruyorsa ping şu işlemleri gerçekleştirir:
$ 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ı yapmayı öğrendiniz:
- OpenThread derleme araç zincirini kurma
- Mesaj dizisi ağını simüle etme
- İleti dizisi düğümlerinin kimliğini doğrulama
- Bir Thread ağını OpenThread Daemon ile yönetme
Daha fazla bilgi edinmek istiyorsanız şu referansları inceleyin: