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 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.
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.
SEGGER J-Link'i yükle
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.
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:
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.
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:
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.
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:
ot-daemon
hizmet / günlüklerot-ctl
üzerinden RCP Birleştirici- OpenThread CLI aracılığıyla FTD Commissioner
- 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 oturumundan ayrılma | Ctrl+a → |
Ekran oturumunda yeni pencere oluştur | Ctrl+a → |
Aynı ekran oturumunda pencereler arasında geçiş yapın | Ctrl+a → |
Ekran oturumunda mevcut pencereyi sonlandır | Ctrl+a → |
Bölünmüş Ekran
Ekran ile terminali birden fazla pencereye bölebilirsiniz:
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:
- Pencereyi yatay olarak bölmek için Ctrl+a →
S
- İmleci yeni boş pencereye taşımak için Ctrl+a →
Tab
- Yeni pencereyi bir sonrakine taşımak için Ctrl+a →
n
- Ü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 → |
Pencereyi dikey olarak böl | Ctrl+a → |
Pencereyi yatay olarak böl | Ctrl+a → |
Görüntülenen sonraki pencereye atla | Ctrl+a → |
Görüntülenen pencereyi ileri veya geri alma | Ctrl+a → |
Geçerli pencereyi yeniden adlandır | Ctrl+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:
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:
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:
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.
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
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.
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
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
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 |
| Yerel Bağlantı | Tüm FTD'ler ve MED'ler |
| Yerel Bağlantı | Tüm FTD'ler ve Sınır Yönlendiriciler |
| Yerel Ağ | Tüm FTD'ler ve MED'ler |
| 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.
Yerel Bağlantı
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.
Ş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.
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.
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
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.
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:
- Desteklenen Platformlar: OpenThread'i destekleyen tüm platformları keşfedin
- OpenThread derleme: OpenThread oluşturma ve yapılandırma hakkında daha fazla bilgi
- Thread Primer: Bu Codelab'de yer alan tüm Thread kavramlarını kapsar
Referans: