1. Giriş
Thread ve OTNS nedir?
Thread, cihazdan cihaza ve cihazdan buluta güvenli iletişimi sağlayan, IP tabanlı düşük güçte kablosuz mesh ağ protokolüdür. Thread ağları, tek bir hata noktası olmasını önlemek için topoloji değişikliklerine uyum sağlayabilir.
Google tarafından yayınlanan OpenThread, Thread'in açık kaynaklı bir uygulamasıdır. OpenThread, küçük kod boyutu ve bellek ayak izine rağmen Thread Spesifikasyonu'nda tanımlanan tüm özellikleri destekler.
OpenThread Network Simulator (OTNS), posix platformlarında simüle edilmiş OpenThread düğümleri çalıştırarak Thread ağlarını simüle etmek için kullanılabilir. OTNS, simüle edilmiş Thread ağlarını görselleştirmek ve çalıştırmak için kullanımı kolay bir web arayüzü (OTNS-Web) sağlar. Komut dosyası oluşturulmuş simülasyonlar (Python ile) da mümkündür.
Neler öğreneceksiniz?
- OTNS'yi ve bağımlılarını yükleme
- OTNS-CLI'nın temel özelliklerini öğrenin
- OTNS-Web'de OpenThread düğümlerini ekleme/taşıma/silme
- Ağ simülasyonunu kontrol etmek için OTNS-Web'in diğer faydalı özelliklerini kullanma
- OpenThread'in tek hata noktası içermediğini doğrulama
- Wireshark'ta OpenThread düğümleri arasındaki veri trafiğini görme
Bu codelab, etkileşimli kullanım için OTNS-CLI ve OTNS-Web'e odaklanmaktadır. Python komut dosyası oluşturma gibi OTNS'nin diğer özellikleri ele alınmamıştır.
İhtiyacınız olanlar
- Thread Primer. Bu Codelab'de öğretilenleri anlamak için Thread'in temel kavramlarını bilmeniz gerekir.
- Tercihen Linux x86_64 veya Homebrew yüklü Mac OS. Windows WSL2'de Ubuntu 24 veya sonraki sürümler de çalışır ancak ayarlarda bazı manuel değişiklikler yapılması gerekebilir.
- Git.
- Web tarayıcısı. OTNS-Web, simülasyonları görüntülemek için web tarayıcısı kullanır.
- Wireshark ağ protokolü analiz aracı (isteğe bağlı).
- Go 1.23 veya sonraki bir sürümü.
- Yükleme komut dosyası, yüklü Go sürümünü kontrol eder.
- Go yüklü değilse paket yöneticisinde varsa 1.23 veya daha yeni bir sürüm yüklenir.
- Paket yöneticisinden kullanılamıyorsa manuel yükleme gerekir.
- Ubuntu 24.04 veya daha eski sürümlerin Go 1.23'ü otomatik olarak desteklemediğini unutmayın. Ayrıntılar için Ubuntu belgelerindeki Available Golang versions (Kullanılabilir Golang sürümleri) sayfasına bakın.
snap
kullanılarak veya başka yöntemlerle manuel yükleme yapılabilir.
- Python 3.9 veya sonraki sürümler.
- Yükleme komut dosyası, yüklü Python sürümünü kontrol eder.
- Python 3 henüz yüklenmemişse paket yöneticisinde varsa 3.9 veya daha yeni bir sürüm yüklenir.
- Paket yöneticisinden kullanılamıyorsa manuel yükleme gerekir.
Terminoloji
Başlangıçta Thread Router olarak adlandırılan Thread Mesh Extender için teknik terim olarak "Router" kullanılır. "Düğüm", OTNS simülasyonundaki herhangi bir simüle edilmiş OpenThread cihazını ifade eder.
2. Kurulum
OTNS kodu alma
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Bu Codelab'deki tüm sonraki konsol komutları otns
dizininden çalıştırılır.
Bootstrap ve yükleme
bootstrap
komut dosyası, bağımlılıkları (gerekirse Python 3 ve Go/Golang dahil) ve OTNS'yi yükler. Python sürümü >= 3.9 veya Go sürümü >= 1.23 gibi belirli bağımlılıkları otomatik olarak yükleyemezse komut dosyasının durabileceğini unutmayın. Otomatik yükleme için paketlerin, işletim sisteminin yapılandırılmış paket deposunda bulunması gerekir.
Komut dosyası, doğrudan simülasyonda kullanılabilecek çeşitli OT düğüm türlerini de oluşturur ve bazı temel testler gerçekleştirir. Bu düğüm derlemeleri nedeniyle birkaç dakika sürebilir.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Komut dosyası yürütülürken sudo
için şifre girmeniz istenebilir.
otns
düzgün yüklenmemişse
Komut dosyası şu gibi bir hata bildirebilir:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
Bu durumda, $(go env GOPATH)/bin
değerini $PATH
değişkeninize eklemeniz gerekir.
Diğer hatalar için GitHub sorunu oluşturulabilir.
3. OTNS'yi ilk kez çalıştırma
Koşu otns
:
$ otns >_ ← OTNS-CLI prompt
Başarıyla başlatıldığında OTNS, bir CLI konsoluna (OTNS-CLI
) girer ve ağ görselleştirme ve yönetimi için bir web tarayıcısı başlatır (OTNS-Web
):
OTNS-Web için yalnızca boş bir sayfa görüyorsanız tarayıcınızda WebGL etkinleştirilmemiş olabilir. WebGL'yi etkinleştirme hakkında bilgi edinmek için lütfen https://superuser.com/a/836833 adresini ziyaret edin.
Aşağıdaki bölümlerde, OTNS-CLI
ve OTNS-Web
üzerinden OTNS simülasyonlarını yönetmeyi öğreneceksiniz.
4. OTNS-CLI ve OTNS-Web'i Tanıma
OTNS-CLI
OTNS-CLI
, OTNS simülasyonlarını yönetmek için kullanılan komut satırı arayüzüdür (KSA).
$ otns >_ ← OTNS-CLI prompt
OTNS-CLI
üzerinden komut yazabilirsiniz. Komutların tam listesi için OTNS KSA referansına bakın. Endişelenmeyin, bu Codelab'de bu komutların yalnızca birkaçını kullanacaksınız.
CLI komutlarına genel bakış için help
komutunu yazın. Bu liste, CLI referansıyla aynıdır.
> help add Add a node to the simulation and get the node ID. .... .... Done >
Belirli bir komut hakkında daha fazla yardım almak için komutun adını kullanın. Örneğin:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
, OTNS'nin ağ görselleştirme ve yönetim aracıdır. Simüle edilmiş Thread ağının düğümlerini, mesajlarını ve bağlantılarını görsel olarak gösterir. OTNS-Web
öğesinin çeşitli unsurlarına dikkat edin:
5. Düğüm Ekleme
OTNS-CLI aracılığıyla düğüm ekleme
Simülasyona bir Thread yönlendirici ekleyin:
> add router 1 Done
OTNS-Web
içinde oluşturulan bir düğümü görmelisiniz. Düğüm, yönlendirici olarak başlar ve birkaç saniye içinde lider olur:
Simülasyonları etkileşimli olarak başlatmayı kolaylaştırmak için her yeni OpenThread düğümü varsayılan olarak standart bir ağ parametreleri grubuyla devreye alınır.
OTNS-CLI
aracılığıyla daha fazla düğüm ekleme
Şimdi farklı türlerde bazı düğümler ekleyeceğiz.
> add fed 2 Done > add med 3 Done > add sed 4 Done
Düğümlerin tek bir bölüntüde birleşmesi için birkaç saniye bekleyin. OTNS-Web
içinde düğümleri görmeniz gerekir:
Ayrıca OTNS-Web
bölümünde, düğüm hakkında daha fazla bilgi içeren bir panel görüntülemek için düğümlerden herhangi birini seçebilirsiniz. Örneğin, aşağıdaki şekilde 1. düğüm seçilmiştir. Paneldeki "Rol" girişi, kullanıcının lider olduğunu onaylar.
OTNS-Web
ile düğüm ekleme
OTNS-Web
simgesini kullanarak da düğüm ekleyebilirsiniz. Action Bar
simgesinin New Router
düğmesini tıklayın. Seçilen düğümün sağında bir düğüm oluşturulduğunu görürsünüz. Yeni yönlendirici, mevcut Thread bölümüne katılmalıdır:
Bu diğer düğüm türlerini oluşturmak için işlem çubuğundaki FED, MED, SSED ve BR düğmelerini de tıklayın. Toplamda 9 düğüm olmalıdır. İsterseniz farklı bir fiziksel ağ topolojisi oluşturmak için bazı düğümleri başka konumlara sürükleyin.
Artık birçok düğüm içeren tek bölümlü bir Thread ağı oluşturdunuz. Bir sonraki bölümde, simülasyonun daha hızlı çalışması için simülasyon hızını ayarlayacağız.
6. Hızı ayarlama
Şu anda simülasyon 1X
hızında çalışıyor olmalıdır. Bu, simülasyon süresinin, ilk düğümü oluşturduğumuzdan beri geçen gerçek süreyle aynı olduğu anlamına gelir.
Hızı OTNS-CLI
üzerinden ayarlama
Simülasyon hızını OTNS-CLI
üzerinden ayarlayabilirsiniz.
Simülasyon hızını 100X
olarak ayarla
> speed 100 Done
Düğümlerin mesajları eskisinden çok daha sık gönderdiğini görürsünüz.
Simülasyon hızını MAX
olarak ayarla
> speed max Done
OTNS, olabildiğince hızlı simülasyon yapmaya çalışır. Bu nedenle, düğümlerin çok sayıda mesaj gönderdiğini görürsünüz.
Simülasyonu duraklat
> speed 0 Done
Simülasyon hızını 0
olarak ayarlamak simülasyonu duraklatır.
Simülasyonu normal hızda geri yükleme
> speed 1 Done
Simülasyon hızını 0
değerinden büyük bir değere ayarladığınızda simülasyon devam eder.
Hızı OTNS-Web
üzerinden ayarlama
Hız kontrolü düğmeleri
Action Bar
üzerindeki hız kontrolü düğmelerini bulun. Düğmelerde mevcut simülasyon hızı gösterilir. Bu düğmeler, simülasyon hızını ayarlamak ve simülasyonu duraklatıp devam ettirmek için kullanılabilir.
Simülasyonu hızlandırma
Hız MAX
: 'ye ulaşana kadar
düğmesini tıklayarak simülasyonu hızlandırabilirsiniz.
Simülasyonu yavaşlatma
düğmesini tıklayarak simülasyonu yavaşlatabilirsiniz.
Simülasyonu duraklat
Simülasyon çalışırken duraklatmak için düğmesini tıklayın. Düğme
olarak değiştirilir.
Simülasyonu devam ettir
Simülasyon duraklatıldığında devam ettirmek için düğmesini tıklayın. Düğme tekrar
olarak değiştirilir.
Simülasyon hızını 10X
olarak ayarla
Zaman kazanmak için
OTNS-CLI
simülasyon hızını ayarlamak için
10X
Böylece ağdaki topoloji değişikliklerini çok daha hızlı gözlemleyebiliriz.
> speed 10 Done
7. Radyoyu Açma/Kapatma
Simülasyon artık en az 2 yönlendirici (altıgen şekli), muhtemelen bir sınır yönlendirici (kare şekli) ve birçok alt öğe içermeli ve 10 kat hızda çalışmalıdır.
2 yönlendiricinin mevcut liderini (kırmızı kenarlık) bulun ve seçmek için tek tıklayın:
Radyoyu kapat
Lider düğümün radyosunu kapatmak için işlem çubuğundaki düğmesini tıklayın. Lider, radyo kapalıyken mesaj gönderemez veya alamaz.
Diğer yönlendiricinin veya sınır yönlendiricinin yeni lider olması için yaklaşık 12 saniye (simülasyon süresinde 120 saniye) bekleyin:
Thread ağı, yeni bir bölüm oluşturup yeni bir lider seçerek lider arızasından otomatik olarak kurtulur. Yeni bölümün de yeni bir bölüm rengi vardır.
Radyoyu aç
Radyosu kapatılan lideri seçin. Radyo bağlantısını geri yüklemek için düğmesini tıklayın:
Action Bar
Radyo bağlantısı geri yüklendikten sonra Lider, ağa yeniden bağlanmalıdır.
8. Düğümleri taşıma
OTNS, kullanıcıların OTNS-CLI
veya OTNS-Web
aracılığıyla düğümleri kolayca taşımasını sağlar.
Düğümü OTNS-CLI
üzerinden taşıma
Sınır yönlendirici düğümünü 9 yeni bir konuma taşıyın:
> move 9 50 50 Done
OTNS-Web üzerinden düğüm taşıma
5. düğümü sürükleyerek en sağ alta taşıyın. 5. düğüm artık diğer yönlendiricilerin radyo kapsama alanı dışında olduğundan yeni bir bölüm kimliğiyle kendi bölümünü oluşturur. Bölüm kimlikleri, düğümleri tıklayarak düğüm bilgileri panelinde kontrol edilebilir.
5. düğüm ile 9. düğüm arasında tek bir yeşil çizgi çizildiğini unutmayın. Bu durum genellikle bir çocukla ilgili eski bilgilerden kaynaklanır. Bu bilgiler, eski bir ebeveynin çocuk tablosunda saklanmaya devam eder. Alternatif olarak, 9. düğüm ile 5. düğüm arasındaki eski yönlendiriciden yönlendiriciye bağlantıyla ilgili güncel olmayan bilgiler de olabilir. (Veya bu durumda, oluşturma hatası da olabilir.) Sonunda, uygun zaman aşımından sonra eski bilgiler düğümlerde temizlenir.
9. Düğümleri Silme
OTNS-CLI
üzerinden düğümleri silme
5. düğümü silin:
> del 5 Done
5. düğüm simülasyondan kaybolmalıdır:
OTNS-Web
üzerinden düğümleri silme
9 numaralı Border Router düğümünü seçin ve 9 numaralı düğümü silmek için Action Bar
üzerindeki düğmesini tıklayın:
Node 1
yeni bir bölümün lideri olmalı ve kalan tüm düğümler 1. düğüme alt düğüm olarak bağlanmalıdır.
10. OTNS-CLI Node Context
OTNS-CLI
, geliştiricilerin bir düğümün durumunu teşhis etmesine yardımcı olmak için düğümlerle kolay etkileşim kurmaya yönelik düğüm bağlamı modu sağlar. Ayrıca, bu modda düğüm işlemleri de başlatılabilir.
Düğüm bağlamı moduna girme
1. düğümün düğüm bağlamını girin:
> node 1 Done node 1>
CLI istemi , geçerli düğüm bağlamını belirten node 1>
olarak değişti. Düğümle doğrudan etkileşim kuruyormuş gibi düğümde yürütülecek OpenThread KSA komutlarını yazabilirsiniz.
Komutları düğüm bağlamında yürütme
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
Başka bir düğüm bağlamına geçme
node 1> node 2 Done node 2>
Çıkış düğümü bağlamı
node 1> exit Done >
Düğüm bağlamından çıkmanın alternatif bir yolu da node 0
komutunu kullanmaktır.
11. Düğüm günlüklerini ve paket yakalamalarını görüntüleme
OpenThread düğüm günlükleri
OTNS, varsayılan olarak tüm simüle edilmiş OpenThread düğümleri için ayrıntılı günlük dosyaları oluşturur. Bunlar ./tmp
dizininde görüntülenebilir. Dosya adı 0_
. Örneğin, bir günlük dosyası alıntısı aşağıda gösterilmektedir:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
Mikrosaniye cinsinden mutlak simülasyon süresi solda gösterilir. hh:mm:ss
zaman damgası, OpenThread düğümünün kendi günlük zaman damgasını gösterir. Bu zaman damgası, mutlak simülasyon zamanından farklı olabilir.
Wireshark paket yakalamaları
Varsayılan olarak, iletilen tüm IEEE 802.15.4 çerçeveleri PCAP dosyasında current.pcap
yakalanır. Bu dosya, simülasyon sırasında veya sonrasında Wireshark tarafından okunabilir. Thread'in bağlantı katmanı şifrelemesi nedeniyle, OTNS için şifre çözme anahtarını düzgün şekilde ayarlamak üzere Wireshark'ta tek seferlik bir yapılandırma işlemi yapılması gerekir. Varsayılan olarak, Wireshark tarafından çerçeve şifre çözme işleminin kolaylaştırılması için iyi bilinen bir ağ anahtarı kullanılır.
Wireshark'ta OpenThread paket denetimi örneği için aşağıdaki ekran görüntüsüne bakın.
Şifre çözme anahtarını yapılandırmak için menüde Düzenle -> Tercihler'i seçin. Ardından, tercihler penceresinde Protocols -> IEEE 802.15.4'ü seçin. "Şifre Çözme Anahtarları"nın yanındaki Düzenle... düğmesini tıklayın. Yeni bir giriş oluşturmak için + simgesini tıklayın, 00112233445566778899aabbccddeeff
anahtarını (32 karakter) girin ve "Anahtar karması" alanında "İş parçacığı karması"nı seçin. "Şifre çözme anahtarı dizini" 0
olarak bırakılabilir. Ardından Tamam'ı ve tekrar Tamam'ı tıklayın. Artık OTNS PCAP dosyası yüklendiğinde düzgün şekilde şifresi çözülmelidir.
"Zaman" sütununda gösterilen zaman damgaları (saniye cinsinden), OpenThread düğüm günlüklerinde gösterilen mutlak simülasyon zamanı değerlerine karşılık gelir. Bu sayede günlük mesajlarını iletilen veya alınan radyo çerçeveleriyle ilişkilendirmek kolaylaşır. Ancak değerler genellikle tek mikrosaniye hassasiyetine kadar aynı değildir: Simüle edilmiş IEEE 802.15.4 radyo donanımı, OpenThread yığını tarafından bir radyo karesinin gönderilmesi istendikten sonra ek gecikme ekleyebilir.
12. Tebrikler
Tebrikler, ilk OTNS simülasyonunuzu başarıyla gerçekleştirdiniz.
OTNS'yi ve bağımlılarını nasıl yükleyeceğinizi öğrendiniz. OpenThread simüle edilmiş düğümleriyle bir OTNS simülasyonu başlattınız. OTNS-CLI
ve OTNS-Web
aracılığıyla simülasyonu çeşitli şekillerde nasıl değiştireceğinizi öğrendiniz.
Artık OTNS'nin ne olduğunu ve OpenThread ağlarını simüle etmek için OTNS'yi nasıl kullanabileceğinizi biliyorsunuz.
Sırada ne var?
Aşağıdaki codelab'lere göz atın:
- OpenThread ile Thread ağı simülasyonu
- Docker'da OpenThread kullanarak Thread ağı simülasyonu yapma
- nRF52840 kartları ve OpenThread ile Thread ağı oluşturma