nRF52840 kartları ve OpenThread ile bir Thread ağı oluşturun

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, bağlı ev için ürünlerin geliştirilmesini hızlandırmak amacıyla geliştiricilerin genel olarak kullanabilmesi için OpenThread'i kullanıma sundu.

İleti dizisi spesifikasyonu, ev uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güçlü kablosuz cihazdan cihaza iletişim protokolü tanımlar. OpenThread; IPv6, 6LoWPAN, IEEE 802.15.4 MAC güvenliği, Örgü Bağlantısı Oluşturma ve Örgü Yönlendirme dahil tüm Thread ağ iletişimi katmanlarını uygular.

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

4806d16a8c137c6d.jpeg

Neler öğreneceksiniz?

  • OpenThread CLI ikili sürümlerini derleme ve yanıp sönme
  • Linux makinesi ve geliştirici kartından oluşan bir RCP oluşturma
  • OpenThread Daemon ve ot-ctl kullanarak RCP ile iletişim kurma
  • Thread düğümlerini GNU Screen ve OpenThread CLI ile manuel olarak yönetme
  • Cihazların Thread ağına güvenli bir şekilde dağıtılması
  • IPv6 çoklu yayını nasıl çalışır?
  • UDP ile İleti dizisi düğümleri arasında ileti iletme

Gerekenler

Donanım:

  • 3 Nordic Semiconatorsor 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 makinesi

Yazılım:

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

2. Kullanmaya başlama

OpenThread Simülasyonu

Başlamadan önce temel iş parçacığı kavramları ve OpenThread KSA hakkında bilgi edinmek için OpenThread Simülasyon Kod Laboratuvarı'nı gözden geçirebilirsiniz.

Seri bağlantı noktası terminalleri

Bir bağlantı noktasına, bir bağlantı noktasından seri bağlantı noktasına nasıl bağlanacağınızı bilmeniz gerekir. Bu Codelab'de GNU Ekranı kullanılır ve bir kullanım özeti sağlanır, ancak diğer terminal yazılımları kullanılabilir.

Linux makinesi

Bu Codelab, bir Radyo Ortak İşlemci (RCP) Thread cihazına ev sahipliği yapmak ve tüm Thread geliştirme panolarını çalıştırmak için i386 veya x86 tabanlı bir Linux makinesi kullanmak üzere tasarlanmıştır. Tüm adımlar Ubuntu 14.04.5 LTS'de (Trusty Tahr) test edildi.

Nordic Semiconatorsor nRF52840 panolar

Bu Codelab'de üç nRF52840 PDK kartı kullanılmıştır.

a6693da3ce213856.png

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

Makinenize uygun paketi indirin ve uygun konuma yükleyin. Linux'ta bu bir /opt/SEGGER/JLink.

nRF5x Komut Satırı Araçlarını Yükle

nRF5x Komut Satırı Araçları, OpenThread ikili kodlarını nRF52840 kartlarına kopyalamanıza olanak tanır. Uygun nRF5x-Command-Line-Tools-<OS> derlemesini Linux makinenize yükleyin.

Çıkarılan paketi ~/ kök klasörüne yerleştirin

ARM GNU Araç Zinciri'ni yükleme

ARM GNU Araç Zinciri, yapı oluşturmak için kullanılır.

Çıkarılan arşivi Linux makinenizdeki /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ klasörüne yerleştirmenizi öneririz. Yükleme talimatları için arşivin readme.txt dosyasındaki talimatları uygulayın.

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

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

$ sudo apt-get install screen

3. Depoları klonlama

OpenThread

OpenThread öğesini klonlayın ve yükleyin. script/bootstrap komutları, araç zincirinin yüklü olduğundan ve ortamın düzgün ş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ı Oluşturma:

$ script/cmake-build posix -DOT_DAEMON=ON

Artık OpenThread öğesini nRF52840 kartlarına oluşturup flash etmeye hazırsınız.

4. RCP Birleştirme aracını ayarlama

Oluşturun ve yanıp sönün

Birleştirme aracı ve yerel USB işleviyle OpenThread nRF52840 örneğini oluşturun. Bir cihaz, güvenli bir şekilde kimlik doğrulaması yapmak ve bir Thread ağına bağlanmak için Birleştirici rolünü kullanır. Yerel USB, nRF52840 ile ana makine arasında seri aktarım olarak USB CDC ACM kullanılmasını sağlar.

Her zaman önce rm -rf build komutunu ç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ı içeren dizine gidin ve 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üç raptiyesinin yanındaki mikro USB hata ayıklama bağlantı noktasına, 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 beyaz tahtaysa seri bağlantı noktası /dev/ttyACM0 olarak görünür (sn bağlantı noktası tanımlayıcısı için tüm nRF52840 panolar ttyACM kullanır).

$ ls /dev/ttyACM*
/dev/ttyACM0

RCP için kullanılan nRF52840 panosunun seri numarasını not edin:

c00d519ebec7e5f0.jpeg

nRFx Komut Satırı Araçları'nın konumuna gidin ve tahtanın seri numarasını kullanarak OpenThread RCP onaltılık dosyasını nRF52840 panosuna yapıştırın. --verify işaretini devre dışı bırakırsanız flash 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

Aşağıdaki sonuç başarılı olduğunda 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.

Jamboard'u daha sonra karışık hale getirmemek için beyaz tahtayı"RCP" olarak etiketleyin.

Yerel USB'ye bağlan

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ındaki hata ayıklama bağlantı noktasından çıkarın, ardından Sıfırlama 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ı Başlatma

RCP tasarımında, Thread cihazıyla iletişim kurmak ve cihazı yönetmek için OpenThread Daemon kullanın. ot-daemon değerini -v ayrıntılı işaretiyle başlatın. Böylece günlük çıktısını görebilir ve çalışıp çalışmadığını kontrol edebilirsiniz:

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

İşlem başarılı olduğunda ayrıntılı modda ot-daemon aşağıdakine benzer çıkışlar 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 kullanın. ot-ctl, OpenThread CLI uygulamasıyla aynı CLI'yı kullanır. Bu nedenle, ot-daemon düğümlerini diğer Thread simülasyonundaki cihazlarla 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 Düğüm 2'nin (RCP düğümü) state değerini kontrol edin:

> state
disabled
Done

5. FTD'leri ayarlama

Bu Codelab'de kullanılan diğer iki ileti dizisi düğümü, standart System-on-Chip (SoC) tasarımındaki tam iş parçacığı cihazlarıdır. Bir Üretim ortamında, OpenThread NCP örneklerini kontrol etmek için üretim düzeyinde bir ağ arayüzü sürücüsü olan wpantund kullanılabilir. Ancak bu codelab'de, OpenThread KSA'yı ot-ctl olarak kullanacağız.

Bir cihaz, bu ağda güvenli bir şekilde cihaz kimliklerini doğrulamak ve bu cihazlara yaptırmak için Komisyoncu olarak çalışır. Diğer cihaz, komisyoncunun Thread ağında kimlik doğrulayabileceği bir birleştirme aracı olarak çalışır.

Oluşturun ve yanıp sönün

nRF52840 platformu için Komisyoncu ve Birleştirici rollerinin etkin olduğu OpenThread FTD örneğini 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 ikili kimliğiyle dizine gidin ve 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üç PIN'inin yanındaki mikro USB bağlantı noktasına takın ve ardından Linux makinesine takın. RCP hâlâ Linux makinesine bağlıysa bu yeni Jamboard'un seri bağlantı noktası /dev/ttyACM1 olarak görünecektir (tüm nRF52840 Jamboard'larda seri bağlantı noktası tanımlayıcısı için ttyACM kullanılır).

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

Daha önce olduğu gibi, FTD için kullanılan nRF52840 panosunun seri numarasını not edin:

c00d519ebec7e5f0.jpeg

nRFx Komut Satırı Araçları'nın konumuna gidin ve tahtanın seri numarasını kullanarak OpenThread CLI FTD onaltılık dosyasını nRF52840 panosuna yapıştırın:

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

Jamboard'u "Komisyonlu" olarak etiketleyin.

Yerel USB'ye bağlan

OpenThread FTD derlemesi, yerel USB CDC ACM'nin seri aktarım olarak kullanılmasını sağladığından, RCP ana makinesi (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 yanıp sönen nRF52840 kartındaki hata ayıklama bağlantı noktasından çıkarın, ardından Sıfırlama 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ğrula

Bir terminal penceresinden GNU Screen'i kullanarak OpenThread CLI'ya erişerek başarılı bir derleme doğrulayın. nRF52840 kartları 115.200 bit hızı kullanır.

$ screen /dev/ttyACM1 115200

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 → kısayolunu kullanın

d FTD Commissioner CLI'dan ayrılmak ve Linux terminaline dönmek için bir sonraki kartın yanıp sönmesini sağlayın. KSA'yı istediğiniz zaman yeniden girmek için komut satırından screen -r değerini kullanın. Kullanılabilir ekranların listesini görmek için screen -ls bağlantısını kullanın:

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

FTD Birleştirme'yi kurma

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

Bu üçüncü kart eklendiğinde diğer iki düğüm Linux makinesine eklenmişse seri bağlantı noktası /dev/ttyACM2 olarak görünmelidir:

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

Jamboard'u "Katılıcı" olarak etiketleyin.

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

$ screen -r

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

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

$ screen /dev/ttyACM2 115200

Bu yeni pencerede, OpenThread CLI > istemini açmak 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:6c1e:87a2:df05:c240
Done

FTD Birleştirme CLI'sı artık FTD Komitesi'yle aynı ekranda yer aldığından, Ctrl+a → n tuşlarını kullanarak bunlar arasında geçiş yapabilirsiniz.

Ctrl+a → kısayolunu kullanın

d Ekranı kapat'ı tıklayın.

6. Terminal penceresi kurulumu

İleride, Thread cihazları arasında sık sık geçiş yapacağınız için hepsinin yayında ve kolayca erişilebilir olduğundan emin olun. Şu ana kadar iki FTD'ye erişmek için ekran kullanıyoruz ve bu araç, aynı terminal penceresinde bölünmüş ekrana da olanak tanıyor. Bir düğümün başka bir komutta 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 Bağlayıcı
  3. OpenThread CLI aracılığıyla FTD Commissioner
  4. OpenThread CLI aracılığıyla FTD Birleştirme

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 sizin için en uygun şekilde yapılandırın.

Ekran kullanılıyor

Kullanım kolaylığı için yalnızca bir Ekran oturumu başlatın. Her iki FTD'yi de oluştururken bir hesabınız olması gerekir.

Ekrandaki tüm komutlar Ctrl+a ile başlar.

Temel Ekran komutları:

Ekran oturumuna yeniden ekleme (komut satırından)

screen -r

Ekran oturumundan çık

Ctrl+a → d

Ekran oturumunda yeni pencere oluştur

Ctrl+a → c

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

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

Ekran oturumunda geçerli pencereyi kapat

Ctrl+a → k

Bölünmüş Ekran

Ekran ile terminali birden fazla pencereye bölebilirsiniz:

f1cbf1258cf0a5a.png

screen içindeki komutlara Ctrl+a ile erişilebilir. Her komut, bu erişim anahtarı kombinasyonuyla başlamalıdır.

Codelab'i tam olarak takip ediyorsanız aynı Ekran örneğinde iki pencereniz (FTD Commissioner, FTD Joiner) olmalıdır. Ekranı ikisi arasında bölmek için önce mevcut Ekran oturumunuzu girin:

$ screen -r

FTD cihazlardan birinde olmanız gerekir. Ekranda şu 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 sonraki pencereye geçirmek için Ctrl+a → n
  4. Üstteki pencereyle aynıysa diğer FTD cihazını görüntülemek için tekrar Ctrl+a → n

Artık ikisi de görünür. Ctrl+a → Tab tuşlarını kullanarak aralarında geçiş yapın. Kafa karışıklığını önlemek için her pencereyi Ctrl+a → A ile yeniden adlandırmanızı öneririz.

Gelişmiş kullanım

Ekranı çeyreklere daha ayrıntılı olarak bölmek ve ot-daemon günlükleriyle RCP Birleştirme ot-ctl aracını görüntülemek için bu hizmetlerin aynı Ekran örneğinde başlatılması gerekir. Bunu yapmak için ot-daemon dosyasını durdurun ve ot-ctl uygulamasından çıkın. Ardından bunları yeni Ekran pencerelerinde (Ctrl+a → c) yeniden başlatın.

Bu kurulum zorunlu değildir ve kullanıcı için alıştırma olarak bırakılır.

Aşağıdaki komutları kullanarak pencereler arasında bölün ve gezinin:

Yeni pencere oluştur

Ctrl+a → c

Pencereyi dikey olarak böl

Ctrl+a →

Pencereyi yatay olarak böl

Ctrl+a → S

Görüntülenen bir sonraki pencereye git

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

İstediğiniz zaman Ctrl+a → d tuşlarına basarak Screen'den ayrılıp komut satırından screen -r ile yeniden ekleyin.

Ekran hakkında daha fazla bilgi için GNU Screen hızlı başvuru sayfasını inceleyin.

7. Mesaj dizisi 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 Komisyonu'nda yeni bir Operasyonel Veri Kümesi oluşturup bunu etkin veri kümesi olarak kaydedin. Operasyonel 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ı'na 1234c0de7ab51234c0de7ab51234c0de dikkat edin.

Bu veri kümesini etkin veri kümesi olarak kaydedin:

> dataset commit active
Done

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

> ifconfig up
Done

Thread protokol işlemini başlatın:

> thread start
Done

Kısa bir süre sonra cihaz durumunu kontrol edin. Lider konumda olmalıdır. Gelecekteki referanslar için RLOC16 belgesini de inceleyebilirsiniz.

## 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ştirme'deki ot-ctl öğesinden:

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

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

FTD Birleştirme'de OpenThread KSA'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 Bağlayıcı'yı ekleme

Mesaj Dizisi Oluşturma, ağda etkin değil. Bu nedenle, RCP Birleştirici'yi grup dışı bir komisyon süreci kullanarak oluşturduğumuz Thread ağına eklememiz gerekecek.

FTD Yöneticisi'nde 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 Birleştirme'de, etkin veri kümesi Ağ Anahtarı'nı FTD Commissioner Ağ Anahtarı olarak ayarlayın:

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Veri kümesinin doğru ayarlandığından emin olun.

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

İleti Dizisini, RCP Birleştirici'nin "codelab" ağına katılmasını sağlayacak şekilde görüntüleyin. 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

Örgü Yerel IPv6 Adresini (burada fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f) not edin, daha sonra kullanacaksınız.

FTD Commissionr'a geri döndüğünüzde her iki cihazın da aynı ağa dahil olduğunu onaylamak için yönlendiriciyi ve alt tabloları kontrol edin. RCP Birleştirme aracını belirlemek 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 Bağlayıcı'nın örgü-yerel adresini pingleyin (RCP Bağlayıcı'nın ipaddr çıkışından alınan bağlantılı yerel adres).

## 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österildiği gibi iki düğümden oluşan bir İplik ağımız var:

otcodelab_top01C_2düğümler.png

Topoloji diyagramları

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

b75a527be4563215.png

Yönlendiriciler her zaman beşgen, Son Cihazlar ise her zaman dairelerdir. Her bir düğümdeki sayılar, her bir düğümün o anki rolüne ve durumuna bağlı olarak KSA çıktısında gösterilen Yönlendirici Kimliğini veya Alt Kimliği'ni temsil eder.

9. FTD Birleştirme'yi komisyon

Şimdi, üçüncü Thread cihazını "codelab" ağına ekleyelim. Bu sefer daha güvenli bir grup içi komisyon verme işlemi uygulayacak ve yalnızca FTD Toplantısı'nın katılmasına izin vereceğiz.

FTD Birleştirme Aracı'nda eui64 değerini almak için FTD Mükellefi tarafından tanımlanabilir:

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

> eui64
2f57d222545271f1
Done

FTD komisyoncusu'nda komisyoncuyu başlatın ve birleşen kimlik bilgileriyle birlikte katılabilecek cihazın eui64 değerini (ör. J01NME) belirtin. Birleştirilen Kimlik Bilgisi, tüm büyük alfanümerik karakterlerden (okunabilirlik için I, O, Q ve Z hariç 0-9 ve A-Y hariç) oluşan, 6 ila 32 karakter uzunluğunda bir cihaz dizesidir.

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

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

FTD Birleştirme'ye geçin. FTD Commissioner'da yeni oluşturduğunuz Eklenti Kimlik Bilgileri ile birleştirme rolünü başlatın:

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

> ifconfig up
Done
> joiner start J01NME
Done

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

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

>
Join success

FTD'nin "codelab" ağına katılmasını sağlamak için Thread'i 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. Herhangi bir ALOC olmadığına dikkat 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 görevlisine geçin ve "codelab" ağında üç cihazın 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ştirme Aracı, ağa Son Cihaz (alt) olarak bağlanmıştır. Güncellenen topolojimiz burada:

otcodelab_top01C_ed01.png

10. Mesaj dizisinin işleyiş şekli

Bu Codelab'deki Thread cihazları, Yönlendirici Uygun Son Cihaz (REED) olarak adlandırılan belirli bir Tam Thread Cihazı (FTD) türüdür. Yani ya yönlendirici ya da son cihaz olarak çalışabilirler? Kendini son cihazdan yönlendiriciye tanıtabilir.

Mesaj dizisi, 32'ye kadar yönlendiriciyi destekleyebilir, ancak yönlendiricilerin sayısını 16 ile 23 arasında tutmaya çalışır. REED bir Son Cihaz (alt) olarak eklenirse 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önlendirici'ye tanıtır.

FTD Birleştirme'yi ekledikten sonra Thread ağınızda iki çocuk aldıysanız en az iki dakika bekleyip FTD Commissioner'daki yönlendiriciyi ve alt tabloları tekrar 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ştirme Aracı (Genişletilmiş MAC = e6cdd2d93249a243), kendisini bir yönlendirici olarak tanıttı. RLOC16'nın farklı olduğunu unutmayın (0c02 yerine b800). Bunun nedeni, RLOC16'nın cihazın Yönlendirici Kimliği ve Alt Kimliği'ni temel almasıdır. Cihaz, son cihazdan yönlendiriciye geçiş yaptığında yönlendirici kimliği ve alt kimlik değerleri de RLOC16'da değişir.

otcodelab_top01C.png

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

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

> state
router
Done
> rloc16
b800
Done

FTD Birleştirme aracını alt sürüme geçirme

FTD Birleştirme'yi manuel olarak bir Son Cihaz'a düşürerek bu davranışı test edebilirsiniz. Durumu alt olarak değiştirip RLOC16'yı kontrol edin:

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

FTD Komitesi'nde, FTD Birleştirme'nin artık alt tabloda (Kimlik = 3) görünmesi gerekir. 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'su b800 olan bir yönlendiriciye geri döner.

otcodelab_top01C.png

Lideri kaldır

Lider, tüm Thread Yönlendiricileri arasında kendinden seçilerek seçildi. Bu nedenle, mevcut lider Thread ağında kaldırılırsa diğer yönlendiricilerden biri yeni lider olur.

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

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

> thread stop
Done
> ifconfig down
Done

İki dakika içinde FTD Birleştirme yeni Thread lideri olur. Doğrulamak için FTD Birleştirme'nin eyalet 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ğuna dikkat edin. Bu, kimliği ve Genişletilmiş MAC'de belirtildiği gibi RCP Bağlayıcıdır. Thread ağını bir arada tutmak için FTD Commissioner'dan FTD toplayıcısına geçiş yaptı. Bu işlem, RCP Birleştirme için yeni bir RLOC16 ile sonuçlanır (yönlendirici kimliği 3'ten 46'ya çıktığı 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 Bağlayıcı'nın çocuk olarak FTD'ye eklenmesi için birkaç dakika beklemeniz gerekebilir. Eyalet ve RLOC16'yı kontrol ederek şunları doğrulayın:

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

> state
child
> rloc16
b801

FTD görevlisini yeniden ekleyin

İki düğümlü bir Thread ağı pek eğlenceli değil. FTD Komisyonu'nu tekrar internete taşıyalım.

FTD Komisyonu'nda Thread'i yeniden başlatın:

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

> ifconfig up
Done
> thread start
Done

İki dakika içinde "codelab" ağına otomatik olarak son cihaz olarak eklenir ve daha sonra, bir yönlendiriciye yükseltilir.

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

> state
router
Done

Şunları doğrulamak için FTD Birleştirme'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

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

11. Sorun giderme

Bir terminali, farklı terminalde 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 çok fazla ekran varsa) hiç ekran kalmayıncaya kadar ekran pencerelerini Ctrl+a → k ile sonlandırmaya ve komut satırında screen -ls çıkışının No Sockets found çıkışına sahip olun. Ardından, her cihaz için ekran pencerelerini yeniden oluşturun. Cihaz kapatıldığında bile Ekran durumu korunur.

Mesaj dizisi düğümleri

Thread ağ topolojisi bu Codelab'de açıklandığı şekilde değilse veya düğümlerin bağlantısı herhangi bir nedenle kesildiyse (belki de bu makineleri destekleyen Linux makinesi uyku moduna geçmiş olabilir) Thread'i indirmeniz, ağ kimlik bilgilerini temizlemeniz ve Thread Thread ağını oluşturma adımından tekrar başlamanız önerilir.

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

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

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

RCP, ot-ctl aracılığıyla aynı şekilde sıfırlanabilir:

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

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Çoklu yayını kullanma

Çoklu yayın, bir dizi cihaza aynı anda bilgi iletmek için kullanılır. Bir Thread ağında, belirli adresler kapsama bağlı olarak farklı cihaz gruplarıyla çoklu yayın kullanımı için ayrılmıştır.

IPv6 Adresi

Kapsam

Şu adrese 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önlendiricileri

ff03::1

Bağlantılı Yerel

Tüm FTD'ler ve MED'ler

ff03::2

Bağlantılı Yerel

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

Bu Codelab'de Sınır Yönlendirici kullanmadığımızdan iki FTD ve MED çoklu yayın adresine odaklanalım.

Link-Local kapsamı, tek bir radyo iletimi veya tek bir "hop" ile erişilebilen tüm Thread arayüzlerini içerir. Ağ topolojisi, ff02::1 çoklu yayın adresine ping atanacak cihazları belirler.

FTD Komisyonundan ff02::1 pingleyin:

## 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 Birleştirme ve RCP Birleştirme) var ancak FTD Komitesi'nin Bağlantı FTD'si Bağlantı Yerel Adresi'nden (LLA) yalnızca bir yanıt alıyordu. Bu, FTD Komitesinin tek bir durakla ulaşabileceği tek cihaz olduğu anlamına gelir.

otcodelab_top02C_02_LL.png

Şimdi FTD Birleştirme'den ff02::1 pingleyin:

## 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 Komisyonunun LLA'sını, ikincisinin (943b ile biten) RCP Birleştirici'nin LLA'sını olduğunu görebiliriz.

otcodelab_top02C_02_LL02.png

Bu sayede, FTD Birleştirme yetkilisi hem FTD Müdürlüğü hem de RCP Birleştirici ile doğrudan bağlantı kurarak topolojimizi onaylar.

Bağlantılı Yerel

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

FTD Komisyonundan ff03::1 pingleyin:

## 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 Komitesi, biri FTD Birleştirme Yönlendirme Bulucu'dan (b800 ile biten RLOC) ve diğeri de RCP Birleştirme Mesh-Local EID'sinden (ML-EID, d55f ile biten) iki yanıt aldı. Bunun nedeni, örgü-yerel kapsamın Thread ağının tamamını içermesidir. Bir ağ, nerede olursa olsun ff03::1 adresine abone olur.

otcodelab_top02C_02_ML.png

Aynı davranışı onaylamak için FTD Birleştirme Aracı'ndan 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 bir ping çıkışındaki RCP Birleştirme aracının yanıt süresini not edin. RCP Bağlayıcı'ya ulaşmak, FTD'ye ulaşmak için 68 ms'den (23 ms) çok daha uzun sürdü. Bunun nedeni, FTD Komitesi'ne ulaşmak için tek atlamaya kıyasla FTD Mükellefi'ne ulaşmak için iki atlama yapmasıdır.

Örgü yerel çoklu yayın ping'inin RLOC ile 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 Son Cihaz olmasıdır.

İşlemi onaylamak için RCP Birleştirme'nin 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 User Datagram Protokolü'dür (UDP). OpenThread üzerinde oluşturulan bir uygulama, Thread API'deki düğümler arasında veya harici bir ağdaki (Thread (Ağ) Sınır Yönlendirici'yi içeriyorsa internet gibi diğer cihazlara mesaj iletmek için UDP API'yi kullanabilir.

UDP soketleri OpenThread KSA üzerinden açığa çıkar. Bunu, iki FTD arasında ileti aktarmak için kullanalım.

FTD Birleştirme için Mesh-Local EID adresini alın. Bu adresi, Thread ağının her yerinden erişilebilir olduğundan 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 tüm IPv6 adresleri 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 ML-EID'yi kullanarak FTD Birleştirme'de ayarladığınız 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 Komisyonundan mesaj gönderin:

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

> udp send hellothere
Done

UDP mesajı, FTD Birleştirme'de 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 aşağıdaki bilgileri biliyorsunuz:

  • Mesaj dizisi cihaz türleri, roller ve kapsamlar arasındaki fark
  • Thread cihazları ağdaki durumlarını nasıl yönetir?
  • UDP ile düğümler arasında basit iletiler nasıl iletilir?

Sonraki adımlar

Bu Codelab'i oluştururken aşağıdaki alıştırmaları deneyin:

  • ot-cli-mtd ikili programını kullanarak FTD Birleştirme panosunu MTD olarak yeniden etkinleştirin ve bunun hiçbir zaman bir Yönlendirici'ye yükseltmediğini veya lider olmaya çalışmadığını gözlemleyin
  • Ağa daha fazla cihaz ekleyin (farklı bir platform deneyin). Yönlendiriciyi, alt tabloları ve çoklu yayın adreslerine ping göndererek topolojiyi çizin.
  • NCP'yi kontrol etmek için pspinel yöntemini kullanın
  • NCP'yi OpenThread Sınır Yönlendirici kullanarak 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 dahil olmak üzere çeşitli OpenThread kaynakları için openthread.io ve GitHub'a göz atın:

  • Desteklenen Platformlar - OpenThread'i destekleyen tüm platformları keşfedin
  • OpenThread oluşturma: OpenThread'i oluşturma ve yapılandırma hakkında daha fazla ayrıntı
  • Thread Primer: Bu Codelab'de yer alan tüm mesaj dizisi kavramlarını kapsar

Referans: