1. Giriş
Google tarafından yayınlanan OpenThread, Thread® ağ protokolü için açık kaynaklı bir uygulamadır. Google Nest, Nest ürünlerinde kullanılan teknolojiyi geliştiricilerin kullanımına sunarak bağlı ev için ürünlerin geliştirilmesini hızlandırmak amacıyla OpenThread özelliğini kullanıma sundu.
İleti dizisi spesifikasyonu, ev uygulamaları için IPv6 tabanlı güvenilir, güvenli ve düşük güçlü bir kablosuz cihazdan cihaza iletişim protokolü tanımlar. OpenThread, IPv6, 6LoWPAN, IEEE 802.15.4 dahil olmak üzere MAC güvenliği, Örgü Bağlantısı Oluşturma ve Örgü Yönlendirme dahil tüm Thread ağ katmanını uygular.
Bu Codelab'de OpenThread programını gerçek donanım üzerinde programlayacak, Thread ağ oluşturup yönetecek ve düğümler arasında mesaj ileteceksiniz.
Neler öğreneceksiniz?
- OpenThread CLI ikili programlarını derleme ve geliştirme panosuna aktarma
- Linux makinesi ve geliştirme panosu içeren bir RCP oluşturma
- OpenThread Daemon ve
ot-ctl
kullanarak RCP ile iletişim kurma - Thread düğümlerini GNU ekranı ve OpenThread KSA'sıyla manuel olarak yönetme
- Cihazların İleti Dizisi ağına güvenli bir şekilde dağıtılması
- IPv6 çoklu yayın özelliğinin işleyiş şekli
- UDP ile İleti dizisi düğümleri arasında ileti geçirme
Gerekenler
Donanım:
- 3 Nordic Yarı Yarıiletken nRF52840 geliştirme panosu
- 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. Başlarken
OpenThread Simülasyonu
Başlamadan önce, temel ileti dizisi kavramları ve OpenThread KSA hakkında bilgi edinmek için OpenThread Simülasyon Kod Laboratuvarı'nı tamamlamanız önerilir.
Seri bağlantı noktası terminalleri
Terminal üzerinden seri bağlantı noktasına nasıl bağlanacağınızı bilmeniz gerekir. Bu Codelab, GNU Ekranını kullanır ve kullanımla ilgili genel bakış sağlar ancak diğer terminal yazılımları kullanılabilir.
Linux makine
Bu Codelab, bir Radio Co-Processor (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 makine kullanmak üzere tasarlanmıştır. Tüm adımlar Ubuntu 14.04.5 LTS'de (Trusty Tahr) test edilmiştir.
Nordic Semiconductor nRF52840 panolar
Bu Codelab'de üç adet nRF52840 PDK panosu kullanılmıştır.
SEGGER J-Link'i yükleyin
Entegre JTAG modülleri içeren nRF52840 panoları programlamak için SEGGER J-Link'i kullanıyoruz. Bunu Linux makinenize yükleyin.
Makineniz için uygun paketi indirin ve uygun yere yükleyin. Linux'ta bu, /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 aktarmanı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ükleyin
ARM GNU Araç Zinciri bina oluşturmak için kullanılır.
Çıkarılan arşivi Linux makinenizde /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
adresine 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 kullanılan 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'ı 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'ı nRF52840 kartlarına oluşturup derlemeye hazırsınız.
4. RCP Bağlayıcı'yı ayarlama
Derleme ve flaş yapma
Birleştirme ve yerel USB işlevleriyle OpenThread nRF52840 örneğini oluşturun. Bir cihaz, güvenli bir şekilde kimlik doğrulaması yapmak ve bir Mesaj Dizisi ağına bağlanmak için Birleştirici rolünü kullanır. Yerel USB, nRF52840 ve ana makine arasında bir seri aktarım olarak USB CDC ACM kullanımını sağlar.
Her zaman önce rm -rf build
öğesini ç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 programının bulunduğu 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üç iğnesinin yanındaki Mikro USB hata ayıklama bağlantı noktasına takın, 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çık olmalıdır.
Bu, Linux makinesine bağlı ilk kartsa /dev/ttyACM0
seri bağlantı noktası olarak görünür (sn bağlantı noktası tanımlayıcısı için tüm nRF52840 ana makineler 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 panonun seri numarasını kullanarak OpenThread RCP onaltılık dosyasını nRF52840 panosuna yapıştırın. --verify
işaretini bırakmanız durumunda flash işleminin hata olmadan başarısız olabileceğini belirten bir uyarı mesajı görürsünüz.
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset
Başarılı 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.
Panoyu daha sonra karıştırmamak için 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 ve YENİDEN AYARLA 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 Daemon'ı başlat
RCP tasarımında, Thread cihazıyla iletişim kurmak ve cihazı yönetmek için OpenThread Daemon'u kullanın. ot-daemon
değerini -v
ayrıntılı işaretiyle başlatın. Böylece günlük çıkışını görebilir ve çıkışın çalıştığını onaylayabilirsiniz:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'
Başarılı olduğunda, ayrıntılı modda ot-daemon
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
ile ilgili 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
iletişimini kullanın. ot-ctl
, OpenThread KSA uygulamasıyla aynı KSA'yı kullanır. Bu nedenle, ot-daemon
düğümlerini diğer Simüle edilmiş İleti Dizisi cihazlarıyla aynı şekilde kontrol edebilirsiniz.
İkinci bir terminal penceresinde ot-ctl
uygulamasını başlatın:
$ sudo ./build/posix/src/posix/ot-ctl >
ot-daemon
ile başladığınız Düğüm 2'nin state
ayarını (RCP düğümü) 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 Thread Cihazlarıdır (FTD). Bir Üretim ayarı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
) kullanacağız.
Bir cihaz, bu ağ üzerinde güvenli bir şekilde kimlik doğrulaması yapmak ve cihazlar için komisyon almak üzere Komisyon görevlisi olarak çalışır. Diğer cihaz, komisyon görevlisinin Thread ağı üzerinde kimlik doğrulaması yapabileceği bir birleştirme işlevi görür.
Derleme ve flaş yapma
nRF52840 platformu için Commissioner ve Birleştirme 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 programının bulunduğu dizine gidin ve dizini 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üç iğnesinin yanındaki Mikro USB bağlantı noktasına, ardından Linux makinesine takın. RCP hâlâ Linux makinesine bağlıysa bu yeni pano seri bağlantı noktası /dev/ttyACM1
olarak görünmelidir (tüm nRF52840 panolar 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 panosunun seri numarasını not edin:
nRFx Komut Satırı Araçlarının konumuna gidin ve panonun seri numarasını kullanarak OpenThread CLI FTD onaltılık dosyayı 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
Panoyu “Komisyon” olarak etiketleyin
Yerel USB'ye bağlan
OpenThread FTD derlemesi, seri aktarım olarak yerel USB CDC ACM kullanımını etkinleştirir. 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 ve YENİDEN AYARLA 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ğrulayın
Bir terminal penceresinde GNU Screen kullanarak OpenThread KSA'ya erişerek başarılı bir derlemeyi doğrulayın. nRF52840 kartları 115.200 nabız hızı kullanır.
$ screen /dev/ttyACM1 115200
Yeni pencerede, OpenThread CLI >
istemini açmak için klavyede birkaç kez Return tuşuna 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 → simgesini kullan
d
FTD Commissioner KSA'dan ayırmak ve Linux terminaline dönmek için bir sonraki panonun yanıp sönmesini sağlayın. Komut satırı çubuğunu istediğiniz zaman yeniden girmek için screen -r
komut satırını kullanın. Kullanılabilir ekranların listesini görmek için screen -ls
uygulamasını 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 panosunu yanıp sönmek için yukarıdaki işlemi tekrarlayın. İşiniz bittiğinde nRF USB bağlantı noktasını kullanarak kartı PC'ye yeniden bağlayın ve nRF güç kaynağı anahtarını VDD olarak ayarlayın.
Bu üçüncü kart bağlandığında diğer iki düğüm Linux makinesine eklenmişse bağlantı noktası /dev/ttyACM2
seri bağlantı noktası olarak görünmelidir:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
Jamboard'u &birleştirici" 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 mevcut pencere içinde yeni bir pencere oluşturun (FTD Müdürlüğü 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üntülenir. FTD Birleştirici için OpenThread KSA'sına erişme:
$ screen /dev/ttyACM2 115200
Bu yeni pencerede, OpenThread CLI >
istemini açmak için klavyede birkaç kez Return 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ştirici KSA artık FTD Müdürlüğü ile aynı Ekran örneğinde olduğundan Ctrl+a → n
tuşlarını kullanarak bunlar arasında geçiş yapabilirsiniz.
Ctrl+a → simgesini kullan
d
istediğiniz zaman Ekrandan çıkabilirsiniz.
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 durumda olduğundan emin olun. Şu ana kadar, iki FTD'ye erişmek için Screen'i kullanıyorduk. Bu araç, aynı terminal penceresinde bölünmüş ekrana da izin veriyor. 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 pencerenizin olması gerekir:
ot-daemon
hizmeti/günlükleriot-ctl
üzerinden RCP Birleştirici- OpenThread KSA üzerinden FTD Komisyonu
- OpenThread KSA üzerinden FTD Birleştirme Aracı
Kendi terminal / seri bağlantı noktası yapılandırmanızı veya aracınızı kullanmak istiyorsanız sonraki adıma geçebilirsiniz. Terminal pencerelerini, sizin için en uygun şekilde tüm cihazlar için yapılandırın.
Ekran kullanılıyor
Kullanım kolaylığı açısından yalnızca bir Ekran oturumu başlatın. Her iki FTD'yi de oluştururken zaten bir hesap oluşturmuş olmanız gerekir.
Ekran içindeki tüm komutlar Ctrl+a ile başlar.
Temel Ekran komutları:
Ekran oturumuna tekrar ekleyin (komut satırından) |
|
Ekran oturumundan çık | Ctrl+a → |
Ekran oturumunda yeni pencere oluştur | Ctrl+a → |
Aynı Ekran oturumundaki pencereler arasında geçiş yapma | Ctrl+a → |
Ekran oturumunda geçerli pencereyi sonlandırın | Ctrl+a → |
Bölünmüş Ekran
Ekran ile terminali birden fazla pencereye bölebilirsiniz:
screen
komutlarına Ctrl+a tuşlarını kullanarak erişebilirsiniz. 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 Müdürlüğü, FTD Birleştirici) 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
- Üst pencereyle aynıysa diğer FTD cihazını görüntülemek için tekrar Ctrl+a →
n
tuşlarına basın
Her ikisi de artık görünür durumda. Ctrl+a → Tab
tuşlarını kullanarak aralarında geçiş yapın. Kafa karışıklığının önlenmesi için her pencereyi Ctrl+a → A
ile yeniden adlandırmanızı öneririz.
Gelişmiş kullanım
Ekranı tekrar çeyreklere bölmek ve ot-daemon
günlüklerini ve RCP Birleştirme ot-ctl
dosyasını görüntülemek için bu hizmetler aynı Ekran örneğinde başlatılmalıdır. Bunu yapmak için ot-daemon
uygulamasını durdurun ve ot-ctl
uygulamasından çıkın ve bunları yeni Ekran pencerelerinde yeniden başlatın (Ctrl+a → c
).
Bu ayar gerekli değildir ve kullanıcı için alıştırma olarak bırakılır.
Aşağıdaki komutlarla 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 → |
Sonraki görüntülenen pencereye atla | Ctrl+a → |
Görüntülenen pencereyi ileri veya geri değiştirme | Ctrl+a → |
Geçerli pencereyi yeniden adlandırma | Ctrl+a → |
İstediğiniz zaman Ctrl+a → d
tuşlarını kullanarak Ekrandan ayrılın ve 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 Mesaj dizimizi oluşturalım. FTD Commissioner'da yeni bir Operasyonel Veri Kümesi oluşturup bunu aktif veri kümesi olarak belirleyin. Operasyonel Veri Kümesi, oluşturduğunuz İleti dizisi 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
Ağ Anahtarı'nı daha sonra kullanmak için not edin. 1234c0de7ab51234c0de7ab51234c0de
Bu veri kümesini etkin veri kümesi olarak girin:
> dataset commit active Done
IPv6 arayüzünü görüntüleyin:
> ifconfig up Done
Thread protokol işlemini başlatın:
> thread start Done
Bir süre sonra cihazın durumunu kontrol edin. Lider olmalıdır. Ayrıca, gelecekte referans olması 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)
"Codelab" ağı artık diğer Thread cihazlarından tarandığında görünür.
RCP Birleştirme'deki ot-ctl
kaynağından:
## RCP Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
FTD Birleştirme Aracı'nda OpenThread KSA'sından:
## FTD Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
"Kod laboratuvarı" 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ışında komisyon oluşturma işlemi kullanarak yeni oluşturduğumuz Thread ağına eklememiz gerekiyor.
FTD Müdürlüğü'nde Ağ Anahtarı'nı not ettik (örneğin, 1234c0de7ab51234c0de7ab51234c0de
). Ağ Anahtarı'nı tekrar aramanız gerekirse FTD Komisyonunda aşağıdaki komutu çalıştırın:
## FTD Commissioner ## > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done
Ardından, RCP Birleştiricisi'nde etkin veri kümesi Ağ Anahtarı'nı FTD Commissioner Ağ Anahtarı'na 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 Mesaj 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
Örgü Yerel IPv6 Adresi'ni (burada fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
) not alın. Bu adresi daha sonra kullanacaksınız.
FTD Commissioner'a geri döndüğünüzde yönlendiricinin ve alt tabloları kontrol ederek her iki cihazın da aynı ağa dahil olduğunu doğrulayın. RCP Birleştiriciyi 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 Bağlayıcı'nın örgü yerel adresini (RCP Bağlayıcı'nın ipaddr
çıkışından alınan örgü yerel 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
Şu anda, bu topoloji şemasında gösterildiği gibi iki düğümden oluşan bir Thread ağı var:
Topoloji diyagramları
Codelab'in geri kalanı boyunca çalışırken, ağın durumu her değiştiğinde yeni bir Thread topoloji diyagramını göstereceğiz. Düğüm rolleri aşağıdaki gibi belirtilir:
Yönlendiriciler her zaman beşgen, Son Cihazlar ise her zaman dairedir. Her bir düğümdeki sayılar, her bir düğümün o anki rolüne ve durumuna bağlı olarak KSA çıkışında gösterilen Yönlendirici Kimliği'ni veya Alt Öğe Kimliği'ni temsil eder.
9. FTD Birleştirici
Şimdi üçüncü İleti Dizisi cihazını codecode&ât; ağına ekleyelim. Bu kez, daha güvenli bant içi komisyon sürecini kullanacağız ve yalnızca FTD Birleştirici'nin katılmasına izin vereceğiz.
FTD Kombine Üyesi'nin tanıyabilmesi için FTD Birleştiricisi'nde eui64
'yi edinin:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
FTD Müdürlüğü'nde komisyon görevlisini başlatın ve toplantıya katılabilecek cihazın eui64
ile birlikte Tamamlayıcı Kimlik Bilgisi'ni (ör. J01NME
) belirtin. Birleştirici Kimlik Bilgisi, tüm büyük alfanümerik karakterlerden (okunabilirlik için I, O, Q ve Z hariç 0-9 ve A-Y) oluşan ve 6 ila 32 karakter uzunluğunda, cihaza özgü bir dizedir.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
FTD Birleştirici'ye geçin. Birleştirici rolü, FTD Commissioner'da az önce oluşturduğunuz Birleştirici Kimlik Bilgisi ile 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 için onay alırsınız:
## FTD Joiner ## ---------------- > Join success
FTD Derlemesi'nin "codelab" ağına katılması için Mesaj dizisini açın, durumu ve RLOC16'yı hemen kontrol edin:
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
Cihazın IPv6 adreslerini kontrol edin. ALOC'nin olmadığına dikkat edin. Bunun nedeni, bu cihazın lider olmaması veya ALOC gerektiren Hercast'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 Komisyonu'na geçiş yapın ve yönlendiricide ve alt tablolarda "codelab" ağında üç cihazın mevcut olduğunu onaylayın:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 2 | 0x0c02 | 240 | 15 | 3 | 44 |1|1|1|1| e6cdd2d93249a243 | Done
RLOC16'ya göre, FTD Birleştirme Aracı ağa bir Son Cihaz (alt) olarak eklenmiştir. Güncellenen topolojimiz şöyledir:
10. Mesaj dizisinin kullanımı
Bu Codelab'deki Mesaj Dizisi cihazları, Yönlendirici Uygun Son Cihazı (REED) olarak adlandırılan belirli bir Tam Thread Cihazı (FTD) türüdür. Yani, Yönlendirici veya Son Cihaz olarak işlev görebilirler ve kendilerini bir Son Cihazdan Yönlendirici'ye yükseltebilirler.
Mesaj dizisi, en fazla 32 yönlendiriciyi destekleyebilir, ancak Yönlendiricilerin sayısını 16 ile 23 arasında tutmaya çalışır. REED, 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 Yönlendirici'ye tanıtır.
FTD Birleştirme Aracı'nı ekledikten sonra Thread ağınızda iki alt yayıncı varsa en az iki dakika bekledikten sonra FTD Commissioner'daki yönlendiriciyi 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'ye yükseltti. 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'ne dayalı olmasıdır. Son Cihazdan Yönlendiriciye geçiş yaptığında Yönlendirici Kimliği ve Alt Kimlik değerleri de değişir ve 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 alt sürüme geçirme
Bu davranışı, FTD Derleyicisi'ni bir Yönlendirici'den tekrar Son Cihaz'a düşürerek test edebilirsiniz. Durumu alt öğe olarak değiştirip RLOC16'yı kontrol edin:
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
FTD Komitesi'ne geri döndüğünüzde FTD Birleştirme Aracı artık alt tabloda (Kimlik = 3) görünmelidir. Geçiş sırasında bile 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önlendirici'ye geri döner.
Lideri kaldır
Lider, tüm Mesaj Dizisi Yönlendiricileri arasından kendi kendisini seçer. Mevcut lider, Mesaj Dizisi ağından kaldırılırsa diğer Yönlendiricilerden biri yeni lider olur.
Thread ağınızdan 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 Aracı yeni Thread 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 unutmayın. Bu, kimliği ve Genişletilmiş MAC'i ile belirtildiği gibi RCP Birleştirici'dir. Thread ağını bir arada tutmak için FTD Commissioner'dan FTD Birleştirme'ye üst Yönlendiriciler'i değiştirmiştir. Bu işlem, RCP Bağlayıcı için yeni bir RLOC16 sağlar (Yönlendirici kimliği değiştiğinden 3'ten 46'ya).
## 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ştirme'nin çocuk olarak FTD Birleştirici'ye eklenmesi için birkaç dakika beklemeniz gerekebilir. Şunları kontrol etmek için durumu ve RLOC16'yı kontrol edin:
## RCP Joiner ## -------------- > state child > rloc16 b801
FTD Komisyonu'nu yeniden ekleyin
İki düğümlü bir Thread ağı çok eğlenceli değil. FTD Müdürlüğü'nü 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, "codelab" ağına otomatik olarak Son Cihaz olarak yeniden eklenir ve ardından bir Yönlendirici'ye yükseltilir.
## FTD Commissioner ## ---------------------- > state router Done
Şunları 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şur.
11. Sorun giderme
Farklı terminalde veya Ekran pencerelerinde birden fazla cihaz bulunan bir Thread ağını yönetmek karmaşık olabilir. Sorun yaşarsanı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 varsa veya Ekran içindeki Ekranlar), ekran yoksa Ctrl+a → k tuşlarına basarak ve screen -ls
komut satırından No Sockets found
çıktısını almaya devam edin. Ardından, her bir cihaz için Ekran pencerelerini yeniden oluşturun. Ekran öldürülse bile cihaz durumları 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 kesiliyorsa (bunun nedeni Linux'un gücünü çalıştıran Linux makinesinin uyku moduna geçmesi olabilir), en iyisi ileti dizisini kaldırmak, ağ kimlik bilgilerini temizlemek ve Thread ağı oluşturun adımından yeniden 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
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, bilgileri bir grup cihaza aynı anda iletmek için kullanılır. İş parçacığı 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 |
| Yerel bağlantı | Tüm FTD'ler ve MED'ler |
| Yerel bağlantı | Tüm FTD ve Sınır Yönlendiriciler |
| Örgü Yerel | Tüm FTD'ler ve MED'ler |
| Örgü Yerel | Tüm FTD ve Sınır Yönlendiriciler |
Bu Codelab'de Sınır Yönlendirici kullanmadığımızdan iki FTD ve MED çoklu yayın adresine odaklanalım.
Yerel bağlantı
Yerel bağlantı kapsamı, tek bir radyo iletimi veya tek bir hop'la erişilebilen tüm Mesaj Dizisi arayüzlerini içerir. Ağ topolojisi, ping'e ff02::1
çoklu yayın adresine hangi cihazların yanıt verdiğini belirler.
FTD Müdürlüğü'nden 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 vardır (FTD Birleştirme Aracı ve RCP Birleştirme Aracı), ancak FTD Müdürlüğü sadece FTD Birleştirici Yerel Bağlantı Adresinden (LLA) yalnızca bir yanıt almıştır. Bu sayede, FTD Kombinecisi tek bir durakla FTD Kombinesi'nin ulaşabileceği tek cihazdır.
Şimdi FTD Birleştirme Aracı'ndan 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 Kurulu LLA'nın ve ikincisinin (943b
ile biten) RCP Birleştirici LLA'sı olduğunu görebiliriz.
Bu, FTD Birleştirici'nin hem FTD Müdürlüğü'ne hem de RCP Birleştirici'ye doğrudan bağlı olduğunu gösterir. Bu da topolojimizi onaylar.
Örgü Yerel
Örgü-Yerel kapsamı, aynı İleti dizisi ağında erişilebilen tüm ileti dizisi arayüzlerini içerir. ff03::1
çoklu yayın adresine yapılan ping'e verilen yanıtları görelim.
FTD Müdürlüğü'nden 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 Komisyonu, FTD Derleme Uzmanı'nın Yönlendirme Bulucusu'ndan (RLOC, b800
ile biten) ve diğeri RCP Derlemesi & # Mesh-Local EID'den (ML-EID, sonu d55f
) iki yanıt aldı. Bu sorunun kaynağı, tüm ağlarla ilgili ağdır. Bir cihaz, ağ üzerinde 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
RCP Birleştirici'nin her iki ping çıkışındaki yanıt süresini not edin. RCP Bağışçısı'na ulaşmak, FTD Müdürlüğü'ne (68 ms) ulaşmak, FTD Birleştirici'ye (23 ms) ulaşmaktan çok daha uzun sürdü. Çünkü FTD Derneği'ne ulaşmak için iki atlama yapması gerekir.
Örgü yerel çok kanallı ping'in, RCPC'ye yalnızca RF Birleştirici ile değil, yalnızca iki FTD için yanıt verdiğini fark etmiş olabilirsiniz. Bunun nedeni, FTD'lerin ağ içindeki Yönlendiriciler, RCP'nin ise Son Cihaz olmasıdır.
Şunları 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 User Datagram Protocol (UDP)dir. OpenThread'te oluşturulmuş bir uygulama, Thread API'sindeki düğümler arasında veya harici bir ağdaki diğer cihazlara (Thread adlı ağda bir Sınır Yönlendirici varsa internet gibi) mesaj iletmek için UDP API'sini kullanabilir.
UDP soketleri, OpenThread KSA üzerinden açığa çıkar. İki FTD arasında ileti iletmek için bunu kullanalım.
FTD Birleştirme Aracı için Mesh-Local EID adresini alın. Bu adresi Thread ağının herhangi bir yerinden erişilebilir olduğu 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 bunu bir sokete bağlayın:
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
FTD Komisyoncusu'na geçin, UDP'yi başlatın ve FTD Birleştirme Aracı'nda ML-EID'yi kullanarak 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 canlı olmalıdır. FTD Müdürlüğünden mesaj gönderin:
## FTD Commissioner ## ---------------------- > udp send hellothere Done
UDP mesajı, FTD Birleştirme Aracı'nda alınmıştır.
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
14. Tebrikler!
Fiziksel Thread ağı oluşturdunuz.
Artık şunları biliyorsunuz:
- Mesaj dizisi cihaz türleri, roller ve kapsamlar arasındaki fark
- Thread cihazları ağdaki durumlarını nasıl yönetir?
- UDP'yi kullanarak düğümler arasında basit iletileri nasıl ileteceğiniz
Sonraki adımlar
Bu Codelab'i oluştururken aşağıdaki alıştırmaları deneyin:
ot-cli-mtd
ikili programını kullanarak FTD Birleştirici panosunu MTD olarak yeniden başlatın ve kendisinin hiçbir zaman bir Yönlendirici sürümüne geçmediğini veya Lider olmaya çalışmadığını gözlemleyin- Ağa daha fazla cihaz ekleyin (farklı bir platform deneyin!), yönlendirici ve alt tablolar kullanarak topolojinin taslağını oluşturun, ayrıca çoklu yayın adreslerine ping atın
- NCP'yi kontrol etmek için pspinel işlevini 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'ı destekleyen tüm platformları keşfedin
- OpenOpenThread: OpenThread'ın oluşturulması ve yapılandırılması hakkında daha fazla bilgi
- Thread Primer: Bu Codelab'de yer alan tüm mesaj dizisi kavramlarını kapsar.
Referans: