OpenThread ile bir Thread ağını simüle etme

1. Giriş

26b7f4f6b3ea0700.png

OpenThread Google tarafından yayımlanan bir açık kaynak uygulamasıdır Konu ağ protokolü. Google Nest, bağlantılı eve yönelik ürünlerin geliştirilmesini hızlandırmak amacıyla Nest ürünlerinde kullanılan teknolojiyi geliştiricilerin geniş çapta kullanımına sunmak için OpenThread'i piyasaya sürdü.

Konu şartname ev uygulamaları için bir güvenilir, güvenli IPv6 tabanlı ve düşük güç kablosuz cihazdan cihaza iletişim protokolünü tanımlar. OpenThread, IPv6, 6LoWPAN, IEEE 802.15.4, MAC güvenliği, Mesh Bağlantısı Kurulumu ve Mesh Yönlendirme dahil olmak üzere tüm Thread ağ katmanlarını uygular.

Bu Codelab, simüle edilmiş cihazlarda bir Thread ağını simüle etme konusunda size yol gösterir.

ne öğreneceksin

  • OpenThread derleme araç zinciri nasıl kurulur
  • Bir Thread ağı nasıl simüle edilir
  • İş parçacığı düğümleri nasıl doğrulanır
  • OpenThread Daemon ile bir Thread ağı nasıl yönetilir

Neye ihtiyacın olacak

  • git
  • Temel Linux bilgisi, ağ yönlendirme

2. Yapı sistemini kurun

Git

Bu Codelab'ı tamamlamak için Git gereklidir. Devam etmeden önce indirin ve kurun.

Git'i İndir

Kurulduktan sonra, OpenThread'i indirmek ve oluşturmak için kendi işletim sisteminizin talimatlarını izleyin.

Mac OS X için XCode

XCode yüklemek ve Mac OS X üzerinde OpenThread inşa etmek gereklidir.

XCode'u indirin

XCode yüklendikten sonra XCode Komut Satırı Araçlarını yükleyin:

$ xcode-select --install

Linux / Mac OS X üzerine inşa edin

Bu kurulum talimatları Ubuntu Server 14.04 LTS ve Mac OS X Sierra 10.12.6 üzerinde test edilmiştir.

OpenThread'i yükleyin. bootstrap komutları araç zinciri takılı olduğundan emin olun ve çevre düzgün yapılandırıldığını:

$ 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'ın Docker sürümünü denemenizi öneririz.

Docker'da OpenThread Simülasyonu

3. OpenThread uygulamalarını oluşturun

Kurulumunuz tamamlandıktan sonra örnek OpenThread uygulamasını oluşturun. Bu Codelab için simülasyon örneğini kullanıyoruz.

$ cd ~/src/openthread
$ make -f examples/Makefile-simulation

Şimdi OpenThread Daemon'u oluşturun:

$ cd ~/src/openthread
$ make -f src/posix/Makefile-posix DAEMON=1

4. Bir Thread ağını simüle edin

Bu Codelab için kullanacağınız örnek uygulama, temel bir komut satırı arabirimi (CLI) aracılığıyla OpenThread yapılandırma ve yönetim arabirimlerini ortaya çıkaran minimal bir OpenThread uygulamasını gösterir.

Bu alıştırma, simüle edilmiş bir Thread cihazına başka bir simüle edilmiş Thread cihazından ping atmak için gereken minimum adımlarda size yol gösterir.

Aşağıdaki şekil, temel bir Thread ağ topolojisini açıklamaktadır. Bu alıştırma için, yeşil daire içindeki iki düğümü simüle edeceğiz: Aralarında tek bir bağlantı olan bir İplik Lideri ve İplik Yönlendiricisi.

6e3aa07675f902dc.png

Bir düğüme ping atmak

1. Düğüm 1'i Başlatın

Gidin openthread dizin ve kullanan bir simüle Konu cihaz için CLI işlem spawn ot-cli-ftd ikili.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Not: görmüyorsanız > Bu komutu çalıştırdıktan sonra istemi basın enter .

Bu ikili, POSIX'in üzerinde 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çeveleri UDP yükleri içinde geçirilir).

Argümanı 1 "Fabrikada atanan" simüle aygıt için IEEE EUI-64 nin en az anlamlı bitleri temsil eden bir dosya belirleyicisidir. Bu değer ayrıca IEEE 802.15.4 radyo öykünmesi için bir UDP bağlantı noktasına bağlanırken kullanılır (bağlantı noktası = 9000 + dosya tanımlayıcısı). Bu Codelab'deki simüle edilmiş bir Thread cihazının her örneği, farklı bir dosya tanımlayıcı kullanacaktır.

Not: Yalnızca kullanım dosya tanımlayıcıları 1 , bir simüle edilmiş aygıt için bir işlem üretmekten bu Codelab belirtildiği gibi ya da daha büyüktür. Bir dosya tanımlayıcı 0 diğer kullanılmak üzere ayrılmıştır.

Yeni bir Operasyonel Veri Kümesi oluşturun ve bunu aktif olan olarak kabul edin. Operasyonel Veri Kümesi, oluşturmakta olduğunuz Thread ağının konfigürasyonudur.

> 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 aktif olan olarak kabul et:

> 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 İplik 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 Thread arayüzüne atanan 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 adres türlerine dikkat edin:

  • İle başlar fd = örgü yerel
  • Başlar fe80 = bağlantı yerel

Mesh-yerel adres türleri ayrıca sınıflandırılır:

  • İçeren ff:fe00 = Yönlendirici Locator (RLOC)
  • İçermez ff:fe00 = Uç-Noktası Kimlik (EID)

Konsol çıktınızdaki EID'yi belirleyin, daha sonra kullanmak üzere not edin. Yukarıdaki örnek çıktıda, EID:

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. Düğüm 2'yi Başlatın

İçin yeni bir terminal ve gezinmek açın openthread dizini ve CLI işlem spawn. Bu, ikinci simüle edilmiş Thread aygıtınız:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

Not: görmüyorsanız > Bu komutu çalıştırdıktan sonra istemi basın enter .

Düğüm 1'in Operasyonel Veri Kümesi ile aynı değerleri kullanarak İş Parçacığı Ağ Anahtarını ve PAN Kimliğini yapılandırın:

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

Bu veri kümesini aktif olan olarak kabul et:

> dataset commit active
Done

IPv6 arayüzünü açın:

> ifconfig up
Done

Thread protokolü işlemini başlatın:

> thread start
Done

Cihaz kendisini Çocuk olarak başlatacaktır. İş parçacığı Alt Öğesi, yalnızca bir Ana cihazla tek noktaya yayın trafiği ileten ve alan bir İş parçacığı cihazı olan bir Son Cihaza eşdeğerdir.

> state
child
Done

2 dakika içinde gelen devlet anahtarını görmelisiniz child için router . Bir Thread Router, Thread cihazları arasında trafiği yönlendirme yeteneğine sahiptir. Ayrıca Ebeveyn olarak da adlandırılır.

> state
router
Done

Ağı doğrulayın

Kafes ağı 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'sı için yönlendirici tablosunu kontrol edin. Önce 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 RLOC 0xa800 mesh bağlı olduğunu teyit tabloda bulunmaktadır.

2. Düğüm 1'e Düğüm 2'den Ping Atma

Simüle edilmiş iki Thread cihazı arasındaki bağlantıyı doğrulayın. Düğüm 2'de, ping düğüm 1 tahsis 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

Basın enter dönmek için > CLI istemi.

Ağı test edin

Artık iki simüle edilmiş Thread cihazı arasında başarılı bir şekilde ping atabildiğinize göre, bir düğümü çevrimdışına alarak ağ ağını test edin.

Düğüm 1'e dönün ve İpliği durdurun:

> thread stop
Done

Düğüm 2'ye geçin ve durumu kontrol edin. İki dakika içinde, Düğüm lideri (Düğüm 1) çevrimdışı 2 algılar olduğunu ve Düğüm 2 geçiş olmak görmelisiniz leader ağının:

> state
router
Done
...
> state
leader
Done

Onaylandıktan sonra, çıkmadan önce İpliği 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 alıştırmaya taşınmamasını sağlamak için fabrika ayarlarına sıfırlama yapılır.

> thread stop
Done
> factoryreset
>
> exit

Ayrıca fabrika ayarlarına sıfırlayın ve Düğüm 1'den çıkın:

> factoryreset
>
> exit

Bkz OpenThread CLI Referans mevcut tüm CLI komutlarını keşfetmek için.

5. Devreye Alma ile düğümleri doğrulayın

Önceki alıştırmada, iki simüle edilmiş cihaz ve doğrulanmış bağlantı ile bir Thread ağı kurdunuz. Ancak bu, yalnızca kimliği doğrulanmamış IPv6 yerel bağlantı trafiğinin cihazlar arasında geçmesine izin verir. Küresel IPv6 trafiğini aralarında (ve bir Thread sınır yönlendiricisi aracılığıyla İnternet) yönlendirmek için düğümlerin kimliğinin doğrulanması gerekir.

Kimlik doğrulaması yapmak için bir cihazın Yetkili olarak hareket etmesi gerekir. Komisyon Üyesi, 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 yetkisi veren kişidir.

Bu alıştırmada, öncekiyle aynı iki düğümlü topolojiyi kullanacağız. Kimlik doğrulama için, İplik Lideri Komisyon Üyesi, İplik Yönlendiricisi ise Birleştirici olarak hareket edecektir.

d6a67e8a0d0b5dcb.png

1. Bir ağ oluşturun

Önceki alıştırmadan devam ediyorsanız, zaten iki terminal pencereniz açık olmalıdır. Değilse, ikisinin açık ve kullanıma hazır olduğundan emin olun. Biri Düğüm 1, diğeri Düğüm 2 olarak hizmet verecek.

Düğüm 1'de, CLI sürecini oluşturun:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Not: görmüyorsanız > Bu komutu çalıştırdıktan sonra istemi basın enter .

Yeni bir Operasyonel Veri Kümesi oluşturun, onu aktif olan olarak kabul edin 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 aktif olan olarak kabul et:

> 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 Thread Leader olduğunu doğrulayın:

> state
leader
Done

2. Komiser rolünü başlatın

Hâlâ Düğüm 1'deyken, Komiser rolünü başlatın:

> commissioner start
Done

(Kullanarak herhangi Joiner izin * ile joker) J01NME ağa komisyona Marangoz Credential. Bir Joiner, bir insan yönetici tarafından görevlendirilen bir Thread Network'e eklenen bir cihazdır.

> commissioner joiner add * J01NME
Done

3. Marangoz rolünü başlatın

İkinci bir terminal penceresinde yeni bir CLI işlemi oluşturun. Bu, Düğüm 2'dir.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

Düğüm 2 günü, kullanarak Marangoz rolünü etkinleştirmek J01NME Joiner Kimlik Bilgilerini.

> ifconfig up
Done
> joiner start J01NME
Done

... onay için birkaç saniye bekleyin ...

Join success

Bir Joiner olarak, cihaz (Düğüm 2), Komiser (Düğüm 1) ile kimliğini başarıyla doğruladı ve Thread Network kimlik bilgilerini aldı.

Artık Düğüm 2'nin kimliği doğrulandığına göre, Konuyu başlatın:

> thread start
Done

4. Ağ kimlik doğrulamasını doğrulayın

Kontrol state artık ağa katılmış olduğunu doğrulamak için, Düğüm 2. İki dakika içinde, Düğüm 2 geçişler child karşı router :

> state
child
Done
...
> state
router
Done

5. Yapılandırmayı sıfırlayın

Bir sonraki alıştırmaya hazırlanmak için konfigürasyonu sıfırlayın. Her Düğümde Thread'i durdurun, fabrika ayarlarına sıfırlayın ve simüle edilen Thread cihazından çıkın:

> thread stop
Done
> factoryreset
>
> exit

Sen basına gerekebilir enter getirmek için birkaç kez > bir sonraki istemi geri factoryreset komutu.

6. Ağı OpenThread Daemon ile yönetin

Bu alıştırma için, bir CLI örneğini (tek bir gömülü SoC Thread cihazı) ve bir Radio Co-Processor (RCP) örneğini simüle edeceğiz.

ot-daemon OpenThread çekirdek bir hizmet olarak çalışabilir, böylece, girdi ve çıktı olarak, bir UNIX soket kullanır OpenThread Posix uygulamanın bir moddur. Bir istemci, protokol olarak OpenThread CLI'yi kullanarak sokete bağlanarak bu hizmetle iletişim kurabilir.

ot-ctl tarafından sağlanan bir CLI olan ot-daemon yönetmek ve RCP yapılandırmak için. Bunu kullanarak, RCP'yi Thread cihazı tarafından oluşturulan ağa bağlayacağız.

ot-daemon kullan

Bu alıştırma, aşağıdakilere karşılık gelen üç terminal penceresi kullanacaktır:

  1. Simüle edilmiş Thread cihazının CLI örneği (Düğüm 1)
  2. ot-daemon proses
  3. ot-ctl CLI örneği

Önceki alıştırmadan devam ediyorsanız, zaten iki terminal pencereniz açık olmalıdır. Bu alıştırma için kullanılabilir üç terminal pencereniz olduğundan emin olmak için üçte birini açın.

1. Düğüm 1'i Başlatın

İlk terminal penceresinde, simüle edilmiş Thread aygıtınız için CLI sürecini oluşturun:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

Not: görmüyorsanız > Bu komutu çalıştırdıktan sonra istemi basın enter .

Yeni bir Operasyonel Veri Kümesi oluşturun, onu aktif olan olarak kabul edin 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 aktif olan olarak kabul et:

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

Simulate bir Konu ağ adımı açıklandığı gibi, tek adresi yerel bağlantı (olan fe80 ) ve üç örgü-yerel (vardır fd ). EID örgü-yerel içermez adresi ff:fe00 adresi. Bu örnek çıktısı, EID olan fd55:cf34:dea5:7994:460:872c:e807:c4ab .

Senin belirli EID tanımlayın ipaddr düğümle iletişim için kullanılacak çıktı.

2. Ot-daemon'u başlatın

İkinci terminal penceresine, gidin de openthread dizine ve başlangıç ot-daemon biz Düğüm 2. kullanın arayacağım RCP düğümü için -v Eğer günlük çıkışını ve çalışmakta olduğunu onaylamak görebilmek için bayrak ayrıntılı:

$ cd ~/src/openthread
$ ./output/posix/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'

Ne zaman başarılı, ot-daemon modu Aşağıda çıkış benzer üretir ayrıntılı içinde:

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08

Bu terminali arka planda açık ve çalışır durumda bırakın. İçine başka komut girmeyeceksiniz.

3. Ağa katılmak için ot-ctl kullanın

Biz Düğümü 2 (devreye henüz ot-daemon henüz Konu ağına RCP). Burasıdır ot-ctl geliyor. ot-ctl OpenThread CLI uygulamayla aynı CLI kullanır. Bu nedenle, kontrol edebilir ot-daemon diğer simüle Konu cihazları ile aynı şekilde düğümleri.

Ayrıca bir üçüncü terminal penceresinde, başlangıç ot-ctl :

$ ./output/posix/bin/ot-ctl
>

Sen kullanacağız ot-ctl Eğer ikinci terminal penceresinde başladığını Düğümü 2 (BİP düğüm) yönetmek için bu üçüncü terminal penceresinde ot-daemon . Kontrol state Düğüm 2:

> state
disabled
Done

Düğüm 2'nin alın eui64 özgü Joiner katılmadan kısıtlamak için:

> eui64
18b4300000000001
Done

Düğüm 1'de (ilk terminal penceresi), Komiseri başlatın ve yalnızca bu eui64'e katılmayı 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

Bir Joiner olarak, RCP (Düğüm 2), Komiser (Düğüm 1) ile kimliğini başarıyla doğruladı ve Thread Network kimlik bilgilerini aldı.

Şimdi Düğüm 2'ye Thread ağına katılın:

> thread start
Done

4. Ağ kimlik doğrulamasını doğrulayın

Kontrol state artık ağa katılmış olduğunu doğrulamak için, Düğüm 2. İki dakika içinde, Düğüm 2 geçişler child karşı router :

> state
child
Done
...
> state
router
Done

5. Bağlantıyı doğrulayın

Çık ot-ctl ile EID kullanarak, Düğüm 1 Ctrl + D kullanarak ve ana makinenin komut satırında, ping üzerinde ping6 komutu. Eğer ot-daemon RCP örneği başarıyla katılmış ve Konu ağ ile iletişim, Ping başarılı:

$ 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 kullanarak ilk Thread ağınızı başarıyla simüle ettiniz. Mükemmel!

Bu Codelab'de şunları nasıl yapacağınızı öğrendiniz:

  • OpenThread derleme araç zincirini kurun
  • Bir Thread ağını simüle edin
  • İş parçacığı düğümlerini doğrulama
  • OpenThread Daemon ile bir Thread ağını yönetin

Daha fazlasını öğrenmek istiyorsanız, şu referansları inceleyin: