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ğlantılı ev için ürünlerin geliştirilmesini hızlandırmak amacıyla geliştiricilere yaygın olarak sunmak için OpenThread'i piyasaya sürdü.
İş parçacığı özelliği , ev uygulamaları için IPv6 tabanlı, güvenilir, güvenli ve düşük güç tüketen kablosuz bir aygıttan aygıta iletişim protokolünü tanımlar. OpenThread, IPv6, 6LoWPAN, IEEE 802.15.4 ile MAC güvenliği, Mesh Link Establishment ve Mesh Routing dahil olmak üzere tüm Thread ağ katmanlarını uygular.
Bu Codelab'de, OpenThread'i gerçek donanım üzerinde programlayacak, bir Thread ağı oluşturacak ve yönetecek ve düğümler arasında mesajlar ileteceksiniz.
Ne öğreneceksin
- OpenThread CLI ikili dosyalarını geliştirme ve geliştirme panolarına gönderme
- Bir Linux makinesi ve bir geliştirme kartından oluşan bir RCP oluşturma
- OpenThread Daemon ve
ot-ctl
kullanarak RCP ile iletişim kurma - Thread düğümlerini Screen ve OpenThread CLI ile manuel olarak yönetme
- Cihazların bir Thread ağında güvenli bir şekilde devreye alınması
- IPv6 çok noktaya yayın nasıl çalışır?
- İletileri UDP ile iş parçacığı düğümleri arasında geçirme
Neye ihtiyacın olacak
Donanım:
- 3 Nordic Semiconductor nRF52840 geliştirme kartı
- Kartları bağlamak için 3 USB'den Mikro-USB'ye kablolar
- En az 3 USB bağlantı noktasına sahip bir Linux makinesi
Yazılım:
- GNU Araç Zinciri
- Nordic nRF5x komut satırı araçları
- Segger J-Link yazılımı
- OpenThread
- Git
Aksi belirtilmedikçe, bu Codelab'in içeriği Creative Commons Attribution 3.0 Lisansı altında, kod örnekleri ise Apache 2.0 Lisansı altında lisanslanmıştır .
OpenThread Simülasyonu
Başlamadan önce, temel Thread kavramlarına ve OpenThread CLI'ye aşina olmak için OpenThread Simulation Codelab'i incelemek isteyebilirsiniz.
Seri port terminalleri
Bir terminal aracılığıyla bir seri bağlantı noktasına nasıl bağlanılacağına aşina olmalısınız. Bu Codelab, Ekranı kullanır ve bir kullanıma genel bakış sağlar, ancak diğer herhangi bir terminal yazılımı da kullanılabilir.
Linux makinesi
Bu Codelab, bir Radyo Eş İşlemci (RCP) İş Parçacığı aygıtına ana bilgisayar olarak hizmet etmek ve tüm İş Parçacığı geliştirme kartlarını flaş etmek için i386 veya x86 tabanlı bir Linux makinesi kullanmak üzere tasarlanmıştır. Tüm adımlar Ubuntu 14.04.5 LTS (Trusty Tahr) üzerinde test edildi.
Nordic Semiconductor nRF52840 panoları
Bu Codelab, üç nRF52840 PDK kartı kullanır.
SEGGER J-Link'i kurun
Dahili JTAG modüllerine sahip nRF52840 kartlarını programlamak için SEGGER J-Link kullanıyoruz. Bunu Linux makinenize kurun.
Makineniz için uygun paketi indirin ve uygun yere kurun. Linux'ta bu /opt/SEGGER/JLink
.
NRF5x Komut Satırı Araçlarını Kurun
NRF5x Komut Satırı Araçları, OpenThread ikili dosyalarını nRF52840 kartlarına göndermenizi sağlar. Linux makinenize uygun nRF5x-Komut Satırı Araçları- <OS> yapısını kurun.
Çıkarılan paketi kök klasöre yerleştirin ~/
ARM GNU Toolchain'i yükleyin
ARM GNU Araç Zinciri oluşturmak için kullanılır.
Çıkarılan arşivi Linux makinenize /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
yerleştirmenizi öneririz. Kurulum talimatları için arşivin readme.txt
dosyasındaki talimatları izleyin.
Kurulum Ekranı (isteğe bağlı)
Ekran, bir seri bağlantı noktasıyla bağlanan cihazlara erişmek için basit bir araçtır. Bu Codelab, Screen'i kullanır, ancak dilediğiniz herhangi bir seri port terminal uygulamasını kullanabilirsiniz.
$ sudo apt-get install screen
OpenThread
OpenThread'i klonlayın ve yükleyin. script/bootstrap
komutları, araç zincirinin kurulduğundan ve ortamın doğru şekilde yapılandırıldığından emin olun:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
OpenThread Daemon oluşturun:
$ script/cmake-build posix -DOT_DAEMON=ON
Artık OpenThread'i nRF52840 anakartlarını oluşturmaya ve flaş etmeye hazırsınız.
Oluştur ve flaş
Joiner ve yerel USB işlevselliği ile OpenThread nRF52840 örneğini oluşturun. Bir cihaz, güvenli bir şekilde doğrulanmak ve bir Thread ağında görevlendirilmek için Joiner rolünü kullanır. Yerel USB, USB CDC ACM'nin nRF52840 ile ana bilgisayar arasında seri aktarım olarak kullanılmasını sağlar.
Her zaman önce make clean
komutunu çalıştırarak önceki derlemelerin deposunu make clean
.
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 UART_trans
OpenThread RCP ikili dosyasıyla dizine gidin ve onu onaltılık biçime dönüştürün:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex
USB kablosunu nRF52840 kartındaki harici güç pininin yanındaki Mikro-USB hata ayıklama bağlantı noktasına takın ve ardından Linux makinesine takın. VDD için nRF52840 gemide NRF güç kaynağı getirin. Doğru bağlandığında LED5 yanar .
Bu Linux makineye bağlı ilk tahta ise seri port gibi görünür /dev/ttyACM0
(bütün nRF52840 panoları kullanmak ttyACM
seri port tanımlayıcı için).
$ ls /dev/ttyACM* /dev/ttyACM0
RCP için kullanılan nRF52840 kartının seri numarasını not edin:
NRFx Komut Satırı Araçlarının konumuna gidin ve kartın seri numarasını kullanarak OpenThread RCP hex dosyasını nRF52840 kartına yükleyin:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset
Başarı üzerine aşağıdaki çıktı üretilir:
Parsing hex file. Erasing user available code and UICR flash areas. Applying system reset. Checking that the area to write is not protected. Programing device. Applying system reset. Run.
Panoyu "RCP" olarak etiketleyin, böylece daha sonra pano rollerini karıştırmazsınız.
Yerel USB'ye bağlanın
OpenThread RCP yapısı, yerel USB CDC ACM'nin seri aktarım olarak kullanılmasını sağladığından, RCP ana bilgisayarı (Linux makinesi) ile iletişim kurmak için nRF52840 kartındaki nRF USB bağlantı noktasını kullanmanız gerekir.
USB kablosunun Mikro-USB ucunu flaşlı nRF52840 kartının hata ayıklama bağlantı noktasından ayırın, ardından SIFIRLA düğmesinin yanındaki Mikro-USB nRF USB bağlantı noktasına yeniden takın . NRF güç kaynağı anahtarını USB'ye ayarlayın .
OpenThread Daemon'u Başlatın
RCP tasarımında, Thread cihazıyla iletişim kurmak ve onu yönetmek için OpenThread Daemon'u kullanın. ot-daemon
-v
ayrıntılı bayrağıyla -v
böylece günlük çıktısını görebilir ve çalıştığını doğrulayabilirsiniz:
$ cd ~/src/openthread $ ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'
Başarılı olduğunda, ayrıntılı moddaki ot-daemon
aşağıdakine benzer çıktı üretir:
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
ot-daemon
günlüklerinin görüntülenebilmesi için bu terminal penceresini açık bırakın.
RCP düğümü ile iletişim kurmak için ot-ctl
kullanın. ot-ctl
, OpenThread CLI uygulamasıyla aynı CLI'yi kullanır. Bu nedenle, ot-daemon
düğümlerini diğer simüle edilmiş Thread cihazlarıyla aynı şekilde kontrol edebilirsiniz.
İkinci bir terminal penceresinde ot-ctl
başlatın:
$ ./output/posix/bin/ot-ctl >
ot-daemon
ile başlattığınız Düğüm 2'nin (RCP düğümü) state
kontrol edin:
> state disabled Done
Bu Codelab'de kullanılan diğer iki İş Parçacığı düğümü, standart Yonga Üzerinde Sistem (SoC) tasarımındaki Tam İş Parçacığı Aygıtlarıdır (FTD'ler). wpantund
kullanmazlar ve kullanıcı bunları manuel olarak OpenThread CLI ile yönetir.
Bir cihaz, cihazları güvenli bir şekilde doğrulamak ve bu ağda devreye almak için Komiser olarak işlev görür. Diğer cihaz, Komisyoncunun Thread ağında kimlik doğrulaması yapabileceği bir Birleştirici olarak işlev görür.
Oluştur ve flaş
Komisyoncu ve Birleştirici rolleri etkinleştirilerek nRF52840 platformu için OpenThread FTD örneğini oluşturun:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 UART_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
OpenThread Tam İş Parçacığı Aygıtı (FTD) CLI ikili dosyasıyla dizine gidin ve onu onaltılık biçime dönüştürün:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
USB kablosunu nRF52840 kartındaki harici güç piminin yanındaki Mikro USB bağlantı noktasına takın ve ardından Linux makinesine takın. BİP hala Linux makineye bağlı ise, bu yeni yönetim kurulu seri port olarak görünmelidir /dev/ttyACM1
(bütün nRF52840 panoları kullanmak ttyACM
seri port tanımlayıcı için).
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
Daha önce olduğu gibi, FTD için kullanılan nRF52840 kartının seri numarasını not edin:
NRFx Komut Satırı Araçlarının konumuna gidin ve kartın seri numarasını kullanarak OpenThread CLI FTD onaltılık dosyayı nRF52840 kartına yazın:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset
Panoyu "Komisyon Üyesi" olarak etiketleyin.
Yapıyı doğrulayın
Bir terminal penceresinden GNU Ekranını kullanarak OpenThread CLI'ye erişerek başarılı bir derlemeyi doğrulayın. NRF52840 anakartları 115200 baud hızı kullanır.
$ screen /dev/ttyACM1 115200
Yeni pencerede, OpenThread CLI >
istemini getirmek için klavyedeki Return tuşuna birkaç kez basın. IPv6 arayüzünü açın ve adresleri kontrol edin:
> ifconfig up Done > ipaddr fe80:0:0:0:1cd6:87a9:cb9d:4b1d Done
Ctrl + a → kullanın
d
FTD Commissioner CLI ekranından ayırmak ve Linux terminaline geri dönmek, böylece bir sonraki panonun flash edilebilmesi için. CLI'yi herhangi bir zamanda yeniden girmek için komut satırından screen -r
kullanın. Mevcut ekranların bir listesini görmek için screen -ls
kullanın:
$ screen -ls There is a screen on: 74182.ttys000.mylinuxmachine (Detached) 1 Socket in /tmp/uscreens/S-username.
FTD Birleştiriciyi Kurun
Mevcut ot-cli-ftd.hex
yapısını kullanarak üçüncü nRF52840 kartını yakmak için yukarıdaki işlemi tekrarlayın.
Bu üçüncü kart takıldığında diğer iki düğüm Linux makinesine bağlanırsa, seri bağlantı noktası /dev/ttyACM2
:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
Panoyu "Birleştirici" olarak etiketleyin.
Screen kullanarak doğrulama yaparken, komut satırından yeni bir Screen örneği oluşturmak yerine, mevcut olanı yeniden ekleyin ve içinde yeni bir pencere açın (FTD Commissioner için kullandığınız):
$ screen -r
Ctrl + a ile Ekran içinde yeni pencereyi oluşturun →
c
**. ** Yeni bir komut satırı istemi görüntülenir. FTD Birleştiricisi için OpenThread CLI'ye erişin:
$ screen /dev/ttyACM2 115200
Bu yeni pencerede, OpenThread CLI >
istemini getirmek için klavyedeki Return tuşuna birkaç kez basın. IPv6 arayüzünü açın ve adresleri kontrol edin:
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
Artık FTD Joiner CLI, FTD Commissioner ile aynı Screen örneğinde olduğuna göre, Ctrl + a → n
kullanarak aralarında geçiş yapabilirsiniz.
Ctrl + a → kullanın
d
herhangi bir zamanda Ekrandan çıkmak için.
İleride, Thread cihazları arasında sık sık geçiş yapacaksınız, bu yüzden hepsinin canlı ve kolay erişilebilir olduğundan emin olun. Şimdiye kadar, iki FTD'ye erişmek için Ekran'ı kullanıyoruz ve bu araç aynı terminal penceresinde bölünmüş ekrana da izin veriyor. Bunu, bir düğümün diğerinde verilen komutlara nasıl tepki verdiğini görmek için kullanın.
İdeal olarak, kullanıma hazır dört pencereniz olmalıdır:
-
ot-daemon
hizmeti / günlükleri -
ot-ctl
aracılığıyla RCP Joiner - OpenThread CLI aracılığıyla FTD Commissioner
- OpenThread CLI aracılığıyla FTD Joiner
Kendi terminal / seri bağlantı noktası yapılandırmanızı veya aracınızı kullanmak isterseniz, bir sonraki adıma geçmekten çekinmeyin. Tüm cihazlar için terminal pencerelerini sizin için en uygun şekilde yapılandırın.
Ekranı Kullanma
Kullanım kolaylığı için yalnızca bir Ekran oturumu başlatın. Her iki FTD'yi kurduğunuzda zaten bir tane almış olmalısınız.
Ekran içindeki tüm komutlar Ctrl + a ile başlar.
Temel Ekran komutları:
Ekran oturumuna yeniden bağlan (komut satırından) | |
Ekran oturumundan ayrıl | Ctrl + a → |
Ekran oturumunda yeni pencere oluştur | Ctrl + a → |
Aynı Ekran oturumunda pencereler arasında geçiş yap | Ctrl + a → |
Ekran oturumunda mevcut pencereyi kapat | Ctrl + a → |
Bölünmüş ekran
Screen ile terminali birden çok pencereye bölebilirsiniz:
screen
komutlara Ctrl + a kullanılarak erişilir. Her komut bu erişim anahtarı kombinasyonuyla başlamalıdır.
Codelab'i tam olarak takip ediyorsanız, aynı Screen örneğinde iki pencereniz (FTD Commissioner, FTD Joiner) olmalıdır. Ekranı ikiye bölmek için önce mevcut Ekran oturumunuzu girin:
$ screen -r
FTD cihazlarından birinde olmalısınız. Ekrandaki şu adımları izleyin:
- Pencereyi yatay olarak bölmek için Ctrl + a →
S
- İmleci yeni boş pencereye taşımak için Ctrl + a →
Tab
- Bu yeni pencereyi bir sonrakine geçirmek için Ctrl + a →
n
- Üst pencereyle aynıysa, diğer FTD cihazını görüntülemek için tekrar Ctrl + a →
n
Artık ikisi de görülebilir. Ctrl + a → Tab
kullanarak aralarında geçiş yapın. Karışıklığı önlemek için her pencereyi Ctrl + a → A
ile yeniden sıralamanızı öneririz.
Gelişmiş kullanım
Ekranı çeyreklere daha fazla bölmek ve ot-daemon
günlüklerini ve RCP Joiner ot-ctl
, bu hizmetler aynı Screen örneğinde başlatılmalıdır. Bunu yapmak için ot-daemon
durdurun ve ot-ctl
çıkın ve bunları yeni Ekran pencerelerinde yeniden başlatın (Ctrl + a → c
).
Bu kurulum gerekli değildir ve kullanıcı için bir egzersiz olarak bırakılmıştır.
Aşağıdaki komutlarla pencereleri ayırın ve pencereler arasında gezinin:
Yeni pencere oluştur | Ctrl + a → |
Pencereyi dikey olarak böl | Ctrl + a → |
Pencereyi yatay olarak böl | Ctrl + a → |
Bir sonraki görüntülenen pencereye atla | Ctrl + a → |
Görüntülenen pencereyi ileri veya geri değiştirme | Ctrl + a → |
Mevcut pencereyi yeniden adlandırın | Ctrl + a → |
Ekranı istediğiniz zaman Ctrl + a → d
ile screen -r
edin ve komut satırından screen -r
ile yeniden screen -r
.
Ekran hakkında daha fazla bilgi için GNU Ekranı hızlı referansına bakın .
Artık tüm terminal pencerelerinizi ve ekranlarınızı yapılandırdığınıza göre, Thread ağımızı oluşturalım. FTD Commissioner'da , yeni bir Operasyonel Veri Kümesi oluşturun ve onu aktif olan olarak işleyin. Operasyonel Veri Kümesi, oluşturduğunuz İş Parçacığı ağının yapılandırmasıdır.
## FTD Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 11 Channel Mask: 07fff800 Ext PAN ID: c0de7ab5c0de7ab5 Mesh Local Prefix: fdc0:de7a:b5c0/64 Master Key: 1234c0de7ab51234c0de7ab51234c0de Network Name: OpenThread-c0de PAN ID: 0xc0de PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Daha sonra kullanılacak Ana Anahtar 1234c0de7ab51234c0de7ab51234c0de
not edin.
Bu veri kümesini etkin olan olarak kaydedin:
> dataset commit active Done
IPv6 arayüzünü açın:
> ifconfig up Done
İş Parçacığı protokol işlemini başlatın:
> thread start Done
Bir süre sonra aygıt durumunu kontrol edin. Lider olmalıdır. Ayrıca ileride başvurmak üzere RLOC16'yı alın.
## FTD Commissioner ## ---------------------- > state leader Done > rloc16 0c00 Done
Cihazın IPv6 adreslerini kontrol edin:
## FTD Commissioner ## ---------------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:c00 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a # Mesh-Local EID (ML-EID) fe80:0:0:0:1cd6:87a9:cb9d:4b1d # Link-Local Address (LLA)
"Codelab" ağı artık diğer Thread cihazlarından tarandığında görülebilir.
RCP ot-ctl
:
## RCP Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
FTD Birleştiricisindeki OpenThread CLI'den:
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
Listede "codelab" ağı görünmüyorsa, yeniden taramayı deneyin.
Her iki taramada da ağın birleştirilemez göründüğünü fark edebilirsiniz (RCP Joiner ve FTD Joiner'daki J sütunu). Bu yalnızca, Ağda İş Parçacığı Devreye Alma işleminin etkin olmadığı anlamına gelir. Yine de birleştirici cihaza ağ ana anahtarını manuel olarak girerek bant dışı olarak birleştirilebilir.
Bant dışı bir işlem kullanarak RCP Birleştiriciyi yeni oluşturduğumuz Thread ağına ekleyelim. RCP Joiner'daki ağları tara:
## RCP Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
Katılmak için, aktif veri kümesindeki RCP Birleştiricisinde ağ ana anahtarını (FTD yetkilisinden yeni aldık) ayarlayın.
## RCP Joiner ## ---------------- > dataset masterkey 1234c0de7ab51234c0de7ab51234c0de Done > dataset commit active Done
Doğru ayarlandığından emin olmak için veri kümesini kontrol edin.
## RCP Joiner ## ---------------- > dataset Master Key: 1234c0de7ab51234c0de7ab51234c0de
RCP Joiner'ın "codelab" ağına katılması için Thread'ı açın. Birkaç saniye bekleyin, durumu, RLOC16'yı ve IPv6 adreslerini kontrol edin:
## RCP Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c01 Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:0c01 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f # Mesh-Local EID (ML-EID) fe80:0:0:0:18e5:29b3:a638:943b # Link-Local Address (LLA) Done
Mesh-Local IPv6 Adresini not edin ( fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
), daha sonra kullanacaksınız.
FTD Yetkilisine geri dönün, her iki cihazın da aynı ağın parçası olduğunu doğrulamak için yönlendiriciyi ve alt tabloları kontrol edin. RCP Birleştiriciyi tanımlamak için RLOC16'yı kullanın.
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 35 | 1ed687a9cb9d4b1d | Done > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|VER| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+---+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1| 2| 1ae529b3a638943b | Done
Bağlantıyı doğrulamak için RCP ipaddr
RCP ipaddr
çıktısından alınan Mesh-Local adresi) mesh-local adresine ping ipaddr
:
## FTD Commissioner ## ---------------------- > ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f > 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms
Şimdi, bu topoloji diyagramında gösterilen iki düğümden oluşan bir Thread ağımız var:
Topoloji diyagramları
Codelab'in geri kalanında çalışırken, ağın durumu her değiştiğinde yeni bir Thread topoloji diyagramı göstereceğiz. Düğüm rolleri şu şekilde belirtilir:
Yönlendiriciler her zaman beşgendir ve Son Cihazlar her zaman çember şeklindedir. Her düğümdeki sayılar, her düğümün o andaki mevcut rolüne ve durumuna bağlı olarak CLI çıkışında gösterilen Yönlendirici Kimliğini veya Çocuk Kimliğini temsil eder.
Şimdi üçüncü Thread cihazını "codelab" ağına ekleyelim. Bu sefer daha güvenli bant içi devreye alma sürecini kullanacağız. FTD Birleştiricide , ağı tarayın:
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 | 57 |
J sütunundaki bir 0
, cihazda Diş Devreye Alma işleminin etkin olmadığını gösterir.
Bu sonraki cihazda devreye alırken spesifik olalım ve yalnızca FTD Joiner'ın katılmasına izin verelim. Hala FTD Birleştiricisindeyseniz, eui64
, böylece FTD Yetkilisi onu tanımlayabilir:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
FTD Commissioner'da , komisyoncuyu başlatın ve Joiner Credential ile birlikte katılabilecek aygıtın eui64
belirtin. Birleştirici Kimlik Bilgileri, cihaza özgü bir paroladır.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
FTD Birleştiriciye geçin ve yeniden tarayın:
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 1 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -45 | 196 |
J sütunundaki 1
gösterildiği gibi, İplik Devreye Alma artık ağda etkindir. Marangoz rolünü, FTD Komisyon Üyesi'nde ayarladığınız Marangoz Kimlik Bilgileri ile başlatın:
## FTD Joiner ## ---------------- > ifconfig up Done > joiner start J01NME Done
Yaklaşık bir dakika içinde, başarılı bir kimlik doğrulamasının onayını alırsınız:
## FTD Joiner ## ---------------- > Join success
FTD Joiner'ın "codelab" ağına katılması için Thread'ı açın ve durumu ve RLOC16'yı hemen kontrol edin:
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
Cihazın IPv6 adreslerini kontrol edin. ALOC olmadığına dikkat edin. Bunun nedeni, bu cihazın Lider olmaması ve bir ALOC gerektiren Anycast'e özgü bir role sahip olmamasıdır.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:c02 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA)
Hemen FTD Yetkilisine geçin ve "codelab" ağında üç cihazın bulunduğunu doğrulamak için yönlendirici ve alt tabloları kontrol edin:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 2 | 0x0c02 | 240 | 15 | 3 | 44 |1|1|1|1| e6cdd2d93249a243 | Done
RLOC16'ya göre, FTD Joiner ağa bir Son Cihaz (alt) olarak bağlanmıştır. İşte güncellenmiş topolojimiz:
Bu Codelab'deki İş Parçacığı aygıtları, Yönlendiriciye Uygun Uç Aygıt (REED) olarak adlandırılan belirli bir Tam İş Parçacığı Aygıt (FTD) türüdür. Bu, bir Yönlendirici veya Son Cihaz olarak çalışabilecekleri ve kendilerini bir Son Cihazdan bir Yönlendiriciye yükseltebilecekleri anlamına gelir.
Thread, 32 Yönlendiriciye kadar destekleyebilir, ancak Yönlendirici sayısını 16 ile 23 arasında tutmaya çalışır. Bir REED, bir Son Cihaz (çocuk) olarak bağlanırsa ve Yönlendirici sayısı 16'nın altındaysa, iki dakika içinde rastgele bir süre geçtikten sonra kendini otomatik olarak bir Yönlendiriciye yükseltir.
FTD Birleştiriciyi ekledikten sonra Thread ağınızda iki çocuğunuz varsa, en az iki dakika bekleyin ve ardından FTD Commissioner'daki yönlendirici ve alt tabloları yeniden kontrol edin:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | Done
FTD Joiner (Genişletilmiş MAC = e6cdd2d93249a243
) kendisini bir Yönlendiriciye yükseltti. RLOC16'nın farklı olduğunu unutmayın ( b800
yerine 0c02
). Bunun nedeni, RLOC16'nın bir aygıtın Yönlendirici Kimliği ve Çocuk Kimliği'ne dayalı olmasıdır. Uç Aygıttan Yönlendiriciye geçiş yaptığında, Yönlendirici Kimliği ve Çocuk Kimliği değerleri değişir ve RLOC16 da değişir.
FTD Joiner'da yeni durumu ve RLOC16'yı onaylayın:
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
FTD Birleştiriciyi Düşürün
Bu davranışı, FTD Birleştiriciyi bir Yönlendiriciden bir Son Cihaza manuel olarak düşürerek test edebilirsiniz. Durumu çocuk olarak değiştirin ve RLOC16'yı kontrol edin:
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
FTD Yetkilisine geri döndüğümüzde , FTD Joiner artık alt tabloda görünmelidir (ID = 3). Geçiş sırasında her ikisinde de olabilir:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 3 | 0x0c03 | 240 | 16 | 3 | 94 |1|1|1|1| e6cdd2d93249a243 | Done
Bir süre sonra, RLOC b800 olan bir Yönlendiriciye geri b800
.
Lideri Kaldır
Lider, tüm İş Parçacığı Yönlendiricileri arasından kendi kendine seçilir. Bu, mevcut Lider İş Parçacığı ağından kaldırılırsa, diğer Yönlendiricilerden birinin yeni Lider olacağı anlamına gelir.
FTD Commissioner'da , Thread ağından çıkarmak için Thread'ı kapatın:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
İki dakika içinde, FTD Birleştirici yeni İş Parçacığı lideri olur. Aşağıdakileri doğrulamak için FTD Birleştiricinin durumunu ve IPv6 adreslerini kontrol edin:
## FTD Joiner ## ---------------- > state leader Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Now it has the Leader ALOC! fdc0:de7a:b5c0:0:0:ff:fe00:b800 fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd fe80:0:0:0:e4cd:d2d9:3249:a243 Done
Çocuk masasına bakın. Yeni bir RLOC16 olduğuna dikkat edin. Bu, Kimliği ve Genişletilmiş MAC ile belirtildiği gibi RCP Birleştiricidir. İş parçacığı ağını bir arada tutmak için, ana Yönlendiricileri, FTD Yetkilisinden FTD Birleştiricisine değiştirdi. Bu, RCP Joiner için yeni bir RLOC16 ile sonuçlanır (çünkü Yönlendirici Kimliği 3'ten 46'ya değişmiştir).
## FTD Joiner ## ---------------- > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 27 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
RCP Joiner'ın FTD Joiner'a çocukken bağlanması için birkaç dakika beklemeniz gerekebilir. Aşağıdakileri onaylamak için durumu ve RLOC16'yı kontrol edin:
## RCP Joiner ## -------------- > state child > rloc16 b801
FTD Yetkilisini Yeniden Bağlayın
İki düğüme sahip bir Thread ağı pek eğlenceli değildir. FTD Komiseri'ni tekrar çevrimiçi duruma getirelim.
FTD Komisyonu'nda , İş Parçacığını yeniden başlatın:
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
İki dakika içinde, "codelab" ağına bir Son Cihaz olarak otomatik olarak yeniden bağlanır ve ardından kendisini bir Yönlendiriciye yükseltir.
## FTD Commissioner ## ---------------------- > state router Done
Aşağıdakileri doğrulamak için FTD Birleştiricideki yönlendiriciyi ve alt tabloları kontrol edin:
## FTD Joiner ## ---------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 63 | 0 | 3 | 3 | 0 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 46 | 0 | 0 | 0 | 15 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 184 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
Thread ağımız yine üç düğümden oluşmaktadır.
Bir Thread ağını farklı terminallerde veya Ekran pencerelerinde birden fazla cihazla yönetmek karmaşık olabilir. Sorunlarla karşılaşırsanız, ağın veya çalışma alanınızın durumunu "sıfırlamak" için bu ipuçlarını kullanın.
Ekran
Yapılandırmanızda kaybolursanız (çok fazla Ekran penceresi veya Ekran içinde Ekran), Ctrl + a → k ile Ekran pencerelerini, hiçbiri screen -ls
ve komut satırında screen -ls
No Sockets found
çıktısına kadar öldürmeye devam edin. Ardından her cihaz için Ekran pencerelerini yeniden oluşturun. Ekran kapatıldığında bile aygıt durumları korunur.
Konu düğümleri
Konu ağ topoloji olarak bu Codelab açıklanan değildir veya düğümler nedense (onlara güç Linux makine uyudu için olabilir) için keserseniz, bu konuya çökertmek ağ kimlik bilgilerini temizleyin ve oluşturma yeniden başlamak en iyisidir İş parçacığı ağ adımı.
FTD'leri sıfırlamak için:
## FTD Commissioner or FTD Joiner ## ------------------------------------ > thread stop Done > ifconfig down Done > factoryreset Done
RCP, ot-ctl
ile aynı şekilde sıfırlanabilir:
## RCP Joiner ## ---------------- > thread stop Done > ifconfig down Done > factoryreset Done
Çok noktaya yayın, bilgileri bir grup cihaza aynı anda iletmek için kullanılır. Bir iş parçacığı ağında, kapsama bağlı olarak farklı cihaz gruplarıyla çok noktaya yayın kullanımı için belirli adresler ayrılmıştır.
IPv6 Adresi | Dürbün | Teslim edildi |
| Yerel Bağlantı | Tüm FTD'ler ve MED'ler |
| Yerel Bağlantı | Tüm FTD'ler ve Sınır Yönlendiriciler |
| Mesh-Yerel | Tüm FTD'ler ve MED'ler |
| Mesh-Yerel | Tüm FTD'ler ve Sınır Yönlendiriciler |
Bu Codelab'de bir Sınır Yönlendiricisi kullanmadığımız için, iki FTD ve MED çok noktaya yayın adresine odaklanalım.
Yerel Bağlantı
Yerel Bağlantı kapsamı, tek bir radyo iletimi veya tek bir "atlama" ile erişilebilen tüm İş Parçacığı arayüzlerini içerir. Ağ topolojisi, hangi cihazların ff02::1
çok noktaya yayın adresine bir ping'e yanıt vereceğini belirler.
FTD Yetkilisinden Ping ff02::1
:
## FTD Commissioner ## ---------------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms
Ağda iki cihaz daha var (FTD Birleştirici ve RCP Birleştirici), ancak FTD Yetkilisi, FTD Birleştiricinin Yerel Bağlantı Adresinden (LLA) yalnızca bir yanıt aldı. Bu, FTD Birleştiricinin, FTD Yetkilisinin tek bir atlama ile ulaşabileceği tek cihaz olduğu anlamına gelir.
Şimdi FTD ff02::1
ping ff02::1
:
## FTD Joiner ## ---------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms 8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms
İki yanıt! Diğer cihazlar için IPv6 adreslerini kontrol ederken, ilkinin ( 4b1d
biten) FTD Komisyonunun 4b1d
olduğunu ve ikincisinin ( 943b
biten) RCP Joiner's LLA olduğunu görebiliriz.
Bu, FTD Birleştiricinin hem FTD Komiseri hem de RCP Birleştiricisine doğrudan bağlı olduğu anlamına gelir, bu da topolojimizi onaylar.
Mesh-Yerel
Mesh-Local kapsam, aynı Thread ağı içinde erişilebilen tüm Thread arayüzlerini içerir. ff03::1
multicast adresine gönderilen ping'e verilen yanıtları görelim.
FTD Yetkilisinden ping ff03::1
:
## FTD Commissioner ## ---------------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms
Bu kez FTB Komisyon iki cevap FTD Marangoz Yönlendirme Locator bir (RLOC, biten alınan b800
(biten ML-Kimlik) ve RCP Marangoz Mesh Yerel EID bir tane d55f
). Bunun nedeni, mesh-local kapsamın tüm Thread ağını kapsamasıdır. Bir cihaz ağın neresinde olursa olsun, ff03::1
adresine abone olacaktır.
Aynı davranışı onaylamak için FTD Birleştiriciden ff03::1
ping ff03::1
:
## FTD Joiner ## ---------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms
Her iki ping çıkışında da RCP Birleştiricinin yanıt süresini not edin. RCP Joiner'ın FTD Yetkilisine (68ms) ulaşması, FTD Joiner'a (23ms) ulaşmasından çok daha uzun sürdü. Bunun nedeni, FTD Joiner için bir atlama yerine, FTD Yetkilisine ulaşmak için iki atlama yapması gerektiğidir.
Ayrıca, mesh-local multicast ping'in RCP Joiner için değil, yalnızca iki FTD için RLOC ile yanıt verdiğini fark etmiş olabilirsiniz. Bunun nedeni, RCP'nin bir Son Cihaz iken, FTD'lerin ağ içindeki Yönlendiriciler olmasıdır.
Doğrulamak için RCP Birleştiricinin durumunu kontrol edin:
## RCP Joiner ## ---------------- > state child
OpenThread'in sağladığı uygulama hizmetlerinden biri, bir Taşıma Katmanı protokolü olan Kullanıcı Datagram Protokolüdür (UDP). OpenThread üzerine kurulu bir uygulama, mesajları bir Thread ağındaki düğümler arasında veya harici bir ağdaki diğer cihazlara (Thread ağında bir Border Router varsa internet gibi) geçirmek için UDP API kullanabilir.
UDP soketleri OpenThread CLI aracılığıyla kullanıma sunulur. Bunu iki FTD arasında mesaj iletmek için kullanalım.
FTD Joiner için Mesh-Local EID adresini alın. Bu adresi, Thread ağının herhangi bir yerinden ulaşılabildiği için kullanıyoruz.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:b800 # Routing Locator (RLOC) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) Done
UDP'yi başlatın ve herhangi bir IPv6 adresi için bir sokete bağlayın:
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
FTD Yetkilisine geçin, UDP'yi başlatın ve ML-EID'sini kullanarak FTD Joiner'da kurduğunuz sokete bağlanın:
## FTD Commissioner ## ---------------------- > udp open Done > udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212 Done
UDP bağlantısı iki düğüm arasında canlı olmalıdır. FTD Yetkilisinden bir mesaj gönderin:
## FTD Commissioner ## ---------------------- > udp send hellothere Done
FTD Joiner'da UDP mesajı alındı!
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
Fiziksel bir Thread ağı yarattınız!
Artık biliyorsun:
- İş Parçacığı cihaz türleri, rolleri ve kapsamları arasındaki fark
- Thread cihazları ağ içindeki durumlarını nasıl yönetir?
- UDP kullanarak düğümler arasında basit mesajlar nasıl geçirilir
Sonraki adımlar
Bu Codelab'den yola çıkarak aşağıdaki alıştırmaları deneyin:
-
ot-cli-mtd
ikilisini kullanarak FTD Marangoz panosunu bir MTD olarak yeniden canlandırın ve hiçbir zaman kendisini bir Yönlendiriciye yükseltmediğini veya Lider olmaya çalışmadığını gözlemleyin. - Ağa daha fazla cihaz ekleyin (farklı bir platform deneyin!) Ve çok noktaya yayın adreslerine pinglerle birlikte yönlendirici ve alt tabloları kullanarak topolojiyi çizin
- NCP'yi kontrol etmek için pyspinel kullanın
- NCP'yi OpenThread Border Router kullanarak bir Border Router'a dönüştürün ve Thread ağınızı internete bağlayın
daha fazla okuma
Check out openthread.io ve GitHub OpenThread dahil kaynakları çeşitli:
- Desteklenen Platformlar - OpenThread'i destekleyen tüm platformları keşfedin
- OpenThread'i oluşturun - OpenThread'i oluşturma ve yapılandırma hakkında daha fazla ayrıntı
- Thread Primer - bu Codelab'de yer alan tüm Thread kavramlarını kapsar
Referans: