1. Giriş
Thread nedir?
Thread, cihazlar arasında ve cihazlar arasında güvenli iletişim kurulmasına olanak tanıyan IP tabanlı, düşük güçlü bir kablosuz örgü ağ protokolüdür. Thread ağları, tek noktalı hataları önlemek için topoloji değişikliklerine uyum sağlayabilir.
OpenThread nedir?
Google tarafından yayınlanan OpenThread, Thread® uygulamasının açık kaynaklı bir uygulamasıdır.
OpenThread Sınır Yönlendirici nedir?
Google tarafından yayınlanan OpenThread Sınır Yönlendirici (OTBR), Thread Kenarlık Yönlendirici'nin açık kaynaklı bir uygulamasıdır.
Thread 1.2 Multicast (İş Parçacığı 1.2 Çoklu Yayın)
İş parçacığı 1.2, kapsamı yerel alandan daha büyük olan çoklu yayın adresleri için heterojen bir ağda (İş Parçacığı ve Kablosuz/Ethernet Ağı segmentleri) çoklu yayını desteklemek üzere bir dizi özellik tanımlar.
Bir Thread 1.2 Sınır Yönlendiricisi Omurga Yönlendirici (BBR) Veri Kümesini kaydeder ve seçilen BBR hizmeti, gelen/giden ileriye yönelik çoklu yayın işleminden sorumlu Birincil Omurga Yönlendiricidir (PBBR).
Bir Thread 1.2 cihazı, adres yerel alandan daha büyükse çoklu yayın adresini PBBR'ye (Çoklu Yayın Dinleyici Kaydı, kısaca MLR) kaydetmek için bir CoAP mesajı gönderir. PBBR, yerel Thread Ağı adına dinlemesi gereken IPv6 çok noktaya yayın grupları hakkında daha geniş kapsamlı 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 hedefe en az bir Thread cihazı tarafından abone olunduğunda Thread Ağına yönlendirir.
Thread 1.2 Minimal End Cihazlarda, çoklu yayın adresini toplama ve onlar adına MLR gerçekleştirme konusunda üst öğelerine bağlı olabilirler veya üst öğeleri Thread 1.1'deyse kendilerini kaydedebilirler.
Daha ayrıntılı bilgi için lütfen Thread 1.2 Spesifikasyon Bölüm 5.24 Realm-Local Scope'tan daha büyük için Çoklu Yayın Yönlendirme'ye bakın.
Oluşturacağınız nedir?
Bu codelab'de, bir İş Parçacığı Yönlendiricisi ve iki Thread cihazı kuracak, ardından Thread ve kablosuz cihazlarda Çoklu Yayın özelliklerini etkinleştirip doğrulayacaksınız.
Neler öğreneceksiniz?
- Thread 1.2 Çoklu Yayın özellikleriyle nRF52840 donanım yazılımı oluşturma.
- Thread cihazlarda IPv6 çoklu yayın adreslerine abone olma.
Gerekenler
- Raspberry Pi 3/4 cihaz ve en az 8 GB özellikli bir SD kart.
- 3 Nordic Semiconmissionor nRF52840 DK kart.
- Yönlendiricide IPv6 Yönlendirici Reklam Koruması'nın etkinleştirilmediği bir Wi-Fi AP.
- Python3 yüklü Linux/macOS dizüstü bilgisayar (Raspberry Pi de çalışır).
2. OTBR'yi kur
Raspberry Pi'de İş Parçacığı Sınırı Yönlendiricisi kurmak için İş Parçacığı Sınırı Yönlendirici - Çift Yönlü IPv6 Bağlantısı ve DNS Tabanlı Hizmet Keşfi codelab'ini uygulayın.
İşlem tamamlandığında Raspberry Pi, çalışan bir Thread ağı oluşturmuş ve kablosuz ağa bağlı olmalıdır.
OTBR saniyeler içinde Birincil Omurga Yönlendirici haline gelir.
$ sudo ot-ctl bbr state Primary Done $ sudo ot-ctl bbr BBR Primary: server16: 0xD800 seqno: 23 delay: 1200 secs timeout: 3600 secs Done
3. Derleme ve Flash Thread cihazları
Multicast ile Thread 1.2 CLI uygulamasını oluşturun ve iki nRF52840 DK kartını yükleyin.
nRF52840 DK donanım yazılımı geliştirme
Projeyi klonlamak ve nRF52840 donanım yazılımını derlemek için talimatları uygulayın.
$ mkdir -p ~/src $ cd ~/src $ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx/ $ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2 $ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex
Başarıyla oluşturulmuş HEX donanım yazılımını ot-cli-ftd.hex
adresinde bulabilirsiniz.
Flash nRF52840 DK donanım yazılımı
nRF Komut Satırı Araçları'nın bir parçası olan nrfjprog
öğesini kullanarak donanım yazılımını nRF52840 DK'ya yükleyin.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. Thread cihazlarını Thread ağına ekleme
OTBR önceki adımlarda bir Thread ağı oluşturdu. Artık nRF52840 DK'leri Thread ağına ekleyebiliriz:
OTBR'den ham Etkin Veri Kümesi alın:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
nRF52840 DK panosuna bağlanın:
$ screen /dev/ttyACM0 115200
nRF52840 DK için Aktif Veri Kümesini yapılandırın:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
Thread yığınını başlatın, birkaç saniye bekleyip cihazın başarıyla eklendiğini doğrulayın:
> ifconfig up Done > thread start Done > state child
Diğer nRF52840 DK kartını Thread ağına bağlamak için yukarıdaki adımları tekrarlayın.
Şu anda 3 Thread cihaz ile Thread ağını başarıyla oluşturduk: OTBR ve iki nRF52840 DK kart.
5. Kablosuz Ağ Kur
OTBR ve dizüstü bilgisayardaki kablosuz ağı, aynı kablosuz erişim noktasına (AP) bağlanacak şekilde ayarlayın.
Raspberry Pi OTBR'de kablosuz SSID ve parolayı ayarlamak için raspi-config özelliğini kullanabiliriz.
Nihai ağ topolojisi aşağıda gösterilmiştir:
6. IPv6 çoklu yayın adresine abone olun
nRF52840 Son Cihaz 1'de ff05::abcd'ye abone olun:
> ipmaddr add ff05::abcd Done
ff05::abcd
adlı müşterinin başarıyla abone olduğunu doğrulayın:
> ipmaddr ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed 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'ye abone olun:
Dizüstü bilgisayarda çoklu yayın adresine abone olabilmek için bir Python komut dosyasına subscribe6.py
ihtiyacımız var.
Aşağıdaki kodu kopyalayıp subscribe6.py
adıyla 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) ff05::abcd
hizmetine abone olmak için subscribe6.py
komutunu çalıştırın:
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
Çoklu yayın abonelikleriyle son ağ topolojisi aşağıda gösterilmiştir:
Artık hem Thread ağındaki nRF52840 Son Cihaz 1'de hem de kablosuz ağdaki dizüstü bilgisayarda IPv6 çoklu yayın adresine abone olduğumuza göre aşağıdaki bölümlerde iki yönlü IPv6 çok noktaya yayın erişilebilirliğini doğrulayacağız.
7. Gelen IPv6 Çoklu Yayını Doğrulama
Artık kablosuz ağdan ff05::abcd
IPv6 çoklu yayın adresini kullanarak Thread ağındaki nRF52840 Son Cihaz 1'e ve dizüstü bilgisayardan ulaşabilmemiz gerekir.
Kablosuz arayüzü üzerinden OTBR'de ff05::abcd ping'i:
$ 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
Her ikisi de ff05::abcd
ürününe abone olduğundan OTBR'nin hem nRF52840 Son Cihaz 1 hem de Dizüstü Bilgisayar'dan iki ping yanıtı alabileceğini görüyoruz. Bu, OTBR'nin IPv6 Ping İsteği çoklu yayın paketlerini kablosuz ağdan Thread ağına yönlendirebildiğini gösterir.
8. Giden IPv6 Çoklu Yayını Doğrulama
nRF52840 Son Cihaz 2'ye ff05::abcd pingleme:
> 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 Son Cihaz 2, hem nRF52840 Son Cihaz 1 hem de dizüstü bilgisayardan ping yanıtları alabilir. Bu, OTBR'nin IPv6 Ping Reply çoklu yayın paketlerini Thread ağından kablosuz ağa yönlendirebildiğini gösterir.
9. Tebrikler
Tebrikler, İş Parçacığı Sınır Yönlendiricisini başarıyla ayarladınız ve çift yönlü IPv6 çoklu yayını doğruladınız.
OpenThread hakkında daha fazla bilgi için openthread.io sayfasını ziyaret edin.
Referans belgeler: