Mesaj Dizisi Sınır Yönlendirici - Thread 1.2 Çoklu Yayın

1. Giriş

608c4c35050eb280.png

İleti dizisi nedir?

Thread, cihazlar arası ve cihazlar arası güvenli iletişim olanağı sağlayan IP tabanlı düşük güçlü kablosuz örgü ağ protokolüdür. Mesaj dizisi ağları, tek noktadan kaynaklanan hataları önlemek için topolojideki değişikliklere 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), İleti Dizisi Sınır Yönlendiricisinin açık kaynak uygulamasıdır.

Thread 1.2 Çoklu Yayın

Thread 1.2, yerel erişim alanından daha geniş kapsama sahip çoklu yayın adresleri için heterojen bir ağda (Thread ve Wi-Fi/Ethernet Network segmentleri) çoklu yayını destekleyen bir dizi özellik tanımlar.

İş parçacığı 1.2 Sınır Yönlendiricisi, Omurga Yönlendiricisi (BBR) Veri Kümesini kaydeder. Seçilen BBR hizmeti ise gelecekte birden çok yayın için giden/giden giden Birincil Omurga Yönlendiricisi (PBBR) olur.

Bir Thread 1.2 Cihazı, çoklu yayın adresini PBBR'ye (Çoklu Yayın İşleyici Kaydı, kısaca MLR) kaydetmek için bir CoAP mesajı göndermektedir. PBBR, yerel İş Parçacık Ağı adına dinlemesi gereken IPv6 çoklu yayın grupları hakkında daha geniş kapsamlı IPv6 LAN/WAN ile iletişim kurmak için Harici Arayüzünde MLDv2 kullanıyor. PBBR, yalnızca hedefe en az bir Thread cihazı tarafından abone olunduğunda çoklu yayın trafiğini Thread Ağına yönlendirir.

Thread 1.2 Minimum Uç Cihazlar için bu cihazlar ebeveynlerinin, çoklu yayın adresini toplamalarına ve MLR'yi kendileri adına MLR yapmalarına bağlı olabilir veya Thread 1.1'de bir ebeveyn ise kendi kayıtlarını yapabilir.

Ayrıntılı bilgi için İhtiyacınız Yerel Erişim Kapsamından Büyüktür için İleti Dizisi 1.2 Spesifikasyon Bölümü 5.24 Çoklu Yayın Yönlendirme bölümüne bakın.

Geliştirecekleriniz

Bu codelab'de bir Mesaj Dizisi Sınır Yönlendiricisi ve iki Thread cihaz oluşturacak, ardından Thread cihazlarında ve Wi-Fi cihazlarında Çoklu Yayın özelliklerini etkinleştirip doğrulayacaksınız.

Neler öğreneceksiniz?

  • Thread 1.2 çoklu yayın özelliğiyle nRF52840 donanım yazılımını derleme.
  • Thread cihazlarında IPv6 çoklu yayın adreslerine abone olma.

İhtiyacınız olanlar

  • Raspberry Pi 3/4 cihazı ve en az 8 GB kapasitesi olan bir SD kart.
  • 3 İskandinav Yarıiletken nRF52840 DK kartı.
  • Yönlendiricide IPv6 Yönlendirici Reklam Koruyucu'nun etkinleştirilmemiş olduğu bir kablosuz erişim noktası.
  • Python3 yüklü Linux/macOS Dizüstü Bilgisayar (Raspberry Pi de çalışır).

2. OTBR Kurulumu

Raspberry Pi'de Thread Border Yönlendirici'yi kurmak içinThread Limit Router - Çift Yönlü IPv6 Bağlantısı ve DNS Tabanlı Hizmet Keşfi codelab'e uyun.

İşlem tamamlandığında, Raspberry Pi çalışan bir Thread ağı oluşturmuş ve bir kablosuz ağa bağlı olmalıdır.

OTBR, saniyeler içinde Birincil Omurga Yönlendiricisi olmalıdır.

$ 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ı

Thread 1.2 CLI uygulamasını Multicast ile oluşturun ve iki nRF52840 DK panosunu yanıp sönün.

nRF52840 DK donanım yazılımı oluşturma

Projeyi klonlamak ve nRF52840 donanım yazılımını oluşturmak 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şturulan 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 aracılığıyla donanım yazılımını nRF52840 DK'ya aktarın.

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

4. Thread cihazlarını Thread ağına ekleyin

OTBR, önceki adımlarda bir Thread ağı oluşturdu. Artık nRF52840 DK'leri Thread ağına ekleyebiliriz:

OTBR'den ham Aktif Veri Kümesi alma:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

Bir nRF52840 DK kartına bağlanın:

$ screen /dev/ttyACM0 115200

nRF52840 DK için Aktif Veri Kümesini yapılandırın:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

Mesaj dizisi yığınını başlatın ve 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 eklemek için yukarıdaki adımları tekrarlayın.

3 Thread cihaz ile Thread ağını başarıyla kurduk: OTBR ve iki nRF52840 DK kartı.

5. Kablosuz Ağ Kur

OTBR ve Dizüstü bilgisayarınızda kablosuz ağı aynı kablosuz AP'ye bağlı olacak şekilde ayarlayın.

Raspberry Pi OTBR'de kablosuz SSID ve parolayı ayarlamak için raspi-config kullanabiliriz.

Ağ topolojisinin son halini aşağıda görebilirsiniz:

5d0f36fd69ebcc9a.png

6. IPv6 çoklu yayın adresine abone olun

nFF52840 Son Cihaz 1'de ff05::abcd abonesi olun:

> ipmaddr add ff05::abcd
Done

ff05::abcd kanalına başarıyla abone olunduğ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 hizmetine abone olun:

Dizüstü bilgisayarda bir çoklu yayın adresine abone olmak için Python komut dosyasına subscribe6.py ihtiyacımız var.

Aşağıdaki kodu kopyalayın ve 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 ff05::abcd özelliğine abone olmak için subscribe6.py komutunu çalıştırın (ör. wlan0):

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

Çoklu yayın abonelikleri olan nihai ağ topolojisi aşağıda gösterilmiştir:

b118448c98b2d583.png

Thread ağında hem nRF52840 End Device 1 hem de Wi-Fi ağında dizüstü bilgisayar için 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.

7. Gelen IPv6 Çoklu Yayınını Doğrulayın

Şimdi, Wi-Fi ağından IPv6 çoklu yayın adresini ff05::abcd kullanarak hem nRF52840 End Device Thread hem de Laptop'a ulaşabilmemiz gerekir.

OTBR'de kablosuz ağ üzerinden ff05::abcd pingleyin:

$ 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, nRF52840 Son Cihaz 1 ve Dizüstü Bilgisayar'dan ikisi de ff05::abcd abonesi olduğundan 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 iletebileceğini gösterir.

8. Giden IPv6 Çoklu Yayınını Doğrulama

nRF52840 Son Cihaz 2'de ping05::abcd:

> 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, nRF52840 End Device 1 ve dizüstü bilgisayardan hem ping yanıtları alabilir. Bu, OTBR'nin IPv6 Ping Reply çoklu yayın paketlerini Thread ağından kablosuz ağa iletebileceğini gösterir.

9. Tebrikler

Tebrikler, bir Mesaj Dizisi Sınır Yönlendirici'yi başarıyla kurdunuz ve çift yönlü IPv6 çoklu yayınını doğruladınız.

OpenThread hakkında daha fazla bilgi için openthread.io adresini ziyaret edin.

Referans belgeler: