İş Parçacığı Kenarlığı Yönlendirici - Thread 1.2 Çoklu Yayın

1. Giriş

608c4c35050eb280.png

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:

5d0f36fd69ebcc9a.png

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:

b118448c98b2d583.png

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: