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

Bu codelab hakkında
schedule88 dakika
subjectSon güncelleme 15 Ağustos 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 sunarak bağlı ev ürünlerinin geliştirilmesini hızlandırmak için OpenThread'i yayınladı.

Thread spesifikasyonu, ev uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güç tüketen kablosuz cihazdan cihaza iletişim protokolünü tanımlar. OpenThread, IPv6, 6LoWPAN, MAC güvenliği ile IEEE 802.15.4, Mesh Link Establishment ve Mesh Routing dahil olmak üzere tüm Thread ağ katmanlarını uygular.

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

4806d16a8c137c6d.jpeg

Neler öğreneceksiniz?

  • OpenThread CLI ikili dosyalarını geliştirme kartlarına oluşturma ve 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 KSA ile Thread düğümlerini manuel olarak yönetme
  • Cihazların Thread ağına güvenli bir şekilde eklenmesi
  • IPv6 çoklu yayının işleyiş şekli
  • UDP ile iş parçacığı düğümleri arasında mesaj iletme

İhtiyacınız olanlar

Donanım:

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

Yazılım:

  • GNU Toolchain
  • 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 Simulation Codelab'i inceleyebilirsiniz.

Seri bağlantı noktası terminalleri

Bir terminal aracılığıyla seri bağlantı noktasına nasıl bağlanacağınızı biliyor olmanız gerekir. Bu Codelab'de GNU Screen kullanılır ve kullanımına dair genel bir bakış sunulur ancak başka herhangi bir terminal yazılımı da kullanılabilir.

Linux makine

Bu Codelab, bir i386 veya x86 tabanlı Linux makinesini bir Radyo Yardımcı İşlemcisi (RCP) Thread cihazına ana makine olarak hizmet verecek ve tüm Thread geliştirme kartlarını flashlayacak ş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ılır.

a6693da3ce213856.png

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

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

nRF5x Command Line Tools'u yükleme

nRF5x Command Line Tools, 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 Toolchain'i yükleme

Derleme için ARM GNU Toolchain 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ındaki talimatları uygulayın.

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

Screen, 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 istediğiniz herhangi bir 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 olmanızı sağlar:

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

OpenThread arka plan programını oluşturun:

$ script/cmake-build posix -DOT_DAEMON=ON

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

4. RCP Joiner'ı ayarlama

Derleme ve yükleme

Katılımcı ve yerel USB işlevselliğiyle OpenThread nRF52840 örneğini oluşturun. Bir cihaz, Thread ağına güvenli bir şekilde kimlik doğrulaması yapmak ve devreye almak için Katılımcı rolünü kullanır. Yerel USB, nRF52840 ile ana makine arasında seri aktarım olarak USB CDC ACM'nin kullanılmasını sağlar.

rm -rf build komutunu çalıştırarak depoyu her zaman önce önceki derlemelerden temizleyin.

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

OpenThread RCP ikilisinin bulunduğu dizine gidin ve bunu 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 bağlayın. nRF52840 kartındaki nRF güç kaynağı anahtarını VDD olarak ayarlayın. Doğru şekilde bağlandığında LED5 yanar.

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ı olarak 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 Command Line Tools'un konumuna gidin ve kartın seri numarasını kullanarak OpenThread RCP hex dosyasını nRF52840 kartına yükleyin. --verify işaretini kullanmazsanız hata olmadan flaş işleminin başarısız olabileceğini belirten bir uyarı mesajı görürsünüz.

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

Başarılı olursa aşağıdaki çıktı 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 pano rollerini karıştırmamak için panoyu "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, ardından RESET 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'u kullanın. Günlük çıkışını görebilmek ve çalıştığını onaylayabilmek için ot-daemon komutunu -v ayrıntılı (verbose) işaretiyle başlatın:

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

Başarılı olduğunda, ayrıntılı moddaki ot-daemon komutu aşağıdakine benzer bir çıktı 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 günlüklerinin 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'yı 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 System-on-Chip (SoC) tasarımında Full Thread Devices (FTD) cihazlardır. Bir cihaz, cihazların güvenli bir şekilde kimliğini doğrulamak ve ağa dahil etmek için Komisyon Üyesi olarak işlev görür. Diğer cihaz, Komisyon Üyesi'nin Thread ağına kimliğini doğrulayabileceği bir Katılımcı olarak işlev görür.

Derleme ve yükleme

OpenThread FTD örneğini, nRF52840 platformu için Commissioner ve Joiner rolleri etkinleştirilmiş şekilde oluşturun:

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

OpenThread Full Thread Device (FTD) CLI ikilisinin bulunduğu dizine gidin ve bunu 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ünmelidir (tüm nRF52840 kartları, seri bağlantı noktası tanımlayıcısı olarak 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 Command Line Tools'un bulunduğu konuma gidin ve kartın seri numarasını kullanarak OpenThread CLI FTD hex dosyasını 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

Panoyu "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, ardından RESET 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

Bir terminal penceresinden GNU Screen'i kullanarak OpenThread CLI'ye erişerek başarılı bir derleme olduğunu doğrulayın.

$ screen /dev/ttyACM1

Yeni pencerede, OpenThread CLI > istemini getirmek için klavyede Return tuşuna birkaç kez basın. IPv6 arayüzünü etkinleştirin ve adresleri kontrol edin:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Ctrl+a tuşlarını kullanın →

d FTD Commissioner CLI'dan ayrılmak ve bir sonraki kartın yanıp sönmesi için Linux terminaline dönmek üzere. KSA'ya istediğiniz zaman yeniden girmek için komut satırından screen -r komutunu kullanın. Kullanılabilir 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 Joiner'ı ayarlama

Mevcut ot-cli-ftd.hex derlemesini kullanarak üçüncü nRF52840 kartını yanıp söndürmek için yukarıdaki işlemi tekrarlayın. İşlem tamamlandığında, nRF USB bağlantı noktasını kullanarak kartı bilgisayara yeniden bağlayın ve nRF güç kaynağı anahtarını VDD olarak ayarlayın.

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

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

Kartı "Birleştirme" olarak etiketleyin.

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

$ screen -r

Ctrl+a → c tuşlarına basarak ekranda yeni bir pencere oluşturun.

Yeni bir komut satırı istemi görünür. FTD Joiner için OpenThread KSA'ya erişme:

$ screen /dev/ttyACM2

Bu yeni pencerede, OpenThread CLI > istemini getirmek için klavyede Return tuşuna birkaç kez basın. IPv6 arayüzünü etkinleştirin ve adresleri kontrol edin:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

FTD Joiner CLI, FTD Commissioner ile aynı Screen örneğinde olduğundan artık Ctrl+a → n tuşlarını kullanarak aralarında geçiş yapabilirsiniz.

Ctrl+a tuşlarını kullanın →

d tuşuna basarak dilediğiniz zaman Ekran'dan çıkabilirsiniz.

6. Terminal penceresi kurulumu

İlerleyen zamanlarda Thread cihazları arasında sık sık geçiş yapacağınız için hepsinin etkin ve kolayca erişilebilir olduğundan emin olun. Şu ana kadar iki FTD'ye erişmek için Screen'i kullanıyorduk. Bu araç, aynı terminal penceresinde bölünmüş ekranı da destekliyor. Bir düğümün diğerinde verilen komutlara nasıl tepki verdiğini görmek için bu özelliği kullanın.

İdeal olarak, dört pencereye kolayca erişebilmeniz gerekir:

  1. ot-daemon hizmet / günlükler
  2. ot-ctl üzerinden RCP Joiner
  3. OpenThread CLI aracılığıyla FTD Commissioner
  4. OpenThread CLI aracılığıyla FTD Joiner

Kendi terminalinizi / seri bağlantı noktası yapılandırmanızı veya aracınızı kullanmak istiyorsanız bir sonraki adıma geçebilirsiniz. Tüm cihazlardaki 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 ayarladığınızda zaten bir tane oluşturmuş olmanız gerekir.

Screen'deki tüm komutlar Ctrl+a ile başlar.

Temel ekran komutları:

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

screen -r

Ekran oturumundan ayrılma

Ctrl+a → d

Ekran oturumunda yeni pencere oluşturma

Ctrl+a → c

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

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

Screen oturumunda geçerli pencereyi kapatma

Ctrl+a → k

Bölünmüş Ekran

Ekran ile terminali birden fazla pencereye bölebilirsiniz:

f1cbf1258cf0a5a.png

screen içindeki komutlara Ctrl+a tuşlarını kullanarak erişilir. Her komut bu erişim anahtarı kombinasyonuyla başlamalıdır.

Codelab'i tam olarak uyguladıysanız aynı ekran örneğinde iki pencere (FTD Commissioner, FTD Joiner) olmalıdır. Ekranı ikisi arasında bölmek için önce mevcut ekran oturumunuza girin:

$ screen -r

FTD cihazlarından birinde olmanız gerekir. Ekranda şu adımları uygulayın:

  1. Ctrl+a → S: Pencereyi yatay olarak bölmek için
  2. İmleci yeni boş pencereye taşımak için Ctrl+a → Tab
  3. Ctrl+a → n tuşlarına basarak yeni pencereyi bir sonraki pencereye geçirme
  4. Üstteki 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 ikisi de görünür durumda. Ctrl+a → Tab tuşlarını kullanarak bunlar arasında geçiş yapın. Karışıklığı önlemek için her pencereye Ctrl+a → A tuşlarına basarak yeniden ad vermeniz önerilir.

Gelişmiş kullanım

Ekranı dört eşit parçaya bölmek ve ot-daemon günlükleri ile RCP Joiner'ı ot-ctl görüntülemek için bu hizmetlerin aynı ekran örneğinde başlatılması gerekir. Bunu yapmak için ot-daemon durdurun ve ot-ctl çıkın, ardından bunları yeni Screen pencerelerinde yeniden başlatın (Ctrl+a → c).

Bu kurulum gerekli değildir ve kullanıcıya alıştırma olarak bırakılmıştır.

Aşağıdaki komutlarla pencereleri bölüp pencereler arasında gezinin:

Yeni pencere oluşturma

Ctrl+a → c

Pencereyi dikey olarak bölme

Ctrl+a →

Pencereyi yatay olarak bölme

Ctrl+a → S

Sonraki görüntülenen pencereye atlama

Ctrl+a → Tab

Görüntülenen pencereyi ileri veya geri taşıma

Ctrl+a → n veya p

Geçerli pencereyi yeniden adlandırma

Ctrl+a → A

Ctrl+a → d ile istediğiniz zaman Screen'den 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 şimdi Thread ağımızı oluşturalım. FTD Commissioner'da yeni bir Operasyonel Veri Kümesi oluşturun ve bunu etkin veri kümesi olarak kaydedin. İşletim 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 olan 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ü etkinleştirin:

> ifconfig up
Done

Start Thread protokol işlemi:

> thread start
Done

Bir süre sonra cihaz durumunu kontrol edin. Lider olmalıdır. Ayrıca, ileride kullanmak üzere 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 Joiner'da ot-ctl tarihinden itibaren:

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

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

FTD Joiner'daki OpenThread CLI'dan:

## 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 Joiner'ı ekleme

Thread Commissioning, ağda etkin değil. Bu nedenle, bant dışı devreye alma süreci kullanarak yeni oluşturduğumuz Thread ağına RCP Joiner'ı eklememiz gerekiyor.

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

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Ardından, RCP Joiner'da etkin veri kümesi ağ anahtarını FTD Commissioner Network Key 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 Joiner'ın "codelab" ağına katılması için Thread'i başlatı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

Ağ içi IPv6 adresini (burada fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f) not edin. Bu adresi daha sonra kullanacaksınız.

FTD Commissioner'a geri dönerek her iki cihazın da aynı ağın parçası olduğunu onaylamak için yönlendirici ve alt tabloları kontrol edin. RCP Joiner'ı 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 Joiner'ın ağa özel adresini (RCP Joiner'ın ipaddr çıkışından alınan ağa özel adres) 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 iki düğümden oluşan bir Thread ağımız var. Bu ağ, aşağıdaki topoloji şemasıyla gösterilmektedir:

otcodelab_top01C_2nodes.png

Topoloji şemaları

Codelab'in geri kalanında ilerlerken ağın durumu her değiştiğinde yeni bir Thread topoloji şeması göstereceğiz. Düğüm rolleri aşağıdaki şekilde gösterilir:

b75a527be4563215.png

Yönlendiriciler her zaman beşgen, uç cihazlar ise her zaman daire şeklindedir. Her düğümdeki sayılar, o sırada her düğümün mevcut rolüne ve durumuna bağlı olarak CLI çıkışında gösterilen yönlendirici kimliğini veya alt öğe kimliğini temsil eder.

9. FTD Joiner'ı devreye alma

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

FTD Joiner'da, FTD Komiseri'nin tanımlayabilmesi için eui64'yi alın:

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

> eui64
2f57d222545271f1
Done

FTD Commissioner'da, komisyoneri başlatın ve katılabilen cihazın eui64 değerini, Joiner Credential ile birlikte belirtin (örneğin, J01NME). Katılımcı kimlik bilgisi, 6 ila 32 karakter uzunluğunda, cihazlara özel, tamamen büyük harflerden oluşan alfasayısal karakterler (0-9 ve A-Y; okunabilirlik için I, O, Q ve Z hariç) dizisidir.

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

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

FTD Joiner'a geçin. FTD Commissioner'da yeni oluşturduğunuz Joiner Credential ile birleştirme rolünü başlatın:

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

> ifconfig up
Done
> joiner start J01NME
Done

Bir dakika içinde başarılı bir kimlik doğrulama onayı alırsınız:

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

>
Join success

FTD Joiner'ın "codelab" ağına katılması için Thread'i başlatın ve durumu ile RLOC16'yı hemen kontrol edin:

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

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

Cihazın IPv6 adreslerini kontrol edin. ALOC'nin olmadığını fark edin. Bunun nedeni, bu cihazın lider olmaması veya 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 Commissioner'a geçin ve yönlendirici ile alt tabloları kontrol ederek "codelab" ağında üç cihazın bulunduğunu doğrulayın:

## 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 uç cihaz (alt) olarak bağlanmıştır. Güncellenen topolojimiz:

otcodelab_top01C_ed01.png

10. Thread'in kullanılma şekli

Bu Codelab'deki Thread cihazları, Yönlendiriciye Uygun Uç Cihaz (REED) adı verilen belirli bir tür Tam Thread Cihazı (FTD)dır. Bu nedenle, yönlendirici veya uç cihaz olarak işlev görebilir ve kendilerini uç cihazdan yönlendiriciye yükseltebilirler.

Thread, 32 yönlendiriciyi destekleyebilir ancak yönlendirici sayısını 16 ile 23 arasında tutmaya çalışır. Bir REED, Uç Cihaz (alt) olarak bağlanırsa ve yönlendirici sayısı 16'dan azsa iki dakika içinde rastgele bir süre sonra otomatik olarak yönlendiriciye yükseltilir.

FTD Joiner'ı ekledikten sonra Thread ağınızda iki çocuğunuz varsa en az iki dakika bekleyin, ardından FTD Commissioner'da yönlendirici ve çocuk 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 Joiner (Genişletilmiş MAC = e6cdd2d93249a243) kendisini yönlendirici olarak tanıttı. RLOC16'nın farklı olduğunu (b800 yerine 0c02) unutmayın. Bunun nedeni, RLOC16'nın bir cihazın yönlendirici kimliğine ve alt kimliğine dayanmasıdır. Uç Cihaz'dan Yönlendirici'ye geçiş yaptığında Yönlendirici Kimliği ve Alt Cihaz Kimliği değerleri değişir. 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 Joiner'ı alt sürüme geçirme

Bu davranışı, FTD Joiner'ı bir yönlendiriciden uç cihaza manuel olarak düşürerek test edebilirsiniz. Durumu alt yayıncı olarak değiştirin ve RLOC16'yı kontrol edin:

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

FTD Commissioner'a döndüğünüzde FTD Joiner artık alt tabloda (ID = 3) görünmelidir. 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 Thread yönlendiriciler arasından kendi kendini seçer. Bu durumda, mevcut lider Thread ağından kaldırılırsa diğer yönlendiricilerden biri yeni lider olur.

FTD Commissioner'da Thread ağından kaldırmak için Thread'i kapatın:

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

> thread stop
Done
> ifconfig down
Done

İki dakika içinde FTD Joiner yeni Thread lideri olur. Doğrulamak için FTD Joiner'ın 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'i ile belirtildiği gibi RCP Katılımcısıdır. Thread ağını bir arada tutmak için üst yönlendiricileri FTD Komisyon Üyesi'nden FTD Katılımcısı'na geçirmiştir. Bu durum, 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 alt öğe olarak eklenmesi için birkaç dakika beklemeniz gerekebilir. Aşağıdakileri onaylamak için eyaleti ve RLOC16'yı kontrol edin:

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

> state
child
> rloc16
b801

FTD Commissioner'ı yeniden bağlayın

İki düğümlü bir Thread ağı pek eğlenceli değildir. FTD Komiseri'ni tekrar internete bağlayalım.

FTD Commissioner'da Thread'i yeniden başlatın:

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

> ifconfig up
Done
> thread start
Done

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

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

> state
router
Done

Şunları doğrulamak için FTD Joiner'daki yönlendirici 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 tekrar üç düğümden oluşuyor.

11. Sorun giderme

Farklı terminal veya ekran pencerelerinde birden fazla cihazla Thread ağını 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ından yararlanın.

Ekran

Yapılandırmanızda kaybolursanız (çok fazla Screen penceresi veya Screen içinde Screen) komut satırında screen -ls çıkışı No Sockets found olana kadar Ctrl+a → k ile Screen pencerelerini kapatmaya devam edin. Ardından, her cihaz için ekran pencerelerini yeniden oluşturun. Ekran kapatılsa bile cihaz durumları korunur.

Thread düğümleri

Thread ağ topolojisi bu Codelab'de açıklandığı gibi değilse veya düğümler bir nedenden dolayı (ör. bunları çalıştıran Linux makinesi uyku moduna geçtiği için) bağlantıyı keserse Thread'i kapatmak, ağ kimlik bilgilerini temizlemek ve Thread ağını oluşturma adımından tekrar başlamak en iyisidir.

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, bilgileri aynı anda bir grup cihaza iletmek için kullanılır. Bir Thread ağında, kapsama bağlı olarak farklı cihaz gruplarıyla çoklu yayın kullanımı için belirli adresler ayrılır.

IPv6 Adresi

Kapsam

Teslim edildiği yer

ff02::1

Link-Local

Tüm FTD'ler ve MED'ler

ff02::2

Link-Local

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 bir sınır yönlendirici kullanmadığımız için iki FTD ve MED çoklu yayın adresine odaklanalım.

Bağlantı yerel kapsamı, tek bir radyo iletimi veya tek bir "atlama" ile erişilebilen tüm Thread arayüzlerini kapsar. Ağ topolojisi, ff02::1 çoklu yayın adresine ping gönderildiğinde hangi cihazların yanıt vereceğini belirler.

FTD Komisyon Üyesi'nden gelen 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 (FTD Joiner ve RCP Joiner) var ancak FTD Commissioner yalnızca FTD Joiner'ın bağlantı yerel adresinden (LLA) bir yanıt aldı. Bu, FTD Joiner'ın, FTD Commissioner'ın tek bir atlamayla ulaşabileceği tek cihaz olduğu anlamına gelir.

otcodelab_top02C_02_LL.png

Şimdi FTD Joiner'dan ff02::1 ping'ini 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, ilkinin (4b1d ile biten) FTD Commissioner'ın LLA'sı, ikincisinin (943b ile biten) ise RCP Joiner'ın LLA'sı olduğunu görüyoruz.

otcodelab_top02C_02_LL02.png

Bu, FTD Joiner'ın hem FTD Commissioner'a hem de RCP Joiner'a doğrudan bağlı olduğu anlamına gelir. Bu da topolojimizi doğrular.

Mesh-Local

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

FTD Komisyon Üyesi'nden gelen ff03::1 ping'i:

## 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 iki yanıt aldı: biri FTD Katılımcısı'nın Yönlendirme Konumlayıcısı'ndan (RLOC, b800 ile biter), diğeri ise RCP Katılımcısı'nın Mesh-Local EID'sinden (ML-EID, d55f ile biter). Bunun nedeni, mesh-local kapsamının tüm Thread ağını kapsamasıdır. Bir cihaz ağın neresinde olursa olsun ff03::1 adresine abone olur.

otcodelab_top02C_02_ML.png

Aynı davranışı onaylamak için FTD Joiner'dan ff03::1 ping'leyin:

## 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 Joiner'ın yanıt süresine dikkat edin. RCP Joiner'ın FTD Commissioner'a ulaşması, FTD Joiner'a ulaşmasından (23 ms) çok daha uzun sürdü (68 ms). Bunun nedeni, FTD'ye katılan için tek bir yönlendirme gerekirken FTD Komisyon Üyesi'ne ulaşmak için iki yönlendirme yapılmasıdır.

Ayrıca, mesh'e yerel çok noktalı ping'in, RCP Joiner için değil, yalnızca iki FTD için RLOC ile yanıt verdiğini de fark etmiş olabilirsiniz. Bunun nedeni, FTD'lerin ağdaki yönlendiriciler, RCP'nin ise bir uç cihaz olmasıdır.

Onaylamak için RCP Joiner'ın durumunu kontrol edin:

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

> state
child

13. UDP ile mesaj gönderme

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

UDP soketleri, OpenThread CLI üzerinden kullanıma sunulur. İki FTD arasında mesaj iletmek için bu bağlantıyı kullanalım.

FTD Joiner için Mesh-Local EID adresini alın. Bu adresi, Thread ağında her 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 Commissioner'a geçin, UDP'yi başlatın ve FTD Joiner'da ayarladığınız sokete ML-EID'sini kullanarak 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 Joiner'da UDP mesajı alındı.

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

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

14. Tebrikler!

Fiziksel bir Thread ağı oluşturdunuz.

b915c433e7027cc7.png

Artık şunları biliyorsunuz:

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

Sonraki adımlar

Bu Codelab'den yararlanarak aşağıdaki alıştırmaları deneyin:

  • FTD Joiner kartını ot-cli-mtd ikili dosyasını kullanarak MTD olarak yeniden flaşlayın ve kendisini asla 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 çoklu yayın adreslerine ping göndererek yönlendirici ve alt tabloları kullanarak topolojiyi çizin.
  • NCP'yi kontrol etmek için pyspinel'i kullanma
  • OpenThread Border Router'ı kullanarak NCP'yi sınır yönlendiriciye dönüştürme ve Thread ağınızı internete bağlama

Daha fazla bilgi

Aşağıdakiler de dahil olmak üzere çeşitli OpenThread kaynakları için openthread.io ve GitHub'u inceleyin:

Referans: