1. Giriş
Thread nedir?
Thread, cihazdan cihaza ve cihazdan buluta güvenli iletişimi sağlayan, IP tabanlı düşük güçte kablosuz mesh ağ protokolüdür. Thread ağları, tek nokta hatalarını önlemek için topoloji değişikliklerine uyum sağlayabilir.
OpenThread nedir?
Google tarafından yayınlanan OpenThread, Thread®'in açık kaynaklı bir uygulamasıdır.
OpenThread sınır yönlendirici nedir?
Google tarafından yayınlanan OpenThread Border Router (OTBR), Thread Border Router'ın açık kaynaklı bir uygulamasıdır.
IPv6 Çoklu Yayın
Thread, alan yerelinden daha geniş kapsamlı çoklu yayın adresleri için heterojen bir ağda (Thread ve Wi-Fi/Ethernet ağ segmentleri) çoklu yayını destekleyecek bir dizi özellik tanımlar.
Thread Border Router, Backbone Router (BBR) veri kümesini kaydeder ve seçilen BBR hizmeti, çoklu yayın gelen/giden yönlendirmesinden sorumlu olan birincil Backbone Router (PBBR) olur.
Bir Thread cihazı, adres alan yerelinden büyükse çoklu yayın adresini PBBR'ye kaydetmek için bir CoAP mesajı gönderir (kısaca Çoklu Yayın Dinleyici Kaydı, MLR). PBBR, yerel Thread ağı adına dinlemesi gereken IPv6 çoklu yayın grupları hakkında daha geniş IPv6 LAN/WAN ile iletişim kurmak için Harici Arayüzünde MLDv2'yi kullanır. PBBR, çoklu yayın trafiğini yalnızca hedefte en az bir Thread cihazı abone olmuşsa Thread ağına yönlendirir.
Thread Minimal End Devices, çoklu yayın adresini toplamak ve kendi adına MLR yapmak için üst cihazına bağlı olabilir veya üst cihazı Thread 1.1 ise kendisini kaydedebilir.
Daha fazla bilgi için lütfen Thread Spesifikasyonu'na bakın.
Ne oluşturacaksınız?
Bu codelab'de bir Thread sınır yönlendiricisi ve iki Thread cihazı kuracak, ardından Thread cihazlarında ve kablosuz cihazlarda çoklu yayın özelliklerini etkinleştirip doğrulayacaksınız.
Neler öğreneceksiniz?
- IPv6 çoklu yayın desteğiyle nRF52840 donanım yazılımı oluşturma
- Thread cihazlarda IPv6 çoklu yayın adreslerine abone olma
İhtiyacınız olanlar
- Thread RCP, OpenThread CLI oluşturma ve yanıp sönme ve IPv6 çoklu yayını test etme için Linux iş istasyonu.
- Thread sınır yönlendirici için Raspberry Pi.
- 2 Nordic Semiconductor nRF52840 USB Dongle (bir tanesi RCP, iki tanesi Thread uç cihazları için).
2. OTBR'yi kurma
OTBR'yi ayarlamanın en hızlı yolu OTBR Kurulum Kılavuzu'nu takip etmektir.
OTBR kurulumu tamamlandıktan sonra, OTBR'nin birkaç saniye içinde birincil omurga yönlendiricisi olduğunu doğrulamak için ot-ctl
'yi kullanın.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Thread cihazları oluşturma ve flash etme
Çoklu yayın ile Thread CLI uygulamasını oluşturun ve iki nRF52840 DK kartını flashlayın.
nRF52840 DK donanım yazılımını oluşturma
Projeyi klonlama ve nRF52840 donanım yazılımını oluşturma talimatlarını uygulayın.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
nRF52840 kartları ve OpenThread ile Thread ağı oluşturma codelab'ine yazıldığı şekilde devam edin. Uç cihaz, CLI görüntüsüyle güncellendikten sonra Thread cihazını Thread ağına eklemek için İkinci düğümü Thread ağına ekleme bölümündeki adımları uygulayın. İkinci Thread uç cihazı için de aynı işlemi tekrarlayın.
4. IPv6 çoklu yayın adresine abone olma
nRF52840 End Device 1'de ff05::abcd'ye abone olma:
> ipmaddr add ff05::abcd Done
ff05::abcd
adresinin başarıyla abone olduğunu doğrulayın:
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff02:0:0:0:0:0:0:2 ff03:0:0:0:0:0:0:2 ff02:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:fc Done
Dizüstü bilgisayarda ff05::abcd adresine abone olma:
Dizüstü bilgisayarda bir çoklu yayın adresine abone olmak için Python komut dosyası subscribe6.py
gerekir.
Aşağıdaki kodu kopyalayıp subscribe6.py
olarak kaydedin:
import ctypes
import ctypes.util
import socket
import struct
import sys
libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')
Kablosuz ağ arayüzünde (ör. wlan0) subscribe6.py
komutunu çalıştırarak ff05::abcd
aboneliğini başlatın:
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
Çoklu yayın aboneliklerinin bulunduğu nihai ağ topolojisi aşağıda gösterilmektedir:
Artık hem Thread ağındaki nRF52840 End Device 1'da hem de kablosuz ağdaki dizüstü bilgisayarda IPv6 çoklu yayın adresine abone olduğumuza göre, aşağıdaki bölümlerde çift yönlü IPv6 çoklu yayın erişilebilirliğini doğrulayacağız.
5. Gelen IPv6 Çok Noktaya Yayınını Doğrulama
Artık, Thread ağındaki nRF52840 End Device 1'e ve dizüstü bilgisayara, kablosuz ağdan IPv6 çoklu yayın adresi ff05::abcd
kullanılarak erişilebilmelidir.
Kablosuz arayüz üzerinden OTBR'de ff05::abcd adresini ping'leyin:
$ ping -6 -b -t 5 -I wlan0 ff05::abcd PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
OTBR'nin hem nRF52840 End Device 1 hem de dizüstü bilgisayardan iki ping yanıtı alabildiğini görüyoruz. Bunun nedeni, her ikisinin de ff05::abcd
'ya abone olmasıdır. Bu, OTBR'nin IPv6 Ping Request çoklu yayın paketlerini Kablosuz ağdan Thread ağına iletebileceğini gösterir.
6. Giden IPv6 Çok Noktaya Yayınını Doğrulama
nRF52840 End Device 2'de ff05::abcd adresine ping gönderin:
> ping ff05::abcd 100 10 1 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms
nRF52840 End Device 2, hem nRF52840 End Device 1 hem de dizüstü bilgisayardan ping yanıtları alabilir. Bu, OTBR'nin Thread ağındaki IPv6 Ping Reply çoklu yayın paketlerini kablosuz ağa iletebileceğini gösterir.
7. Tebrikler
Tebrikler, Thread sınır yönlendiriciyi başarıyla kurdunuz ve çift yönlü IPv6 çoklu yayını doğruladınız.
OpenThread hakkında daha fazla bilgi için openthread.io adresini ziyaret edin.
Referans belgeleri: