Router granic wątków – transmisja grupowa IPv6

1. Wprowadzenie

608c4c35050eb280.png

Czym jest Thread?

Thread to oparty na protokole IP bezprzewodowy protokół sieciowy o niskim poborze mocy, który umożliwia bezpieczną komunikację między urządzeniami i między urządzeniami a chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć awarii pojedynczego punktu.

Co to jest OpenThread?

OpenThread od Google to implementacja open source protokołu Thread®.

Co to jest router graniczny OpenThread?

OpenThread Border Router (OTBR) to udostępniona przez Google implementacja routera granicznego Thread typu open source.

Multicast IPv6

Wątek definiuje serię funkcji obsługujących multiemisję w sieci heterogenicznej (segmenty sieci Thread i Wi-Fi/Ethernet) dla adresów multiemisji o zakresie większym niż lokalny.

Router graniczny Thread rejestruje zestaw danych routera szkieletowego (BBR), a wybrana usługa BBR jest głównym routerem szkieletowym (PBBR), który odpowiada za przekazywanie ruchu multicast przychodzącego i wychodzącego.

Urządzenie Thread wysyła wiadomość CoAP, aby zarejestrować adres połączenia grupowego w PBBR (Multicast Listener Registration, w skrócie MLR), jeśli adres jest większy niż lokalny. PBBR używa protokołu MLDv2 na interfejsie zewnętrznym do komunikacji z szerszą siecią LAN/WAN IPv6 w sprawie grup multicastowych IPv6, których musi nasłuchiwać w imieniu lokalnej sieci Thread. PBBR przekazuje ruch grupowy do sieci Thread tylko wtedy, gdy co najmniej jedno urządzenie Thread jest subskrybentem miejsca docelowego.

W przypadku urządzeń końcowych Thread Minimal mogą one polegać na urządzeniu nadrzędnym w zakresie agregowania adresu multiemisji i wykonywania MLR w ich imieniu lub rejestrować się samodzielnie, jeśli urządzenie nadrzędne jest zgodne z Thread 1.1.

Więcej informacji znajdziesz w specyfikacji Thread.

Co utworzysz

W tym laboratorium kodowym skonfigurujesz router graniczny Thread i 2 urządzenia Thread, a następnie włączysz i zweryfikujesz funkcje multiemisji na urządzeniach Thread i Wi-Fi.

Czego się nauczysz

  • Jak utworzyć oprogramowanie sprzętowe nRF52840 z obsługą transmisji multicast w IPv6.
  • Jak subskrybować adresy multicast IPv6 na urządzeniach Thread.

Czego potrzebujesz

  • Stacja robocza z systemem Linux do tworzenia i flashowania urządzenia Thread RCP, interfejsu wiersza poleceń OpenThread oraz testowania multiemisji IPv6.
  • Raspberry Pi do routera granicznego Thread.
  • 2 klucze USB Nordic Semiconductor nRF52840 (jeden dla RCP i dwa dla urządzeń końcowych Thread).

2. Konfigurowanie OTBR

Najszybszym sposobem skonfigurowania OTBR jest skorzystanie z przewodnika po konfiguracji OTBR.

Po zakończeniu konfiguracji OTBR użyj ot-ctl, aby sprawdzić, czy OTBR stał się głównym routerem szkieletowym w ciągu kilku sekund.

> bbr state
Primary
Done
> bbr
BBR Primary:
server16: 0xF800
seqno:    21
delay:    5 secs
timeout:  3600 secs
Done

3. Tworzenie i flashowanie urządzeń Thread

Skompiluj aplikację interfejsu wiersza poleceń Thread z multicastem i wgraj ją na 2 płytki nRF52840 DK.

Kompilowanie oprogramowania sprzętowego nRF52840 DK

Postępuj zgodnie z instrukcjami, aby sklonować projekt i skompilować oprogramowanie sprzętowe nRF52840.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_MLR=ON

Postępuj zgodnie z instrukcjami w samouczku dotyczącym tworzenia sieci Thread za pomocą płytek nRF52840 i OpenThread. Po wgraniu obrazu CLI na urządzenie końcowe postępuj zgodnie z instrukcjami w sekcji Dołączanie drugiego węzła do sieci Thread, aby dodać urządzenie Thread do sieci Thread. Powtórz te czynności w przypadku drugiego urządzenia końcowego Thread.

4. Subskrybowanie adresu multiemisji IPv6

Subskrybowanie ff05::abcd na urządzeniu końcowym nRF52840 1:

> ipmaddr add ff05::abcd
Done

Sprawdź, czy subskrypcja ff05::abcd została rozpoczęta:

> 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

Subskrybowanie ff05::abcd na laptopie:

Potrzebujemy skryptu w języku Python subscribe6.py, aby zasubskrybować adres multiemisji na laptopie.

Skopiuj poniższy kod i zapisz go jako subscribe6.py:

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.')

Uruchom polecenie subscribe6.py, aby zasubskrybować ff05::abcd na interfejsie sieci Wi-Fi (np. wlan0):

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

Ostateczna topologia sieci z subskrypcjami multicastowymi jest pokazana poniżej:

b118448c98b2d583.png

Po zasubskrybowaniu adresu multiemisji IPv6 zarówno na urządzeniu końcowym nRF52840 1 w sieci Thread, jak i na laptopie w sieci Wi-Fi w kolejnych sekcjach sprawdzimy dwukierunkową osiągalność multiemisji IPv6.

5. Weryfikowanie przychodzącego multiemisji IPv6

Teraz powinniśmy mieć możliwość dotarcia zarówno do urządzenia końcowego nRF52840 1 w sieci Thread, jak i do laptopa za pomocą adresu połączeń grupowych IPv6 ff05::abcd z sieci Wi-Fi.

Użyj polecenia ping, aby sprawdzić czas dostępu do ff05::abcd na OTBR przez interfejs Wi-Fi:

$ 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

Widzimy, że OTBR może odbierać 2 odpowiedzi na pingi zarówno z urządzenia końcowego nRF52840 1, jak i z laptopa, ponieważ oba urządzenia są subskrybentami ff05::abcd. Oznacza to, że OTBR może przekazywać pakiety multicast żądania pinga IPv6 z sieci Wi-Fi do sieci Thread.

6. Weryfikowanie wychodzącego multiemisji IPv6

Ping ff05::abcd na urządzeniu końcowym 2 z nRF52840:

> 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

Urządzenie końcowe nRF52840 2 może odbierać odpowiedzi na pingi zarówno z urządzenia końcowego nRF52840 1, jak i z laptopa. Pokazuje to, że OTBR może przekazywać pakiety transmisji grupowej odpowiedzi na ping IPv6 z sieci Thread do sieci Wi-Fi.

7. Gratulacje

Gratulacje! Udało Ci się skonfigurować router graniczny Thread i zweryfikować dwukierunkowy multicast IPv6.

Więcej informacji o OpenThread znajdziesz na stronie openthread.io.

Dokumentacja: