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