nRF52840 kartları ve OpenThread ile Thread ağı oluşturma

Bu codelab hakkında
schedule88 dakika
subjectSon güncelleme 24 Nisan 2025
account_circleYazan: Jeff Bumgardner

1. Giriş

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 geliştiricilerin kullanımına sunmak ve bağlı ev ürünleri geliştirme sürecini hızlandırmak için OpenThread'i kullanıma sundu.

Thread spesifikasyonu, ev uygulamaları için IPv6 tabanlı, güvenilir, güvenli ve düşük güç tüketimine sahip kablosuz cihazlar arası iletişim protokolü tanımlar. OpenThread; IPv6, 6LoWPAN, MAC güvenliğine sahip IEEE 802.15.4, Mesh Bağlantısı Kurma ve Mesh Yönlendirme dahil olmak üzere tüm Thread ağ katmanlarını uygular.

Bu Codelab'de, gerçek donanımda OpenThread'i programlayacak, Thread ağı oluşturup yönetecek ve düğümler arasında mesaj ileteceksiniz.

4806d16a8c137c6d.jpeg

Neler öğreneceksiniz?

  • OpenThread CLI ikililerini derleme ve geliştirme kartlarına yükleme
  • Linux makine ve geliştirme kartından oluşan bir RCP oluşturma
  • OpenThread Daemon ve ot-ctl kullanarak bir RCP ile iletişim kurma
  • GNU Screen ve OpenThread CLI ile Thread düğümlerini manuel olarak yönetme
  • Cihazların Thread ağına güvenli şekilde devreye alınması
  • IPv6 çoklu yayını nasıl çalışır?
  • UDP ile mesaj dizileri arasında mesaj aktarma

İhtiyacınız olanlar

Donanım:

  • 3 adet Nordic Semiconductor nRF52840 geliştirme kartı
  • Kartları bağlamak için 3 USB - Mikro USB kablosu
  • En az 3 USB bağlantı noktası olan bir Linux makinesi

Yazılım:

  • GNU Aracı Zinciri
  • Nordic nRF5x komut satırı araçları
  • Segger J-Link yazılımı
  • OpenThread
  • Git

2. Başlarken

OpenThread Simülasyonu

Başlamadan önce, temel Thread kavramları ve OpenThread CLI hakkında bilgi edinmek için OpenThread Simülasyonu Codelab'ini çalıştırabilirsiniz.

Seri bağlantı noktası terminalleri

Terminal üzerinden seri bağlantı noktasına nasıl bağlanacağınızı bilmeniz gerekir. Bu Codelab'de GNU Screen kullanılır ve kullanıma genel bir bakış sunulur ancak başka bir terminal yazılımı da kullanılabilir.

Linux makinesi

Bu Codelab, bir Radyo Yardımcı İşlemcisi (RCP) Thread cihazına ev sahipliği yapmak ve tüm Thread geliştirme kartlarını flaşlamak için i386 veya x86 tabanlı bir Linux makinesi kullanacak şekilde tasarlanmıştır. Tüm adımlar Ubuntu 14.04.5 LTS (Trusty Tahr) üzerinde test edilmiştir.

Nordic Semiconductor nRF52840 kartları

Bu Codelab'de üç nRF52840 PDK kartı kullanılmaktadır.

a6693da3ce213856.png

Yerleşik JTAG modüllerine sahip nRF52840 kartlarını programlamak için SEGGER J-Link'i kullanırız. Bu programı Linux makinenize yükleyin.

Makineniz için uygun paketi indirip doğru konuma yükleyin. Linux'ta bu /opt/SEGGER/JLink olur.

nRF5x Komut Satırı Araçları'nı yükleme

nRF5x Komut Satırı Araçları, OpenThread ikililerini nRF52840 kartlarına yüklemenize olanak tanır. Linux makinenize uygun nRF5x-Command-Line-Tools-<OS> derlemesini yükleyin.

Ayıklanan paketi kök klasöre ~/ yerleştirin.

ARM GNU Aracı Zinciri'ni yükleme

Derleme için ARM GNU Aracı Zinciri kullanılır.

Ayıklanan arşivi Linux makinenizdeki /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ konumuna yerleştirmenizi öneririz. Yükleme talimatları için arşivin readme.txt dosyasında yer alan talimatları uygulayın.

Yükleme Ekranı (isteğe bağlı)

Ekran, seri bağlantı noktasıyla bağlı cihazlara erişmek için kullanılan basit bir araçtır. Bu Codelab'de Screen kullanılmaktadır ancak dilediğiniz seri bağlantı noktası terminal uygulamasını kullanabilirsiniz.

$ sudo apt-get install screen

3. Depoları klonlama

OpenThread

OpenThread'i klonlayın ve yükleyin. script/bootstrap komutları, araç zincirinin yüklendiğinden ve ortamın doğru şekilde yapılandırıldığından emin olur:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

OpenThread arka plan programını derleyin:

$ script/cmake-build posix -DOT_DAEMON=ON

Artık OpenThread'i derleyip nRF52840 kartlarına yüklemeye hazırsınız.

4. RCP Birleştirici'yi ayarlama

Derleme ve önyükleme

Joiner ve yerel USB işleviyle OpenThread nRF52840 örneğini derleyin. Cihazlar, Thread ağında güvenli bir şekilde kimlik doğrulaması yapmak ve hizmete almak için katılımcı rolünü kullanır. Yerleşik USB, nRF52840 ile ana makine arasında seri aktarım olarak USB CDC ACM'nin kullanılmasını sağlar.

Her zaman önce rm -rf build'ü çalıştırarak önceki derlemelerin deposunu temizleyin.

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

OpenThread RCP ikili dosyası bulunan dizine gidin ve dosyayı 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 ve ardından Linux makinesine takın. nRF52840 kartındaki nRF güç kaynağı anahtarını VDD olarak ayarlayın. Doğru şekilde bağlandığında LED5 açıktır.

20a3b4b480356447.png

Bu, Linux makinesine bağlı ilk kartsa seri bağlantı noktası /dev/ttyACM0 olarak görünür (tüm nRF52840 kartları, seri bağlantı noktası tanımlayıcısı için ttyACM kullanır).

$ 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 onaltılık dosyasını nRF52840 kartına flaşlayın. --verify işaretini eklemezseniz, flaş işleminin hata olmadan başarısız olabileceğini belirten bir uyarı mesajı göreceğinizi unutmayın.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

İşlem başarılı olduğunda aşağıdaki çıkış oluşturulur:

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.

Daha sonra yönetim kurulu rollerini karıştırmamak için yönetim kurulunu "RCP" olarak etiketleyin.

Yerel USB'ye bağlanma

OpenThread RCP derlemesi, seri aktarım olarak yerel USB CDC ACM'nin kullanılmasını sağladığından RCP ana makinesiyle (Linux makinesi) iletişim kurmak için nRF52840 kartındaki nRF USB bağlantı noktasını kullanmanız gerekir.

USB kablosunun mikro USB ucunu, yanıp sönen nRF52840 kartının hata ayıklama bağlantı noktasından çıkarın ve SIFIRLA düğmesinin yanındaki mikro USB nRF USB bağlantı noktasına yeniden takın. nRF güç kaynağı anahtarını USB olarak ayarlayın.

46e7b670d2464842.png

OpenThread Arka Plan Programını başlatma

RCP tasarımında, Thread cihazıyla iletişim kurmak ve cihazı yönetmek için OpenThread Daemon'ı kullanın. Günlük çıkışını görebilmek ve ot-daemon'ün çalıştığını doğrulayabilmek için ot-daemon-v ayrıntılı günlük kaydı işaretiyle başlatın:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'

Ayrıntılı modda ot-daemon başarılı olduğunda aşağıdakine benzer bir çıkış oluşturur:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

ot-daemon kaynaklı günlüklerin görüntülenebilmesi için bu terminal penceresini açık bırakın.

RCP düğümüyle iletişim kurmak için ot-ctl öğesini 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:

$ sudo ./build/posix/src/posix/ot-ctl
>

ot-daemon ile başlattığınız 2. düğümün (RCP düğümü) state değerini kontrol edin:

> state
disabled
Done

5. FTD'leri ayarlama

Bu Codelab'de kullanılan diğer iki Thread düğümü, standart çip üzerinde sistem (SoC) tasarımındaki tam Thread cihazlarıdır (FTD'ler). Üretim ortamında, OpenThread NCP örneklerini kontrol etmek için üretim sınıfı bir ağ arayüzü sürücüsü olan wpantund kullanılabilir ancak bu kod laboratuvarında OpenThread KSA'sı olan ot-ctl'ı kullanacağız.

Bir cihaz, cihazların kimliğini güvenli bir şekilde doğrulamak ve bu ağa bağlamak için Komisyon Üyesi olarak işlev görür. Diğer cihaz, komiserin Thread ağında kimlik doğrulaması yapabileceği bir katılımcı olarak işlev görür.

Derleme ve önyükleme

Komisyoncu ve Katılıcı rolleri etkinleştirilmiş olarak nRF52840 platformu için OpenThread FTD örneğini derleyin:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

OpenThread Full Thread Device (FTD) CLI ikili dosyası içeren dizine gidin ve dosyayı 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üç pininin yanındaki mikro USB bağlantı noktasına takın ve ardından Linux makinesine bağlayın. RCP hâlâ Linux makinesine bağlıysa bu yeni kart seri bağlantı noktası /dev/ttyACM1 olarak görünür (tüm nRF52840 kartları seri bağlantı noktası tanımlayıcısı için ttyACM kullanır).

$ 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 OpenThread CLI FTD onaltılık dosyasını, kartın seri numarasını kullanarak nRF52840 kartına yükleyin:

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

Kurulu "Komisyon Üyesi" olarak etiketleyin.

Yerel USB'ye bağlanma

OpenThread FTD derlemesi, seri aktarım olarak yerel USB CDC ACM'nin kullanılmasını sağladığından, RCP ana makinesiyle (Linux makinesi) iletişim kurmak için nRF52840 kartındaki nRF USB bağlantı noktasını kullanmanız gerekir.

USB kablosunun mikro USB ucunu, yanıp sönen nRF52840 kartının hata ayıklama bağlantı noktasından çıkarın ve SIFIRLA düğmesinin yanındaki mikro USB nRF USB bağlantı noktasına yeniden takın. nRF güç kaynağı anahtarını USB olarak ayarlayın.

46e7b670d2464842.png

Derlemeyi doğrulama

Terminal penceresinden GNU Screen'i kullanarak OpenThread CLI'ye erişerek başarılı bir derlemeyi doğrulayın.

$ screen /dev/ttyACM1

Yeni pencerede, OpenThread CLI > istemini görüntülemek için klavyede 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'yı kullanın →

d FTD Commissioner CLI'den ayrılmak için ve bir sonraki kartın yanıp sönmesi için Linux terminaline dönmek üzere. İstediğiniz zaman KSA'ya yeniden girmek için komut satırından screen -r simgesini kullanın. Mevcut ekranların listesini görmek için screen -ls simgesini kullanın:

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

FTD Birleştirici'yi ayarlama

Mevcut ot-cli-ftd.hex derlemesini kullanarak üçüncü nRF52840 kartını flaşlamak için yukarıdaki işlemi tekrarlayın. İşlemi tamamladığınızda, nRF USB bağlantı noktasını kullanarak kartı PC'ye yeniden bağladığınızdan ve nRF güç kaynağı anahtarını VDD olarak ayarladığınızdan emin olun.

Bu üçüncü kart bağlıyken diğer iki düğüm de Linux makinesine bağlıysa seri bağlantı noktası /dev/ttyACM2 olarak görünür:

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

Kartı "Birleştirici" olarak etiketleyin.

Ekran'ı kullanarak doğrularken komut satırından yeni bir Ekran örneği oluşturmak yerine mevcut Ekran örneğine yeniden bağlanın ve içinde yeni bir pencere oluşturun (FTD Komiseri için kullandığınız pencere):

$ screen -r

Ctrl+a → c ile Ekran'da yeni pencere oluşturun.

Yeni bir komut satırı istemi görünür. FTD Birleştirici için OpenThread KSA'sına erişin:

$ screen /dev/ttyACM2

Bu yeni pencerede, OpenThread CLI > istemini görüntülemek için klavyede birkaç kez Geri tuşuna 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

FTD Birleştiricisi CLI'si artık FTD Komiseri ile aynı ekran örneğinde olduğundan Ctrl+a → n tuşlarını kullanarak bunlar arasında geçiş yapabilirsiniz.

Ctrl+a'yı kullanın →

d düğmesine basarak Ekran'dan dilediğiniz zaman çıkabilirsiniz.

6. Terminal penceresi kurulumu

Bundan sonra Thread cihazları arasında sık sık geçiş yapacağınızdan, bunların hepsinin etkin olduğundan ve kolayca erişilebilir olduğundan emin olun. Şu ana kadar iki FTD'ye erişmek için Ekran'ı kullanıyoruz. Bu araç aynı terminal penceresinde bölünmüş ekrana da olanak tanır. Bir düğümün başka bir düğümde verilen komutlara nasıl tepki verdiğini görmek için bunu kullanın.

İdeal olarak, dört pencereniz hazır olmalıdır:

  1. ot-daemon hizmeti / günlükleri
  2. ot-ctl üzerinden RCP Birleştirici
  3. OpenThread CLI aracılığıyla FTD Komiseri
  4. OpenThread CLI üzerinden FTD Joiner

Kendi terminal / seri bağlantı noktası yapılandırmanızı veya aracınızı kullanmak istiyorsanız bir sonraki adıma geçebilirsiniz. Tüm cihazlar için terminal pencerelerini size 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 de ayarlarken zaten bir tane oluşturmuş olmanız gerekir.

Ekran'daki tüm komutlar Ctrl+a ile başlar.

Temel ekran komutları:

Ekran oturumuna yeniden bağlanma (komut satırından)

screen -r

Ekran oturumundan çıkma

Ctrl+a → d

Ekran oturumunda yeni pencere oluşturma

Ctrl+a → c

Aynı ekran oturumunda pencereler arasında geçiş yapma

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

Ekran oturumundaki mevcut pencereyi kapatma

Ctrl+a → k

Bölünmüş Ekran

Screen ile terminali birden fazla pencereye bölebilirsiniz:

f1cbf1258cf0a5a.png

screen komutlarına Ctrl+a tuşları kullanılarak erişilir. Her komut bu erişim anahtarı kombinasyonuyla başlamalıdır.

Codelab'i tam olarak takip ettiyseniz aynı ekran örneğinde iki pencereniz (FTD Komisyon Üyesi, FTD Katkıda Bulunan) olmalıdır. Ekranı ikiye bölmek için önce mevcut ekran oturumunuza girin:

$ screen -r

FTD cihazlarından birinde olmanız gerekir. Ekran'da aşağıdaki adımları uygulayın:

  1. Pencereyi yatay olarak bölmek için Ctrl+a → S
  2. İmleci yeni boş pencereye taşımak için Ctrl+a → Tab
  3. Yeni pencereyi bir sonraki pencereye geçirmek için Ctrl+a → n
  4. Üst pencereyle aynıysa diğer FTD cihazını görüntülemek için Ctrl+a → n tuşlarına tekrar basın.

Artık her ikisi de görünür durumda. Ctrl+a → Tab tuşlarını kullanarak bunlar arasında geçiş yapabilirsiniz. Karışıklığı önlemek için Ctrl+a → A tuşlarını kullanarak her pencereyi yeniden adlandırmanız önerilir.

Gelişmiş kullanım

Ekranı daha da dört parçaya bölmek ve ot-daemon günlüklerini ve RCP Birleştirici'yi ot-ctl görüntülemek için bu hizmetlerin aynı ekran örneğinde başlatılmış olması gerekir. Bunu yapmak için ot-daemon'ü durdurun, ot-ctl'ten çıkın ve yeni ekran pencerelerinde (Ctrl+a → c) yeniden başlatın.

Bu kurulum gerekli değildir ve kullanıcıya bırakılır.

Aşağıdaki komutlarla pencereleri bölme ve pencereler arasında gezinme:

Yeni pencere oluşturma

Ctrl+a → c

Pencereyi dikey olarak bölme

Ctrl+a →

Pencereyi yatay olarak bölme

Ctrl+a → S

Gösterilen bir sonraki pencereye atlama

Ctrl+a → Tab

Gösterilen pencereyi ileri veya geri taşıyın

Ctrl+a → n veya p

Mevcut pencereyi yeniden adlandırma

Ctrl+a → A

Ctrl+a → d ile ekrandan istediğiniz zaman ayrılabilir ve komut satırından screen -r ile yeniden bağlanabilirsiniz.

Screen hakkında daha fazla bilgi için GNU Screen hızlı referansı başlıklı makaleyi inceleyin.

7. Thread ağını oluşturma

Tüm terminal pencerelerinizi ve ekranlarınızı yapılandırdığınıza göre, mesaj dizisi ağımızı oluşturalım. FTD Komiseri'nde yeni bir operasyonel veri kümesi oluşturun ve bunu etkin olarak gönderin. İşlemsel Veri Kümesi, oluşturduğunuz Thread 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
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Daha sonra kullanılacak ağ anahtarını 1234c0de7ab51234c0de7ab51234c0de not edin.

Bu veri kümesini etkin veri kümesi olarak gönderin:

> dataset commit active
Done

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

> ifconfig up
Done

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

> thread start
Done

Bir süre sonra cihaz durumunu kontrol edin. Lider olmalıdır. Gelecekte referans olarak kullanmak için RLOC16'yı da 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ünür.

RCP Birleştirici'de ot-ctl'ten:

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

FTD Birleştirici'deki OpenThread KSA'sından:

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

"codelab" ağı listede görünmüyorsa tekrar taramayı deneyin.

8. RCP Birleştirici'yi ekleme

Thread devreye alma işlemi ağda etkin değil. Bu nedenle, RCP birleştirme aracını yeni oluşturduğumuz Thread ağına bant dışı devreye alma işlemi kullanarak eklememiz gerekiyor.

FTD Komiseri'nde, ağ anahtarını (ör. 1234c0de7ab51234c0de7ab51234c0de) not ettik. Ağ anahtarını tekrar aramanız gerekirse FTD Komiseri'nde aşağıdaki komutu çalıştırın:

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Ardından, RCP Birleştirici'de etkin veri kümesi ağ anahtarını FTD Komiseri ağ anahtarı olarak ayarlayın:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Doğru ayarlandığından emin olmak için veri kümesini kontrol edin.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

RCP Birleştirici'nin "codelab" ağına katılması için ileti dizisini açın. Birkaç saniye bekleyin, durumu, RLOC16'yı ve IPv6 adreslerini kontrol edin:

## RCP Joiner ##
----------------

> ifconfig up
Done
> 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 yerel IPv6 adresini (burada fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f) not edin. Daha sonra kullanacaksınız.

FTD Komiseri'ne geri dönüp 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ştirme aracını 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 Birleştirici'nin yerel ağ adresini (RCP Birleştirici'nin ipaddr çıkışından elde edilen yerel ağ adresi) pingleyin:

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

Artık bu topoloji şemasında gösterilen iki düğümden oluşan bir Mesaj dizisi ağına sahibiz:

otcodelab_top01C_2nodes.png

Topoloji diyagramları

Codelab'in geri kalanında çalışırken ağın durumu değiştiğinde yeni bir Thread topolojisi şeması göstereceğiz. Düğüm rolleri aşağıdaki gibi gösterilir:

b75a527be4563215.png

Yönlendiriciler her zaman beşgen, son cihazlar ise her zaman daire şeklindedir. Her düğümdeki sayılar, her düğümün o andaki rolüne ve durumuna bağlı olarak CLI çıkışında gösterilen Yönlendirici Kimliği'ni veya Alt Kimliği'ni temsil eder.

9. FTD Birleştirici'yi etkinleştirme

Şimdi üçüncü Thread cihazını "codelab" ağına ekleyelim. Bu kez daha güvenli bant içi devreye alma sürecini kullanacağız ve yalnızca FTD Birleştirici'nin katılmasına izin vereceğiz.

FTD katılımcısı'nda eui64 değerini alın. Böylece FTD komiseri bu değeri tanımlayabilir:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

FTD Komisyoncusu'nda komisyoncuyu başlatın ve katılabilir cihazın eui64 değerini, katılımcı kimlik bilgisiyle birlikte belirtin (ör. J01NME). Katılımcı kimliği, 6 ila 32 karakter uzunluğunda, tüm büyük harfli alfanümerik karakterlerden (okunabilirlik için I, O, Q ve Z hariç 0-9 ve A-Y) oluşan cihaza özgü bir dizedir.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

FTD Birleştirici'ye geçin. FTD Komiseri'nde yeni oluşturduğunuz katılımcı kimliğiyle katılımcı rolünü başlatın:

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

Yaklaşık bir dakika içinde kimlik doğrulamanın başarılı olduğunu belirten bir onay alırsınız:

## FTD Joiner ##
----------------

>
Join success

FTD Birleştirici'nin "codelab" ağına katılması için iletiyi açın ve hemen durumu ve RLOC16'yı kontrol edin:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

Cihazın IPv6 adreslerini kontrol edin. ALOC'un olmadığına dikkat edin. Bunun nedeni, bu cihazın lider olmaması ve 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 Komiseri'ne geçin ve "codelab" ağında üç cihaz olduğunu onaylamak için yönlendiriciyi 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 Birleştiricisi ağa son cihaz (alt cihaz) olarak bağlanmıştır. Güncellenen topolojimizi aşağıda bulabilirsiniz:

otcodelab_top01C_ed01.png

10. Mesaj dizisinin kullanılma şekli

Bu Codelab'deki Thread cihazları, Yönlendirici Uygun Son Cihaz (REED) olarak adlandırılan belirli bir tür Tam Thread Cihazıdır (FTD). Yani bu cihazlar, Yönlendirici veya Son Cihaz olarak işlev görebilir ve kendilerini Son Cihazdan Yönlendiriciye yükseltebilir.

Thread 32'ye kadar yönlendiriciyi destekleyebilir ancak yönlendirici sayısını 16 ile 23 arasında tutmaya çalışır. Bir REED uç cihaz (alt cihaz) olarak bağlanırsa ve yönlendirici sayısı 16'nın altındaysa iki dakika içinde rastgele bir sürenin ardından kendisini otomatik olarak yönlendirici olarak yükseltir.

FTD Birleştirici'yi ekledikten sonra Thread ağınızdaki iki alt öğe varsa en az iki dakika bekleyin ve ardından FTD Komisyon Üyesi'ndeki yönlendiriciyi ve alt öğe tablolarını 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 Birleştirici (Genişletilmiş MAC = e6cdd2d93249a243), kendisini Yönlendirici olarak yükseltti. RLOC16'nın farklı olduğunu (0c02 yerine b800) unutmayın. Bunun nedeni, RLOC16'nın bir cihazın Yönlendirici Kimliği ve Alt Cihaz Kimliği'ne dayalı olmasıdır. Son cihazdan yönlendiriciye geçiş yaptığında yönlendirici kimliği ve alt cihaz kimliği değerlerinin yanı sıra RLOC16 da değişir.

otcodelab_top01C.png

FTD Birleştirici'de yeni durumu ve RLOC16'yı onaylayın:

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

FTD birleştirme aracını eski sürüme geçirme

FTD Birleştirici'yi yönlendiriciden son cihaza manuel olarak indirerek bu davranışı test edebilirsiniz. Durumu alt öğe olarak değiştirin ve RLOC16'yı kontrol edin:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

FTD Komisyoncusu'na geri döndüğünüzde FTD Birleştiricisi artık alt tabloda (Kimlik = 3) görünür. Hatta 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'si b800 olan bir yönlendiriciye geri döner.

otcodelab_top01C.png

Lideri kaldırma

Lider, tüm mesaj yönlendiricileri arasından kendi kendini seçer. Yani mevcut Yönetici, Thread ağından kaldırılırsa diğer Yöneticilerden biri yeni Yönetici olur.

FTD Komiseri'nde, Thread'i Thread ağından kaldırmak için kapatın:

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

İki dakika içinde FTD katılımcısı yeni ileti dizisi lideri olur. Aşağıdakileri doğrulamak için FTD Birleştirici'nin 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

Alt tabloyu kontrol edin. Yeni bir RLOC16 olduğunu fark edin. Bu, kimliği ve genişletilmiş MAC'si tarafından belirtildiği gibi RCP Birleştiricisi'dir. Thread ağını bir arada tutmak için üst yönlendiricileri FTD Komisyoncusu'ndan FTD Birleştiricisi'ne geçirmiştir. Bu, RCP birleştirme aracı için yeni bir RLOC16'ya neden olur (yönlendirici kimliği 3'ten 46'ya değiştiği için).

## 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 Birleştirici'nin FTD Birleştirici'ye alt öğe olarak 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 komiserini yeniden ekleme

İki düğüm içeren bir Thread ağı pek eğlenceli olmaz. FTD Komiseri\'ni tekrar internete bağlayalım.

FTD Komiseri'nde ileti dizisini yeniden başlatın:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

İki dakika içinde "codelab" ağına uç cihaz olarak otomatik olarak yeniden bağlanır ve ardından kendisini yönlendirici olarak yükseltir.

## FTD Commissioner ##
----------------------

> state
router
Done

Aşağıdakileri doğrulamak için FTD Birleştirici'deki 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

Mesaj dizisi ağımız tekrar üç düğümden oluşuyor.

11. Sorun giderme

Farklı terminal veya ekran pencerelerinde birden fazla cihazla bir Thread ağını yönetmek karmaşık olabilir. Sorunla karşılaşırsanız ağınızı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 Screen penceresi veya Screen içinde Screen) Ctrl+a → k tuşlarına basarak Screen pencerelerini kapatmaya devam edin. Bu işlem, Screen pencereleri kalmayana ve komut satırında screen -ls yerine No Sockets found görünene kadar devam etmelidir. Ardından her cihaz için Ekran pencerelerini yeniden oluşturun. Ekran kapatıldığında bile cihaz durumları korunur.

Mesaj dizisi düğümleri

Thread ağ topolojisi bu Codelab'de açıklandığı gibi değilse veya düğümlerin bağlantısı herhangi bir nedenle kesilirse (ör. onları besleyen Linux makinesinin uykuya dalması nedeniyle) en iyi seçenek Thread'i kapatmak, ağ kimlik bilgilerini temizlemek ve Thread ağını oluşturma adımından tekrar başlamaktır.

FTD'leri sıfırlamak için:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

RCP, ot-ctl üzerinden aynı şekilde sıfırlanabilir:

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Çoklu yayını kullanma

Çoklu yayın, bir grup cihaza aynı anda bilgi aktarmak için kullanılır. Bir Thread ağında, belirli adresler kapsama alanına bağlı olarak farklı cihaz gruplarıyla çoklu yayın kullanımı için ayrılır.

IPv6 Adresi

Kapsam

Teslim edildiği adres

ff02::1

Bağlantı-Yerel

Tüm FTD'ler ve MED'ler

ff02::2

Bağlantı-Yerel

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

ff03::1

Mesh-Local

Tüm FTD'ler ve MED'ler

ff03::2

Mesh-Local

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

Bu Codelab'de Sınır Yönlendirici kullanmıyoruz. Bu nedenle, iki FTD ve MED çoklu yayın adresine odaklanalım.

Bağlantı yerel kapsamı, tek bir radyo yayını veya tek bir "atlama" ile erişilebilen tüm Mesaj dizili arayüzlerini içerir. Ağ topolojisi, ff02::1 çoklu yayın adresine yapılan ping'e hangi cihazların yanıt vereceğini belirler.

FTD Komiseri'nden ff02::1 ping'i:

## 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 Komiseri yalnızca FTD Birleştirici'nin Bağlantı Yerel Adresi'nden (LLA) bir yanıt aldı. Bu, FTD Birleştirici'nin tek bir atlamayla ulaşabileceği tek cihazın FTD Komisyoncusu olduğu anlamına gelir.

otcodelab_top02C_02_LL.png

Ardından FTD Birleştirici'den ff02::1 için ping gönderin:

## 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ın IPv6 adreslerini kontrol ettiğimizde, ilk cihazın (4b1d ile biten) FTD Komiseri'nin LLA'sı, ikinci cihazın (943b ile biten) ise RCP Birleştirici'nin LLA'sı olduğunu görebiliriz.

otcodelab_top02C_02_LL02.png

Bu, FTD Birleştirici'nin hem FTD Komisyon Üyesi'ne hem de RCP Birleştirici'ye doğrudan bağlı olduğu anlamına gelir. Bu da topolojimizi doğrular.

Mesh-Local

Mesh-Local kapsamı, aynı Thread ağında erişilebilen tüm Thread arayüzlerini içerir. ff03::1 çoklu yayın adresine gönderilen bir ping'in yanıtlarını görelim.

FTD Komiseri'nden ff03::1'e ping gönderin:

## 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 FTD Komiseri, biri FTD Birleştirici'nin Yönlendirme Bulucu'sundan (b800 ile biten RLOC) ve diğeri RCP Birleştirici'nin Mesh-Local EID'sinden (d55f ile biten ML-EID) olmak üzere iki yanıt aldı. Bunun nedeni, mesh-local kapsamının Thread ağının tamamını içermesidir. Bir cihaz ağın neresinde olursa olsun ff03::1 adresine abone olur.

otcodelab_top02C_02_ML.png

Aynı davranışı doğrulamak için FTD Birleştirici'den ff03::1'ü pingleyin:

## 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ştirici'nin yanıt süresini not edin. RCP birleştirme aracının FTD komisyonuna (68 ms) ulaşması, FTD birleştirme aracına (23 ms) ulaşmasından çok daha uzun sürdü. Bunun nedeni, FTD Birleştirici'nin bir atlama yapmasına kıyasla FTD Komiseri'ne ulaşmak için iki atlama yapması gerekmesidir.

Ayrıca, mesh yerel çoklu yayın ping'inin yalnızca iki FTD için RLOC ile yanıt verdiğini (RCP Birleştirici için değil) fark etmiş olabilirsiniz. Bunun nedeni, FTD'lerin ağdaki Yönlendiriciler, RCP'nin ise son cihaz olmasıdır.

Onaylamak için RCP Birleştirici'nin durumunu kontrol edin:

## RCP Joiner ##
----------------

> state
child

13. UDP ile mesaj gönderme

OpenThread'un sağladığı uygulama hizmetlerinden biri, Taşıma Katmanı protokolü olan Kullanıcı Datagram Protokolü'dür (UDP). OpenThread'a dayalı bir uygulama, bir Thread ağındaki düğümler arasında veya harici bir ağdaki diğer cihazlara (Thread ağında bir Sınır Yönlendirici varsa internet gibi) mesaj iletmek için UDP API'yi kullanabilir.

UDP soketleri OpenThread CLI üzerinden gösterilir. İki FTD arasında mesaj iletmek için bunu kullanalım.

FTD Birleştirici için Mesh-Local EID adresini alın. Bu adresi, Thread ağındaki herhangi bir yerden erişilebildiğ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 Komisyon Üyesi'ne geçin, UDP'yi başlatın ve ML-EID'sini kullanarak FTD Birleştirici'de oluşturduğ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 etkin olmalıdır. FTD Komiseri'nden mesaj gönderme:

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

FTD Birleştirici'de UDP mesajı alındı.

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. Tebrikler!

Fiziksel bir mesaj dizisi ağı oluşturdunuz.

b915c433e7027cc7.png

Artık şunları biliyorsunuz:

  • Mesaj dizisi cihaz türleri, rolleri ve kapsamları arasındaki fark
  • Thread cihazların ağdaki durumlarını nasıl yönettiği
  • UDP kullanarak düğümler arasında basit mesajlar iletme

Sonraki adımlar

Bu kod laboratuvarını temel alarak aşağıdaki alıştırmaları deneyin:

  • FTD Birleştirici kartını ot-cli-mtd ikilisini kullanarak MTD olarak yeniden flaşlayın ve kendisini hiçbir zaman Yönlendirici'ye yükseltmediğini veya Lider olmaya çalışmadığını gözlemleyin
  • Ağa daha fazla cihaz ekleyin (farklı bir platform deneyin!) ve çoklu yayın adreslerine ping'ler göndererek yönlendirici ve alt tabloları kullanarak topolojinin ana hatlarını çıkarın
  • NCP'yi kontrol etmek için pyspinel'i kullanın
  • OpenThread Sınır Yönlendirici'yi kullanarak NCP'yi Sınır Yönlendirici'ye dönüştürün ve Thread ağınızı internete bağlayın

Daha fazla bilgi

Aşağıdakiler de dahil olmak üzere çeşitli OpenThread kaynakları için openthread.io ve GitHub'a göz atın:

Referans: