Router granic wątków – transmisja grupowa IPv6

Informacje o tym ćwiczeniu (w Codelabs)
schedule17 minut
subjectOstatnia aktualizacja: 5 maja 2025
account_circleAutorzy: Simon Lin, Jonathan Hui

1. Wprowadzenie

608c4c35050eb280.png

Czym jest Thread?

Thread to protokół sieci bezprzewodowej typu mesh 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 udostępniony przez Google to implementacja Thread® typu open source.

Co to jest router graniczny OpenThread?

OpenThread Border Router (OTBR) opublikowany przez Google to implementacja routera granicznego Thread w wersji open source.

Multicast IPv6

Thread definiuje szereg funkcji obsługujących multicast w różnorodnych sieciach (segmenty sieci Thread i Wi-Fi/Ethernet) w przypadku adresów multicast z zakresem większym niż lokalna domena.

Router graniczny Thread rejestruje zbiór danych routera szkieletowego (BBR), a wybrana usługa BBR to podstawowy router szkieletowy (PBBR), który odpowiada za kierowanie przychodzących i wychodzących pakietów multicast.

Urządzenie Thread wysyła wiadomość CoAP, aby zarejestrować adres multicast w PBBR (Multicast Listener Registration, w skrócie MLR), jeśli adres jest większy niż domena lokalna. PBBR używa MLDv2 na interfejsie zewnętrznym, aby komunikować się z szerszą siecią LAN/WAN IPv6 w sprawie grup multicast IPv6, które musi odbierać w imieniu lokalnej sieci Thread. PBBR przekierowuje ruch grupowy do sieci Thread tylko wtedy, gdy co najmniej 1 urządzenie Thread jest subskrybowane.

W przypadku urządzeń końcowych Thread Minimal End Device może być konieczne zgrupowanie adresu multicast i wykonywanie w imieniu urządzenia końcowego funkcji MLR lub rejestrowanie się samodzielnie, jeśli urządzenie nadrzędne jest urządzeniem Thread 1.1.

Więcej informacji znajdziesz w specyfikacji Thread.

Co utworzysz

W tym laboratorium kodu skonfigurujesz router graniczny Thread i 2 urządzenia Thread, a potem włączysz i sprawdzisz funkcje multicast na urządzeniach Thread i Wi-Fi.

Czego się nauczysz

  • Jak skompilować oprogramowanie nRF52840 z obsługą IPv6 Multicast.
  • Jak subskrybować adresy multicast IPv6 na urządzeniach Thread.

Co będzie potrzebne

  • stacja robocza z systemem Linux do kompilowania i programowania układów scalonych Thread RCP, interfejsu wiersza poleceń OpenThread oraz testowania multicastu IPv6.
  • Raspberry Pi do routera granicznego Thread.
  • 2 przejściówki USB Nordic Semiconductor nRF52840 (jedna dla RCP i dwie dla urządzeń końcowych Thread).

2. Konfigurowanie usługi OTBR

Najszybszym sposobem skonfigurowania usługi OTBR jest skorzystanie z przewodnika po konfiguracji usługi OTBR.

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

> 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

Utwórz aplikację Thread CLI za pomocą Multicast i sflashuj 2 płyty rozwojowe nRF52840 DK.

Tworzenie oprogramowania nRF52840 DK

Postępuj zgodnie z instrukcjami, aby sklonować projekt i skompilować oprogramowanie układu nRF52840.

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

Kontynuuj tworzenie sieci Thread za pomocą płytek nRF52840 i OpenThread w ramach Codelab. Po zaflashowaniu urządzenia końcowego obrazem CLI wykonaj instrukcje z 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 w sieci Thread.

4. Subskrybuj adres multicast IPv6

Subskrybuj ff05::abcd na nRF52840 End Device 1:

> ipmaddr add ff05::abcd
Done

Sprawdź, czy subskrypcja ff05::abcd została uruchomiona:

> 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

Subskrybuj ff05::abcd na laptopie:

Potrzebujemy skryptu Pythona subscribe6.py, aby zasubskrybować adres wielodostępowy 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 subscribe6.py, aby subskrybować 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.

Poniżej przedstawiono końcową topologię sieci z subskrypcjami multicast:

b118448c98b2d583.png

Teraz, gdy subskrybujemy adres multicast IPv6 na obu urządzeniach nRF52840 End Device 1 w sieci Thread i na laptopie w sieci Wi-Fi, w następnych sekcjach sprawdzimy dwukierunkową osiągalność multicast IPv6.

5. Sprawdzanie przychodzącego multicastu IPv6

Teraz powinniśmy mieć możliwość połączenia się z urządzeniem końcowym nRF52840 1 w sieci Thread oraz z laptopem za pomocą adresu IPv6 ff05::abcd z sieci Wi-Fi.

Ping 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 otrzymywać 2 odpowiedzi na ping zarówno z urządzenia końcowego nRF52840 1, jak i z laptopa, ponieważ oba są subskrybowane do ff05::abcd. Pokazuje to, że urządzenie OTBR może przekazywać pakiety IPv6 z prośbą o ping z sieci Wi-Fi do sieci Thread.

6. Weryfikacja wychodzącego multicastu IPv6

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

> 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 otrzymywać odpowiedzi na ping zarówno od urządzenia końcowego nRF52840 1, jak i od laptopa. Pokazuje to, że OTBR może przekazywać pakiety IPv6 Ping Reply 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.

Dokumenty referencyjne: