1. Wprowadzenie
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:
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: