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

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 yaygın olarak kullanabilmesi için OpenThread'i yayınladı. Burada amaç, bağlantılı evlerin ürünlerinin daha hızlı geliştirilmesini sağlamaktır.

Thread spesifikasyonu, ev uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güçlü bir kablosuz cihazlar arası iletişim protokolü tanımlar. OpenThread; MAC güvenliği, Örgü Bağlantı Oluşturma ve Örgü Yönlendirme ile IPv6, 6LoWPAN, IEEE 802.15.4 dahil olmak üzere tüm Thread ağ katmanlarını uygular.

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

4806d16a8c137c6d.jpeg

Neler öğreneceksiniz?

  • OpenThread CLI ikili programları oluşturma ve bunları geliştirme kartlarına yükleme
  • Linux makinesi ve geliştirme kartından oluşan 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ğında güvenli şekilde devreye alınması
  • IPv6 çoklu yayın özelliğinin işleyiş şekli
  • UDP ile Thread düğümleri arasında mesaj iletme

Gerekenler

Donanım:

  • 3 Nordic Semiconctionor nRF52840 geliştirici kartı
  • Kartları bağlamak için 3 adet USB - Mikro USB kablosu
  • En az 3 USB bağlantı noktasına sahip bir Linux makinesi

Yazılım:

  • GNU Araç Zinciri
  • İskandinav 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 öğesi hakkında bilgi edinmek için OpenThread Simulation Codelab'i çalıştırmak isteyebilirsiniz.

Seri bağlantı noktası terminalleri

Seri bağlantı noktasına bir terminal üzerinden nasıl bağlanacağınızı öğrendiniz. Bu Codelab, GNU Screen'i kullanır ve kullanıma dair genel bir bakış sunar ancak diğer tüm terminal yazılımları da kullanılabilir.

Linux makinesi

Bu Codelab, Radyo Ortak İşlemci (RCP) Thread cihazına ana makine olarak hizmet vermek ve tüm Thread geliştirme kartlarında hata vermek 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) sürümünde test edilmiştir.

Nordic yarı iletken nRF52840 kart

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. Bu uygulamayı Linux makinenize yükleyin.

Makinenize uygun paketi indirin ve doğru konuma yükleyin. Linux'ta bu özellik /opt/SEGGER/JLink.

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

nRF5x Komut Satırı Araçları, OpenThread ikili programlarını nRF52840 kartlarına yüklemenizi sağlar. Uygun nRF5x-Command-Line-Tools-<OS> sürümünü yükleyin geliştirmenizi sağlar.

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

ARM GNU Araç Zinciri'ni yükleyin

ARM GNU Araç Zinciri, derleme için kullanılır.

Çıkarılan arşivi Linux makinenizde /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ı)

Ekran, seri bağlantı noktasıyla bağlı cihazlara erişmek için kullanılan basit bir araçtır. Bu Codelab, Screen özelliğini kullanır ancak istediğ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 olmanızı sağlar:

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

OpenThread Daemon'ı derleyin:

$ script/cmake-build posix -DOT_DAEMON=ON

Artık OpenThread'i derlemeye ve nRF52840 kartlarına iletmeye hazırsınız.

4. RCP Birleştirici'yi ayarlama

Geliştirme ve flaş

Birleştirici ve yerel USB işleviyle OpenThread nRF52840 örneğini oluşturun. Bir cihaz, güvenli bir şekilde doğrulanıp Thread ağında birleştirici rolünü kullanır. Yerel USB, nRF52840 ve ana makine arasında seri aktarım olarak USB CDC ACM'nin kullanılmasına olanak tanır.

rm -rf build komutunu çalıştırarak her zaman önce her zaman ö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 programının 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üç pimininin yanındaki Mikro USB hata ayıklama bağlantı noktasına takın 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 /dev/ttyACM0 seri bağlantı noktası olarak görünür (tüm nRF52840 kartları, seri bağlantı noktası tanımlayıcısı için ttyACM cihazını kullanır).

$ ls /dev/ttyACM*
/dev/ttyACM0

RCP için kullanılan nRF52840 kartının seri numarasına dikkat edin:

c00d519ebec7e5f0.jpeg

nRFx Komut Satırı Araçlarının bulunduğu yere gidin ve kartın seri numarasını kullanarak OpenThread RCP onaltılık dosyasını nRF52840 kartına yükleyin. --verify işaretini çıkarırsanız flash işleminin hatasız 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ı olduktan sonra 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.

Jamboard'u "RCP" olarak etiketleyin Böylece yönetim kurulu rolleriyle ilgili karışıklığa yol açmamış olursunuz.

Yerel USB'ye bağlan

OpenThread RCP derlemesi, yerel USB CDC ACM'nin seri aktarım olarak 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 tekrar takın. nRF güç kaynağı anahtarını USB olarak ayarlayın.

46e7b670d2464842.png

OpenThread Arka Plan Programını Başlat

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

$ 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ı moddaki ot-daemon, şuna 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 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ı KSA'yı kullanır. Bu nedenle, ot-daemon düğümü, diğer simüle edilmiş Thread cihazlarıyla aynı şekilde kontrol edebilirsiniz.

İkinci bir terminal penceresinde ot-ctl komutunu başlatın:

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

ot-daemon ile başladığınız Düğüm 2'nin (RCP düğümü) state değerini kontrol edin:

> state
disabled
Done

5. FTD'leri ayarlayın

Bu Codelab'de kullanılan diğer iki Thread düğümü, standart Çip Üzerinde Sistem (SoC) tasarımına sahip Tam İş Parçacığı Cihazlarıdır (FTD'ler). Ü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 CLI olan ot-ctl değerini kullanacağız.

Bir cihaz, ilgili ağ üzerinde güvenli bir şekilde kimlik doğrulaması yapmak ve cihazlar için komisyon sağlamak üzere yetkili olarak görev yapar. Diğer cihaz, komisyon görevlisinin Thread ağında kimliğini doğrulayabileceği bir Birleştirici görevi görür.

Geliştirme ve flaş

Commissioner ve Birleştirici rollerinin etkin olduğu nRF52840 platformu için 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 programıyla 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 takın. RCP, hâlâ Linux makinesine bağlıysa bu yeni kart, /dev/ttyACM1 seri bağlantı noktası olarak görünmelidir (tüm nRF52840 kartları, seri bağlantı noktası tanımlayıcısı için ttyACM kodunu 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ına dikkat edin:

c00d519ebec7e5f0.jpeg

nRFx Komut Satırı Araçlarının bulunduğu yere gidin ve kartın seri numarasını kullanarak OpenThread CLI FTD onaltılık 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

Kurulu "Delege" olarak etiketleyin.

Yerel USB'ye bağlan

OpenThread FTD derlemesi, seri aktarım olarak yerel USB CDC ACM'nin 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ı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 tekrar takın. nRF güç kaynağı anahtarını USB olarak ayarlayın.

46e7b670d2464842.png

Derlemeyi doğrulayın

Bir terminal penceresinden GNU Screen kullanıp OpenThread CLI'a erişerek başarılı bir derlemeyi doğrulayın. nRF52840 anakartlarının baud hızı 115.200'dür.

$ screen /dev/ttyACM1 115200

Yeni pencerede, OpenThread CLI > istemini görüntülemek için klavyedeki Return tuşuna birkaç kez basın. IPv6 arayüzünü açın ve adresleri kontrol edin:

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

Ctrl+a →

d simgesini FTD Commissioner CLI ekranından ayırıp Linux terminaline geri dönerek 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 öğesini kullanın. Kullanılabilir ekranların listesini görmek için screen -ls işlevini 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ı yüklemek için yukarıdaki işlemi tekrarlayın. İşlemi tamamladığınızda kartı nRF USB bağlantı noktasını kullanarak PC'ye yeniden bağladığınızdan ve nRF güç kaynağı anahtarını VDD olarak ayarladığınızdan emin olun.

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

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

Panoyu "Birleştirici" olarak etiketleyin.

Screen kullanarak doğrulama yaparken komut satırından yeni bir Screen örneği oluşturmak yerine mevcut örneği yeniden ekleyip bunun içinde yeni bir pencere oluşturun (FTD Commissioner için kullandığınız).

$ screen -r

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

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

$ screen /dev/ttyACM2 115200

Bu yeni pencerede, OpenThread KSA > istemini görüntülemek için klavyedeki Return tuşuna birkaç kez basın. IPv6 arayüzünü açın ve adresleri kontrol edin:

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

Artık FTD Birleştirme KSA'sı, FTD Commissioner ile aynı ekran örneğinde olduğuna göre Ctrl+a → n tuşlarını kullanarak bunlar arasında geçiş yapabilirsiniz.

Ctrl+a →

d İstediğiniz zaman Ekran'dan çıkmak için

6. Terminal penceresi kurulumu

Bundan sonra, Thread cihazları arasında sık sık geçiş yapacağınız için bu cihazların tümünün yayında ve kolayca erişilebilir olduğundan emin olun. Şimdiye kadar, iki FTD'ye erişmek için Ekran özelliğini kullanıyoruz. Ayrıca bu araç, aynı terminal penceresinde bölünmüş ekrana da olanak tanır. Bir düğümün başka bir düğümün komutlarına nasıl tepki verdiğini görmek için bunu kullanın.

İdeal olarak, halihazırda dört pencerenizin olması gerekir:

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

Kendi terminalinizi / seri bağlantı noktası yapılandırmanızı veya aracınızı kullanmak istiyorsanız 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 kurduğunuzda birer birer almış olmanız gerekir.

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

Temel Ekran komutları:

Screen oturumuna yeniden ekleyin (komut satırından)

screen -r

Screen oturumundan ayrılma

Ctrl+a → d

Ekran oturumunda yeni pencere oluştur

Ctrl+a → c

Aynı ekran oturumunda pencereler arasında geçiş yapın

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

Ekran oturumunda mevcut pencereyi sonlandır

Ctrl+a → k

Bölünmüş Ekran

Ekran ile terminali birden fazla pencereye bölebilirsiniz:

f1cbf1258cf0a5a.png

screen uygulamasındaki komutlara Ctrl+a kullanılarak erişilir. Her komut bu erişim tuşu kombinasyonuyla başlamalıdır.

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

$ screen -r

FTD cihazlarından birini kullanmanı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 bir sonrakine taşımak 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 öğeler arasında geçiş yapın. Karışıklık olmaması için her pencereye Ctrl+a → A tuşlarını kullanarak yeniden ad vermenizi öneririz.

Gelişmiş kullanım

Ekranın daha alt bölümlere ayrılması ve ot-daemon günlükleri ile RCP Birleştirici ot-ctl'yi görüntülemek için bu hizmetlerin aynı Ekran örneği içinde başlatılması gerekir. Bunu yapmak için ot-daemon uygulamasını durdurun ve ot-ctl uygulamasından çıkın ve ardından yeni Ekran pencereleri (Ctrl+a → c) içinde yeniden başlatın.

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

Aşağıdaki komutları kullanarak pencereleri bölebilir ve pencereler arasında gezinebilirsiniz:

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 sonraki pencereye atla

Ctrl+a → Tab

Görüntülenen pencereyi ileri veya geri alma

Ctrl+a → n veya p

Geçerli pencereyi yeniden adlandır

Ctrl+a → A

Ctrl+a → d tuşlarına basarak ekrandan ayrılın ve komut satırından screen -r ile yeniden ekleyin.

Ekran hakkında daha fazla bilgi için GNU Ekranı hızlı referansı bölümüne bakın.

7. Thread ağı oluşturma

Tüm terminal pencerelerinizi ve ekranlarınızı yapılandırdığınıza göre Thread ağımızı oluşturalım. FTD Commissioner'da yeni bir Operasyonel Veri Kümesi oluşturun ve bunu etkin 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ını 1234c0de7ab51234c0de7ab51234c0de not 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

Bir süre sonra cihaz durumunu kontrol edin. Lider olmalıdır. Daha sonra referans olarak kullanmak için RLOC16'yı da edinin.

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

"Kod laboratuvarı" ağı artık diğer Thread cihazlarından tarandığında görünür.

RCP Birleştirici'de ot-ctl tarafından:

## 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üyor, tekrar taramayı deneyin.

8. RCP Birleştiriciyi ekleme

İş Parçacığı Devreye Alma, ağda etkin değil. Bu, RCP Birleştirici'yi, bant dışı bir devreye alma işlemi kullanarak az önce oluşturduğumuz Thread ağına eklememiz gerektiği anlamına gelir.

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

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Daha sonra, RCP Birleştirici'de etkin veri kümesi Ağ Anahtarı'nı FTD Yetkilisi Ağ Anahtarı olarak ayarlayın:

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

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

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

RCP Birleştirici'nin "codelab"e katılmasını sağlamak için Thread'i açın ağ. Birkaç saniye bekleyip 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

Daha sonra kullanmak üzere kullanacağınız Bağlantılı Yerel IPv6 Adresi'ni not edin (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f burada.)

Her iki cihazın da aynı ağa bağlı olduğunu onaylamak için FTD Commissioner'a dönüp yönlendiriciyi ve alt tabloları kontrol edin. RCP Birleştirici'yi 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 alınan 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 aşağıdaki topoloji diyagramıyla gösterilen, iki düğümden oluşan bir Thread ağımız var:

otcodelab_top01C_2nodes.png

Topoloji diyagramları

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

b75a527be4563215.png

Yönlendiriciler her zaman beşgendir ve Son Cihazlar daima dairedir. Her düğümdeki sayılar, her düğümün o anki rolüne ve durumuna bağlı olarak CLI çıkışında gösterilen Yönlendirici Kimliğini veya Alt Kimliği temsil eder.

9. FTD Birleştiriciyi devreye sokun

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

FTD Commissioner'ın tespit edebilmesi için FTD Joiner'dan eui64 bilgilerini alın:

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

> eui64
2f57d222545271f1
Done

FTD Commissioner'da (komisyon sorumlusunu) başlatın ve birleştirici kimlik bilgisiyle birlikte katılabilecek cihazın eui64 bilgisini (ör. J01NME) belirtin. Birleştirici Kimlik Bilgisi, 6 ila 32 karakter uzunluğunda olan ve tüm büyük harfli alfanümerik karakterlerden (okunabilirlik için I, O, Q ve Z hariç 0-9 ve A-Y hariç) oluşan cihaza özgü bir dizedir.

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

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

FTD Birleştirici'ye geçin. Birleştirme rolünü, az önce FTD Commissioner'da ayarladığınız Birleştirme Kimlik Bilgisi ile 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ğuna dair bir onay alırsınız:

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

>
Join success

FTD Birleştirici'nin "codelab"e katılmasını sağlamak için Thread'i açın ağ 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'nin olmadığına dikkat edin. Çünkü bu cihaz lider değildir veya ALOC gerektiren Hercast'e özel bir role sahiptir.

## 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"de üç cihazın bulunduğunu onaylayın. ağ:

## 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ştirici, ağa bir Son Cihaz (alt cihaz) olarak eklenmiştir. Güncellenen topolojimiz şöyledir:

otcodelab_top01C_ed01.png

10. Mesaj dizisi iş başında

Bu Codelab'deki Thread cihazları, Yönlendirici Uygun Son Cihazı (REED) olarak adlandırılan belirli bir Tam İş Parçacığı Cihazı (FTD) türüdür. Yani ya bir Yönlendirici ya da Son Cihaz olarak çalışabilir ve kendilerini bir Son Cihazdan Yönlendiriciye tanıtabilirler.

Thread, en fazla 32 Yönlendirici destekleyebilir ancak Yönlendirici sayısını 16 ile 23 arasında tutmaya çalışır. Bir REED, Son Cihaz (çocuk) 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 bir Yönlendirici'ye tanıtır.

FTD Birleştirici'yi ekledikten sonra Thread ağınızda iki alt öğe varsa en az iki dakika bekleyin ve ardından FTD Commissioner'daki yönlendirici ve alt tabloları yeniden kontrol edin:

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

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

FTD Birleştirici (Genişletilmiş MAC = e6cdd2d93249a243) kendisini bir Yönlendirici seviyesine yükseltti. RLOC16'nın farklı olduğunu unutmayın (0c02 yerine b800). Bunun nedeni, RLOC16'nın bir cihazın Yönlendirici Kimliğine ve Alt Yayıncı Kimliğine dayalı olmasıdır. Son Cihaz'dan Yönlendirici'ye geçiş yaptığında, Yönlendirici Kimliği ve Alt Öğe Kimliği değerleri de değişir, 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ştirici'yi eski sürüme geçirin

FTD Birleştirici'yi bir Yönlendirici'den Son Cihaz'a manuel olarak geri getirerek 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 Commissioner'da, FTD Birleştirici artık alt tabloda (kimlik = 3) görünecektir. Geçiş işlemi 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ır

Lider, tüm Thread Yönlendiriciler arasından seçilir. Bu, mevcut Liderin Thread ağından kaldırılması durumunda diğer Yönlendiricilerden birinin yeni Lider olacağı anlamına gelir.

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

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

> thread stop
Done
> ifconfig down
Done

İki dakika içinde FTD Birleştirici, yeni Thread lideri olur. 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ğuna dikkat edin. Kimliği ve Genişletilmiş MAC'si ile belirtilen RCP Birleştirici budur. Thread ağını bir arada tutmak için üst Yönlendiriciler arasında FTD Commissioner'dan FTD Birleştirici'ye geçiş yapmıştır. Bu, RCP Birleştirici için yeni bir RLOC16 ile sonuçlanır (çünkü Yönlendirici Kimliği 3'ten 46'ya değişti).

## 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 alt öğe olarak FTD Birleştirici'ye bağlanması için birkaç dakika beklemeniz gerekebilir. Eyaleti ve RLOC16'yı kontrol ederek şunlardan emin olun:

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

> state
child
> rloc16
b801

FTD Commissioner'ı tekrar ekleyin

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

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

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

> ifconfig up
Done
> thread start
Done

İki dakika içinde otomatik olarak "codelab"e yeniden eklenir. bir son cihaz olarak kullanır ve daha sonra kendisini bir Yönlendiriciye tanıtır.

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

> state
router
Done

Doğrulamak için FTD Birleştirici'deki 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şur.

11. Sorun giderme

Bir Thread ağını farklı terminal veya Ekran pencerelerinde birden fazla cihazla yönetmek karmaşık olabilir. Bu ipuçlarını kullanarak verileri "sıfırlamak" ağın veya çalışma alanınızın durumunu kontrol eder.

Ekran

Yapılandırmanızda kaybolursanız (çok fazla Ekran penceresi veya Ekran içinde Ekran) Ekran pencerelerini hiçbir zaman mevcut olmayana kadar Ctrl+a → k tuşlarına basarak kapatmaya devam edin. Komut satırından screen -ls, No Sockets found çıkışını elde edin. Daha sonra, her bir cihaz için Ekran pencerelerini yeniden oluşturun. Ekran sonlandırıldığında bile cihaz durumları korunur.

İş parçacığı düğümleri

Thread ağ topolojisi bu Codelab'de açıklandığı gibi değilse veya düğümler herhangi bir nedenle kesiliyorsa (bunları destekleyen Linux makinesinin uyku moduna geçmesinden kaynaklanıyor olabilir) en iyi yöntem, Thread'i kapatmak, ağ kimlik bilgilerini temizlemek ve Thread ağı 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, aynı şekilde ot-ctl üzerinden sıfırlanabilir:

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

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Çoklu yayın özelliğini kullanma

Çoklu yayın, aynı anda bir grup cihaza 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ılır.

IPv6 Adresi

Kapsam

Teslim edilen alıcılar

ff02::1

Yerel Bağlantı

Tüm FTD'ler ve MED'ler

ff02::2

Yerel Bağlantı

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

ff03::1

Yerel Ağ

Tüm FTD'ler ve MED'ler

ff03::2

Yerel Ağ

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

Bu Codelab'de 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 ulaşılabilen tüm İş Parçacığı 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 Commissioner'dan 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 başka iki cihaz (FTD Birleştirici ve RCP Birleştirici) var ancak FTD Birleştiricisi, yalnızca bir yanıt (FTD Birleştirici'nin Yerel Bağlantı Adresi'nden (LLA)) almıştır. Bu, FTD Birleştirici'nin tek bir atlamayla ulaşabildiği tek cihaz olduğu anlamına gelir.

otcodelab_top02C_02_LL.png

Şimdi FTD Birleştirici'den ff02::1 adlı kullanıcıya 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 ilkinin (4b1d ile biten) FTD komisyoncusunun LLA'sı, ikincisinin (943b ile biten) RCP Birleştirici'nin LLA'sı olduğunu görebiliriz.

otcodelab_top02C_02_LL02.png

Bu, FTD Birleştirici'nin hem FTD Komitesi hem de RCP Birleştirici ile doğrudan bağlantılı olduğu anlamına gelir ve bu da topolojimizi doğrular.

Yerel Ağ

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ı görelim.

FTD Commissioner'dan 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 komisyoncusu iki yanıt aldı. Bu yanıtlardan biri FTD Birleştirici'nin Yönlendirme Konum Belirleyicisi'nden (b800 ile biten RLOC), diğeri ise RCP Birleştirici'nin Ağ-Yerel EID'sinden (ML-EID; d55f ile biten) geldi. Bunun nedeni, ağ-yerel kapsamın, tüm Thread ağının tamamını oluşturmasıdır. Bir cihaz, ağın neresinde olursa olsun ff03::1 adresine abone olacaktır.

otcodelab_top02C_02_ML.png

Aynı davranışı onaylamak için FTD Birleştirici'den ff03::1 adlı kullanıcıyı 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 RCP Birleştirici'nin yanıt süresini not edin. RCP Birleştirici'nin, FTD Commissioner'a (68 ms) ulaşması, FTD Birleştirici'ye (23 ms) ulaşmasından çok daha uzun sürdü. Bunun nedeni, FTD Joiner için bir durak yerine, FTD Commissioner'a ulaşmak için iki atlama yapmak zorunda olmasıdır.

Örgü-yerel çoklu yayın ping'inin, RCP Birleştirici için değil, yalnızca iki FTD için RLOC ile yanıt verdiğini fark etmiş olabilirsiniz. Bunun nedeni, FTD'lerin ağ içindeki Yönlendiriciler, RCP'nin ise bir 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'in sunduğu uygulama hizmetlerinden biri, bir Taşıma Katmanı protokolü olan Kullanıcı Datagram Protokolü'dür (UDP). OpenThread üzerinde oluşturulan bir uygulama, mesajları 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 içeriyorsa internet gibi) iletmek için UDP API'sini kullanabilir.

UDP soketleri OpenThread CLI aracılığıyla kullanıma sunulur. Bunu, iki FTD arasında mesaj iletmek için kullanalım.

FTD Birleştirici için Örgü-Yerel 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 yuvaya 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ştirici'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ının iki düğüm arasında canlı olması gerekir. FTD Commissioner'dan mesaj gönder:

## 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ı ağ içinde durumlarını nasıl yönetir?
  • UDP kullanılarak düğümler arasında basit mesajlar nasıl iletilir?

Sonraki adımlar

Bu Codelab'den yola çıkarak aşağıdaki alıştırmaları deneyin:

  • ot-cli-mtd ikili programını kullanarak FTD Birleştirici panosunu bir YTH olarak yeniden başlatın ve hiçbir zaman kendisini bir Yönlendirici'ye yükseltmediğine veya Lider olmaya çalışmadığına dikkat edin
  • Ağa daha fazla cihaz ekleyin (farklı bir platform deneyin!) ve çoklu yayın adreslerine ping'lerle birlikte yönlendirici ve alt tabloları kullanarak topolojiyi çizin
  • NCP'yi kontrol etmek için pyspinel kullanın
  • OpenThread Sınır Yönlendirici'yi kullanarak NCP'yi bir 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: