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, 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.
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.
SEGGER J-Link'i yükleyin
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.
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:
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.
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:
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.
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:
ot-daemon
hizmeti / günlükleriot-ctl
üzerinden RCP Bağlayıcı- OpenThread CLI aracılığıyla FTD Commissioner
- 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) |
|
Ekran oturumundan çık | Ctrl+a → |
Ekran oturumunda yeni pencere oluştur | Ctrl+a → |
Aynı Ekran oturumunda pencereler arasında geçiş yapma | Ctrl+a → |
Ekran oturumunda geçerli pencereyi kapat | Ctrl+a → |
Bölünmüş Ekran
Ekran ile terminali birden fazla pencereye bölebilirsiniz:
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:
- Pencereyi yatay olarak bölmek için Ctrl+a →
S
- İmleci yeni boş pencereye taşımak için Ctrl+a →
Tab
- Yeni pencereyi sonraki pencereye geçirmek için Ctrl+a →
n
- Ü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 → |
Pencereyi dikey olarak böl | Ctrl+a → |
Pencereyi yatay olarak böl | Ctrl+a → |
Görüntülenen bir sonraki pencereye git | Ctrl+a → |
Görüntülenen pencereyi ileri veya geri taşıma | Ctrl+a → |
Geçerli pencereyi yeniden adlandırma | Ctrl+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:
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:
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:
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.
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
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.
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
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
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: |
| Yerel Bağlantı | Tüm FTD'ler ve MED'ler |
| Yerel Bağlantı | Tüm FTD'ler ve Sınır Yönlendiricileri |
| Bağlantılı Yerel | Tüm FTD'ler ve MED'ler |
| 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.
Yerel Bağlantı
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.
Ş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.
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.
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
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.
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: