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 sunmak ve bağlı ev ürünleri geliştirme sürecini hızlandırmak için OpenThread'i kullanıma sundu.
Thread spesifikasyonu, ev uygulamaları için IPv6 tabanlı, güvenilir, güvenli ve düşük güç tüketimine sahip kablosuz cihazlar arası iletişim protokolü tanımlar. OpenThread; IPv6, 6LoWPAN, MAC güvenliğine sahip IEEE 802.15.4, Mesh Bağlantısı Kurma ve Mesh Yönlendirme dahil olmak üzere tüm Thread ağ katmanlarını uygular.
Bu Codelab'de, gerçek donanımda OpenThread'i programlayacak, Thread ağı oluşturup yönetecek ve düğümler arasında mesaj ileteceksiniz.
Neler öğreneceksiniz?
- OpenThread CLI ikililerini derleme ve geliştirme kartlarına 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 CLI ile Thread düğümlerini manuel olarak yönetme
- Cihazların Thread ağına güvenli şekilde devreye alınması
- IPv6 çoklu yayını nasıl çalışır?
- UDP ile mesaj dizileri arasında mesaj aktarma
İhtiyacınız olanlar
Donanım:
- 3 adet Nordic Semiconductor nRF52840 geliştirme kartı
- Kartları bağlamak için 3 USB - Mikro USB kablosu
- En az 3 USB bağlantı noktası olan bir Linux makinesi
Yazılım:
- GNU Aracı Zinciri
- 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 Simülasyonu Codelab'ini çalıştırabilirsiniz.
Seri bağlantı noktası terminalleri
Terminal üzerinden seri bağlantı noktasına nasıl bağlanacağınızı bilmeniz gerekir. Bu Codelab'de GNU Screen kullanılır ve kullanıma genel bir bakış sunulur ancak başka bir terminal yazılımı da kullanılabilir.
Linux makinesi
Bu Codelab, bir Radyo Yardımcı İşlemcisi (RCP) Thread cihazına ev sahipliği yapmak ve tüm Thread geliştirme kartlarını flaşlamak 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) üzerinde test edilmiştir.
Nordic Semiconductor nRF52840 kartları
Bu Codelab'de üç nRF52840 PDK kartı kullanılmaktadır.
SEGGER J-Link'i yükleme
Yerleşik JTAG modüllerine sahip nRF52840 kartlarını programlamak için SEGGER J-Link'i kullanırız. Bu programı Linux makinenize yükleyin.
Makineniz için uygun paketi indirip doğru konuma yükleyin. Linux'ta bu /opt/SEGGER/JLink
olur.
nRF5x Komut Satırı Araçları'nı yükleme
nRF5x Komut Satırı Araçları, 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 Aracı Zinciri'ni yükleme
Derleme için ARM GNU Aracı Zinciri 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ında yer alan 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'de Screen kullanılmaktadır ancak dilediğ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 olur:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
OpenThread arka plan programını derleyin:
$ script/cmake-build posix -DOT_DAEMON=ON
Artık OpenThread'i derleyip nRF52840 kartlarına yüklemeye hazırsınız.
4. RCP Birleştirici'yi ayarlama
Derleme ve önyükleme
Joiner ve yerel USB işleviyle OpenThread nRF52840 örneğini derleyin. Cihazlar, Thread ağında güvenli bir şekilde kimlik doğrulaması yapmak ve hizmete almak için katılımcı rolünü kullanır. Yerleşik USB, nRF52840 ile ana makine arasında seri aktarım olarak USB CDC ACM'nin kullanılmasını sağlar.
Her zaman önce rm -rf build
'ü ç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ı bulunan dizine gidin ve dosyayı 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 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 seri bağlantı noktası /dev/ttyACM0
olarak görünür (tüm nRF52840 kartları, seri bağlantı noktası tanımlayıcısı için ttyACM
kullanır).
$ ls /dev/ttyACM* /dev/ttyACM0
RCP için kullanılan nRF52840 kartının seri numarasını not edin:
nRFx Komut Satırı Araçları'nın konumuna gidin ve kartın seri numarasını kullanarak OpenThread RCP onaltılık dosyasını nRF52840 kartına flaşlayın. --verify
işaretini eklemezseniz, flaş 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
İşlem başarılı olduğunda 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.
Daha sonra yönetim kurulu rollerini karıştırmamak için yönetim kurulunu "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 ve SIFIRLA 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'ı kullanın. Günlük çıkışını görebilmek ve ot-daemon
'ün çalıştığını doğrulayabilmek için ot-daemon
'ü -v
ayrıntılı günlük kaydı işaretiyle başlatın:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'
Ayrıntılı modda ot-daemon
başarılı olduğunda aşağıdakine 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
kaynaklı günlüklerin 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'yi 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 çip üzerinde sistem (SoC) tasarımındaki tam Thread cihazlarıdır (FTD'ler). Üretim ortamında, OpenThread NCP örneklerini kontrol etmek için üretim sınıfı bir ağ arayüzü sürücüsü olan wpantund
kullanılabilir ancak bu kod laboratuvarında OpenThread KSA'sı olan ot-ctl
'ı kullanacağız.
Bir cihaz, cihazların kimliğini güvenli bir şekilde doğrulamak ve bu ağa bağlamak için Komisyon Üyesi olarak işlev görür. Diğer cihaz, komiserin Thread ağında kimlik doğrulaması yapabileceği bir katılımcı olarak işlev görür.
Derleme ve önyükleme
Komisyoncu ve Katılıcı rolleri etkinleştirilmiş olarak nRF52840 platformu için OpenThread FTD örneğini derleyin:
$ 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 dosyası içeren dizine gidin ve dosyayı 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ünür (tüm nRF52840 kartları seri bağlantı noktası tanımlayıcısı için 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 Komut Satırı Araçları'nın konumuna gidin ve OpenThread CLI FTD onaltılık dosyasını, kartın seri numarasını kullanarak 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 "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 ve SIFIRLA 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
Terminal penceresinden GNU Screen'i kullanarak OpenThread CLI'ye erişerek başarılı bir derlemeyi doğrulayın.
$ screen /dev/ttyACM1
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'yı kullanın →
d
FTD Commissioner CLI'den ayrılmak için ve bir sonraki kartın yanıp sönmesi için Linux terminaline dönmek üzere. İstediğiniz zaman KSA'ya yeniden girmek için komut satırından screen -r
simgesini kullanın. Mevcut 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 Birleştirici'yi ayarlama
Mevcut ot-cli-ftd.hex
derlemesini kullanarak üçüncü nRF52840 kartını flaşlamak için yukarıdaki işlemi tekrarlayın. İşlemi tamamladığınızda, nRF USB bağlantı noktasını kullanarak kartı PC'ye yeniden bağladığınızdan ve nRF güç kaynağı anahtarını VDD olarak ayarladığınızdan emin olun.
Bu üçüncü kart bağlıyken diğer iki düğüm de Linux makinesine bağlıysa seri bağlantı noktası /dev/ttyACM2
olarak görünür:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
Kartı "Birleştirici" olarak etiketleyin.
Ekran'ı kullanarak doğrularken komut satırından yeni bir Ekran örneği oluşturmak yerine mevcut Ekran örneğine yeniden bağlanın ve içinde yeni bir pencere oluşturun (FTD Komiseri için kullandığınız pencere):
$ screen -r
Ctrl+a → c
ile Ekran'da yeni pencere oluşturun.
Yeni bir komut satırı istemi görünür. FTD Birleştirici için OpenThread KSA'sına erişin:
$ screen /dev/ttyACM2
Bu yeni pencerede, OpenThread CLI >
istemini görüntülemek için klavyede birkaç kez Geri tuşuna 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ştiricisi CLI'si artık FTD Komiseri ile aynı ekran örneğinde olduğundan Ctrl+a → n
tuşlarını kullanarak bunlar arasında geçiş yapabilirsiniz.
Ctrl+a'yı kullanın →
d
düğmesine basarak Ekran'dan dilediğiniz zaman çıkabilirsiniz.
6. Terminal penceresi kurulumu
Bundan sonra Thread cihazları arasında sık sık geçiş yapacağınızdan, bunların hepsinin etkin olduğundan ve kolayca erişilebilir olduğundan emin olun. Şu ana kadar iki FTD'ye erişmek için Ekran'ı kullanıyoruz. Bu araç aynı terminal penceresinde bölünmüş ekrana da olanak tanır. Bir düğümün başka bir düğümde 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 Birleştirici- OpenThread CLI aracılığıyla FTD Komiseri
- OpenThread CLI üzerinden FTD Joiner
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 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 ayarlarken zaten bir tane oluşturmuş olmanız gerekir.
Ekran'daki tüm komutlar Ctrl+a ile başlar.
Temel ekran komutları:
Ekran oturumuna yeniden bağlanma (komut satırından) |
|
Ekran oturumundan çıkma | Ctrl+a → |
Ekran oturumunda yeni pencere oluşturma | Ctrl+a → |
Aynı ekran oturumunda pencereler arasında geçiş yapma | Ctrl+a → |
Ekran oturumundaki mevcut pencereyi kapatma | Ctrl+a → |
Bölünmüş Ekran
Screen ile terminali birden fazla pencereye bölebilirsiniz:
screen
komutlarına Ctrl+a tuşları kullanılarak erişilir. Her komut bu erişim anahtarı kombinasyonuyla başlamalıdır.
Codelab'i tam olarak takip ettiyseniz aynı ekran örneğinde iki pencereniz (FTD Komisyon Üyesi, FTD Katkıda Bulunan) olmalıdır. Ekranı ikiye bölmek için önce mevcut ekran oturumunuza girin:
$ screen -r
FTD cihazlarından birinde olmanız gerekir. Ekran'da aşağıdaki 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 sonraki pencereye geçirmek 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 bunlar arasında geçiş yapabilirsiniz. Karışıklığı önlemek için Ctrl+a → A
tuşlarını kullanarak her pencereyi yeniden adlandırmanız önerilir.
Gelişmiş kullanım
Ekranı daha da dört parçaya bölmek ve ot-daemon
günlüklerini ve RCP Birleştirici'yi ot-ctl
görüntülemek için bu hizmetlerin aynı ekran örneğinde başlatılmış olması gerekir. Bunu yapmak için ot-daemon
'ü durdurun, ot-ctl
'ten çıkın ve yeni ekran pencerelerinde (Ctrl+a → c
) yeniden başlatın.
Bu kurulum gerekli değildir ve kullanıcıya bırakılır.
Aşağıdaki komutlarla pencereleri bölme ve pencereler arasında gezinme:
Yeni pencere oluşturma | Ctrl+a → |
Pencereyi dikey olarak bölme | Ctrl+a → |
Pencereyi yatay olarak bölme | Ctrl+a → |
Gösterilen bir sonraki pencereye atlama | Ctrl+a → |
Gösterilen pencereyi ileri veya geri taşıyın | Ctrl+a → |
Mevcut pencereyi yeniden adlandırma | Ctrl+a → |
Ctrl+a → d
ile ekrandan istediğiniz zaman 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, mesaj dizisi ağımızı oluşturalım. FTD Komiseri'nde yeni bir operasyonel veri kümesi oluşturun ve bunu etkin olarak gönderin. İşlemsel 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 gönderin:
> dataset commit active Done
IPv6 arayüzünü açın:
> ifconfig up Done
Start Thread protokolü işlemini başlatın:
> thread start Done
Bir süre sonra cihaz durumunu kontrol edin. Lider olmalıdır. Gelecekte referans olarak kullanmak için 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 Birleştirici'de ot-ctl
'ten:
## RCP Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
FTD Birleştirici'deki OpenThread KSA'sından:
## 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 Birleştirici'yi ekleme
Thread devreye alma işlemi ağda etkin değil. Bu nedenle, RCP birleştirme aracını yeni oluşturduğumuz Thread ağına bant dışı devreye alma işlemi kullanarak eklememiz gerekiyor.
FTD Komiseri'nde, ağ anahtarını (ör. 1234c0de7ab51234c0de7ab51234c0de
) not ettik. Ağ anahtarını tekrar aramanız gerekirse FTD Komiseri'nde aşağıdaki komutu çalıştırın:
## FTD Commissioner ## > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done
Ardından, RCP Birleştirici'de etkin veri kümesi ağ anahtarını FTD Komiseri ağ anahtarı 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 Birleştirici'nin "codelab" ağına katılması için ileti dizisini açı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
Mesh yerel IPv6 adresini (burada fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
) not edin. Daha sonra kullanacaksınız.
FTD Komiseri'ne geri dönüp her iki cihazın da aynı ağın parçası olduğunu doğrulamak için yönlendiriciyi ve alt tabloları kontrol edin. RCP birleştirme aracını 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 elde edilen 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 bu topoloji şemasında gösterilen iki düğümden oluşan bir Mesaj dizisi ağına sahibiz:
Topoloji diyagramları
Codelab'in geri kalanında çalışırken ağın durumu değiştiğinde yeni bir Thread topolojisi şeması göstereceğiz. Düğüm rolleri aşağıdaki gibi gösterilir:
Yönlendiriciler her zaman beşgen, son cihazlar ise her zaman daire şeklindedir. Her düğümdeki sayılar, her düğümün o andaki rolüne ve durumuna bağlı olarak CLI çıkışında gösterilen Yönlendirici Kimliği'ni veya Alt Kimliği'ni temsil eder.
9. FTD Birleştirici'yi etkinleştirme
Şimdi üçüncü Thread cihazını "codelab" ağına ekleyelim. Bu kez daha güvenli bant içi devreye alma sürecini kullanacağız ve yalnızca FTD Birleştirici'nin katılmasına izin vereceğiz.
FTD katılımcısı'nda eui64
değerini alın. Böylece FTD komiseri bu değeri tanımlayabilir:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
FTD Komisyoncusu'nda komisyoncuyu başlatın ve katılabilir cihazın eui64
değerini, katılımcı kimlik bilgisiyle birlikte belirtin (ör. J01NME
). Katılımcı kimliği, 6 ila 32 karakter uzunluğunda, tüm büyük harfli alfanümerik karakterlerden (okunabilirlik için I, O, Q ve Z hariç 0-9 ve A-Y) oluşan cihaza özgü bir dizedir.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
FTD Birleştirici'ye geçin. FTD Komiseri'nde yeni oluşturduğunuz katılımcı kimliğiyle katılımcı rolünü 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ğunu belirten bir onay alırsınız:
## FTD Joiner ## ---------------- > Join success
FTD Birleştirici'nin "codelab" ağına katılması için iletiyi açın 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'un olmadığına dikkat edin. Bunun nedeni, bu cihazın lider olmaması ve 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 Komiseri'ne geçin ve "codelab" ağında üç cihaz 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ştiricisi ağa son cihaz (alt cihaz) olarak bağlanmıştır. Güncellenen topolojimizi aşağıda bulabilirsiniz:
10. Mesaj dizisinin kullanılma şekli
Bu Codelab'deki Thread cihazları, Yönlendirici Uygun Son Cihaz (REED) olarak adlandırılan belirli bir tür Tam Thread Cihazıdır (FTD). Yani bu cihazlar, Yönlendirici veya Son Cihaz olarak işlev görebilir ve kendilerini Son Cihazdan Yönlendiriciye yükseltebilir.
Thread 32'ye kadar yönlendiriciyi destekleyebilir ancak yönlendirici sayısını 16 ile 23 arasında tutmaya çalışır. Bir REED uç cihaz (alt cihaz) 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 yönlendirici olarak yükseltir.
FTD Birleştirici'yi ekledikten sonra Thread ağınızdaki iki alt öğe varsa en az iki dakika bekleyin ve ardından FTD Komisyon Üyesi'ndeki yönlendiriciyi ve alt öğe 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 Birleştirici (Genişletilmiş MAC = e6cdd2d93249a243
), kendisini Yönlendirici olarak yükseltti. RLOC16'nın farklı olduğunu (0c02
yerine b800
) unutmayın. Bunun nedeni, RLOC16'nın bir cihazın Yönlendirici Kimliği ve Alt Cihaz Kimliği'ne dayalı olmasıdır. Son cihazdan yönlendiriciye geçiş yaptığında yönlendirici kimliği ve alt cihaz kimliği değerlerinin yanı sıra 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ştirme aracını eski sürüme geçirme
FTD Birleştirici'yi yönlendiriciden son cihaza manuel olarak indirerek 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 Komisyoncusu'na geri döndüğünüzde FTD Birleştiricisi artık alt tabloda (Kimlik = 3) görünür. 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 mesaj yönlendiricileri arasından kendi kendini seçer. Yani mevcut Yönetici, Thread ağından kaldırılırsa diğer Yöneticilerden biri yeni Yönetici olur.
FTD Komiseri'nde, Thread'i Thread ağından kaldırmak için kapatın:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
İki dakika içinde FTD katılımcısı yeni ileti dizisi lideri olur. Aşağıdakileri 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ğunu fark edin. Bu, kimliği ve genişletilmiş MAC'si tarafından belirtildiği gibi RCP Birleştiricisi'dir. Thread ağını bir arada tutmak için üst yönlendiricileri FTD Komisyoncusu'ndan FTD Birleştiricisi'ne geçirmiştir. Bu, RCP birleştirme aracı için yeni bir RLOC16'ya neden olur (yönlendirici kimliği 3'ten 46'ya değiştiği 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 Birleştirici'nin FTD Birleştirici'ye alt öğe olarak bağlanması için birkaç dakika beklemeniz gerekebilir. Aşağıdakileri onaylamak için durumu ve RLOC16'yı kontrol edin:
## RCP Joiner ## -------------- > state child > rloc16 b801
FTD komiserini yeniden ekleme
İki düğüm içeren bir Thread ağı pek eğlenceli olmaz. FTD Komiseri\'ni tekrar internete bağlayalım.
FTD Komiseri'nde ileti dizisini yeniden başlatın:
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
İki dakika içinde "codelab" ağına uç cihaz olarak otomatik olarak yeniden bağlanır ve ardından kendisini yönlendirici olarak yükseltir.
## FTD Commissioner ## ---------------------- > state router Done
Aşağıdakileri doğrulamak için FTD Birleştirici'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
Mesaj dizisi ağımız tekrar üç düğümden oluşuyor.
11. Sorun giderme
Farklı terminal veya ekran pencerelerinde birden fazla cihazla bir Thread ağını yönetmek karmaşık olabilir. Sorunla karşılaşırsanız ağınızı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 Screen penceresi veya Screen içinde Screen) Ctrl+a → k tuşlarına basarak Screen pencerelerini kapatmaya devam edin. Bu işlem, Screen pencereleri kalmayana ve komut satırında screen -ls
yerine No Sockets found
görünene kadar devam etmelidir. Ardından her cihaz için Ekran pencerelerini yeniden oluşturun. Ekran kapatıldığında bile cihaz durumları korunur.
Mesaj dizisi düğümleri
Thread ağ topolojisi bu Codelab'de açıklandığı gibi değilse veya düğümlerin bağlantısı herhangi bir nedenle kesilirse (ör. onları besleyen Linux makinesinin uykuya dalması nedeniyle) en iyi seçenek Thread'i kapatmak, ağ kimlik bilgilerini temizlemek ve Thread ağını 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, 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, bir grup cihaza aynı anda bilgi aktarmak için kullanılır. Bir Thread ağında, belirli adresler kapsama alanına bağlı olarak farklı cihaz gruplarıyla çoklu yayın kullanımı için ayrılır.
IPv6 Adresi | Kapsam | Teslim edildiği adres |
| Bağlantı-Yerel | Tüm FTD'ler ve MED'ler |
| Bağlantı-Yerel | 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 Sınır Yönlendirici kullanmıyoruz. Bu nedenle, iki FTD ve MED çoklu yayın adresine odaklanalım.
Bağlantı-Yerel
Bağlantı yerel kapsamı, tek bir radyo yayını veya tek bir "atlama" ile erişilebilen tüm Mesaj dizili 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 Komiseri'nden 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 var (FTD Birleştirici ve RCP Birleştirici), ancak FTD Komiseri yalnızca FTD Birleştirici'nin Bağlantı Yerel Adresi'nden (LLA) bir yanıt aldı. Bu, FTD Birleştirici'nin tek bir atlamayla ulaşabileceği tek cihazın FTD Komisyoncusu olduğu anlamına gelir.
Ardından FTD Birleştirici'den ff02::1
için 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, ilk cihazın (4b1d
ile biten) FTD Komiseri'nin LLA'sı, ikinci cihazın (943b
ile biten) ise RCP Birleştirici'nin LLA'sı olduğunu görebiliriz.
Bu, FTD Birleştirici'nin hem FTD Komisyon Üyesi'ne hem de RCP Birleştirici'ye doğrudan bağlı olduğu anlamına gelir. Bu da topolojimizi doğrular.
Mesh-Local
Mesh-Local kapsamı, aynı Thread ağında erişilebilen tüm Thread arayüzlerini içerir. ff03::1
çoklu yayın adresine gönderilen bir ping'in yanıtlarını görelim.
FTD Komiseri'nden ff03::1
'e ping gönderin:
## 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, biri FTD Birleştirici'nin Yönlendirme Bulucu'sundan (b800
ile biten RLOC) ve diğeri RCP Birleştirici'nin Mesh-Local EID'sinden (d55f
ile biten ML-EID) olmak üzere iki yanıt aldı. Bunun nedeni, mesh-local kapsamının Thread ağının tamamını içermesidir. Bir cihaz ağın neresinde olursa olsun ff03::1
adresine abone olur.
Aynı davranışı doğrulamak için FTD Birleştirici'den 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 iki ping çıkışında da RCP Birleştirici'nin yanıt süresini not edin. RCP birleştirme aracının FTD komisyonuna (68 ms) ulaşması, FTD birleştirme aracına (23 ms) ulaşmasından çok daha uzun sürdü. Bunun nedeni, FTD Birleştirici'nin bir atlama yapmasına kıyasla FTD Komiseri'ne ulaşmak için iki atlama yapması gerekmesidir.
Ayrıca, mesh yerel çoklu yayın ping'inin yalnızca iki FTD için RLOC ile yanıt verdiğini (RCP Birleştirici için değil) fark etmiş olabilirsiniz. Bunun nedeni, FTD'lerin ağdaki Yönlendiriciler, RCP'nin ise 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'un sağladığı uygulama hizmetlerinden biri, Taşıma Katmanı protokolü olan Kullanıcı Datagram Protokolü'dür (UDP). OpenThread'a dayalı bir uygulama, 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 varsa internet gibi) mesaj iletmek için UDP API'yi kullanabilir.
UDP soketleri OpenThread CLI üzerinden gösterilir. İki FTD arasında mesaj iletmek için bunu kullanalım.
FTD Birleştirici için Mesh-Local 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 sokete bağlayın:
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
FTD Komisyon Üyesi'ne geçin, UDP'yi başlatın ve ML-EID'sini kullanarak FTD Birleştirici'de oluşturduğunuz 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 etkin olmalıdır. FTD Komiseri'nden mesaj gönderme:
## FTD Commissioner ## ---------------------- > udp send hellothere Done
FTD Birleştirici'de UDP mesajı alındı.
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
14. Tebrikler!
Fiziksel bir mesaj dizisi ağı oluşturdunuz.
Artık şunları biliyorsunuz:
- Mesaj dizisi cihaz türleri, rolleri ve kapsamları arasındaki fark
- Thread cihazların ağdaki durumlarını nasıl yönettiği
- UDP kullanarak düğümler arasında basit mesajlar iletme
Sonraki adımlar
Bu kod laboratuvarını temel alarak aşağıdaki alıştırmaları deneyin:
- FTD Birleştirici kartını
ot-cli-mtd
ikilisini kullanarak MTD olarak yeniden flaşlayın ve kendisini hiçbir zaman Yönlendirici'ye 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'ler göndererek yönlendirici ve alt tabloları kullanarak topolojinin ana hatlarını çıkarın
- NCP'yi kontrol etmek için pyspinel'i kullanın
- OpenThread Sınır Yönlendirici'yi kullanarak NCP'yi 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'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: