1. Giriş
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.
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.
SEGGER J-Link'i yükleme
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.
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:
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.
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:
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.
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:
ot-daemon
hizmet / günlüklerot-ctl
üzerinden RCP Joiner- OpenThread CLI aracılığıyla FTD Commissioner
- 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) |
|
Ekran oturumundan ayrılma | Ctrl+a → |
Ekran oturumunda yeni pencere oluşturma | Ctrl+a → |
Aynı ekran oturumundaki pencereler arasında geçiş yapma | Ctrl+a → |
Screen oturumunda geçerli pencereyi kapatma | Ctrl+a → |
Bölünmüş Ekran
Ekran ile terminali birden fazla pencereye bölebilirsiniz:
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:
- Ctrl+a →
S
: Pencereyi yatay olarak bölmek için - İmleci yeni boş pencereye taşımak için Ctrl+a →
Tab
- Ctrl+a →
n
tuşlarına basarak yeni pencereyi bir sonraki pencereye geçirme - Ü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 → |
Pencereyi dikey olarak bölme | Ctrl+a → |
Pencereyi yatay olarak bölme | Ctrl+a → |
Sonraki görüntülenen pencereye atlama | Ctrl+a → |
Görüntülenen pencereyi ileri veya geri taşıma | Ctrl+a → |
Geçerli pencereyi yeniden adlandırma | Ctrl+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:
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:
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:
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.
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
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.
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
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
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 |
| Link-Local | Tüm FTD'ler ve MED'ler |
| Link-Local | Tüm FTD'ler ve sınır yönlendiriciler |
| Mesh-Local | Tüm FTD'ler ve MED'ler |
| 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.
Link-Local
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.
Ş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.
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.
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
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.
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:
- Desteklenen Platformlar: OpenThread'i destekleyen tüm platformları keşfedin.
- OpenThread'i derleme: OpenThread'i derleme ve yapılandırma hakkında daha fazla bilgi
- Thread Primer: Bu Codelab'de yer alan tüm Thread kavramlarını kapsar.
Referans: