Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

NRF52840 anakartlar ve OpenThread ile bir Thread ağı oluşturun

26b7f4f6b3ea0700.png

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.

4806d16a8c137c6d.jpeg

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.

a6693da3ce213856.png

Dahili JTAG modüllerine sahip nRF52840 kartlarını programlamak için SEGGER J-Link kullanıyoruz. Bunu Linux makinenize kurun.

J-Link Yazılımını ve Dokümantasyon Paketini İndirin

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.

NRF5x Komut Satırı Araçlarını İndirin

Çı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.

ARM GNU Toolchain taşınabilir arşivini indirin

Çı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 .

20a3b4b480356447.png

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:

c00d519ebec7e5f0.jpeg

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 .

46e7b670d2464842.png

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:

c00d519ebec7e5f0.jpeg

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:

  1. ot-daemon hizmeti / günlükleri
  2. ot-ctl aracılığıyla RCP Joiner
  3. OpenThread CLI aracılığıyla FTD Commissioner
  4. 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)

screen -r

Ekran oturumundan ayrıl

Ctrl + a → d

Ekran oturumunda yeni pencere oluştur

Ctrl + a → c

Aynı Ekran oturumunda pencereler arasında geçiş yap

Ctrl + a → n (ileri) Ctrl + a → p (geri)

Ekran oturumunda mevcut pencereyi kapat

Ctrl + a → k

Bölünmüş ekran

Screen ile terminali birden çok pencereye bölebilirsiniz:

f1cbf1258cf0a5a.png

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:

  1. Pencereyi yatay olarak bölmek için Ctrl + a → S
  2. İmleci yeni boş pencereye taşımak için Ctrl + a → Tab
  3. Bu yeni pencereyi bir sonrakine geçirmek için Ctrl + a → n
  4. Ü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 → c

Pencereyi dikey olarak böl

Ctrl + a →

Pencereyi yatay olarak böl

Ctrl + a → S

Bir sonraki görüntülenen pencereye atla

Ctrl + a → Tab

Görüntülenen pencereyi ileri veya geri değiştirme

Ctrl + a → n veya p

Mevcut pencereyi yeniden adlandırın

Ctrl + a → 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:

otcodelab_top01C_2nodes.png

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:

b75a527be4563215.png

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:

otcodelab_top01C_ed01.png

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.

otcodelab_top01C.png

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

otcodelab_top01C_ed02.png

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 .

otcodelab_top01C.png

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

otcodelab_top02C_01.png

Ç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

otcodelab_top02C_02.png

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

ff02::1

Yerel Bağlantı

Tüm FTD'ler ve MED'ler

ff02::2

Yerel Bağlantı

Tüm FTD'ler ve Sınır Yönlendiriciler

ff03::1

Mesh-Yerel

Tüm FTD'ler ve MED'ler

ff03::2

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ı 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.

otcodelab_top02C_02_LL.png

Ş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.

otcodelab_top02C_02_LL02.png

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.

otcodelab_top02C_02_ML.png

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

otcodelab_top02C_02_LL02.png

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!

b915c433e7027cc7.png

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:

Referans: