1. Wprowadzenie
Co to jest Thread?
Thread to oparty na adresach IP protokół sieci bezprzewodowej typu mesh o niskim poborze energii, który umożliwia bezpieczną komunikację między urządzeniami i chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć awarii pojedynczych punktów.
Co to jest OpenThread?
OpenThread wydane przez Google to implementacja Thread® typu open source.
Co to jest router granic OpenThread?
Opublikowany przez Google rozwiązanie OpenThread Border Router (OTBR) to implementacja open source routera Border Router.
Thread 1.2 Multicast
Thread 1.2 definiuje serię funkcji do obsługi multiemisji w sieci heterogenicznej (segmenty Thread, Wi-Fi/Ethernet) w adresach grupowych o zakresie większym niż lokalny.
Router graniczny Thread 1.2 rejestruje zbiór danych routera szkieletowego (BBR), a wybrana usługa BBR jest głównym routerem szkieletowym (PBBR), który odpowiada za multiemisyjne przychodzące/wychodzące do przodu.
Urządzenie Thread 1.2 wysyła wiadomość CoAP w celu zarejestrowania adresu transmisji grupowej w PBBR (ang. Multicast Listener Registration, MLR), jeśli adres jest większy niż lokalny obszar. PBBR używa standardu MLDv2 w interfejsie zewnętrznym do komunikowania się z szerszą siecią LAN/WAN IPv6 w związku z grupami multiemisji IPv6, których ma nasłuchiwać w imieniu lokalnej sieci Thread. PBBR przekazuje ruch multicast do sieci Thread tylko wtedy, gdy miejsce docelowe jest subskrybowane przez co najmniej jedno urządzenie Thread.
W przypadku minimalnych urządzeń końcowych Thread 1.2 mogą one polegać na rodzicach, którzy gromadzą adres multicast i wykorzystują MLR w jego imieniu, lub rejestrują się, jeśli rodzic to Thread 1.1.
Więcej informacji znajdziesz w artykule 5.24 Specyfikacji Thread 1.2 w sekcji 5.24 Przekazywanie transmisji grupowych większych niż w zakresie Realm-Local.
Co utworzysz
W ramach tego ćwiczenia w Codelabs dowiesz się, jak skonfigurować router graniczny Thread i 2 urządzenia Thread, a następnie włączyć i zweryfikować funkcje multiemisji na urządzeniach Thread i Wi-Fi.
Czego się nauczysz
- Jak utworzyć oprogramowanie układowe nRF52840 z funkcjami transmisji grupowej Thread 1.2.
- Subskrybowanie adresów multicast IPv6 na urządzeniach Thread.
Co będzie potrzebne
- urządzenie Raspberry Pi 3/4 i karta SD o pojemności co najmniej 8 GB;
- 3 płytki Nordic Semiconductor nRF52840 DK.
- punkt dostępu Wi-Fi bez włączonego zabezpieczenia przed reklamami routera IPv6.
- Laptop z systemem Linux lub macOS (działa też Raspberry Pi) z zainstalowanym Pythonem3.
2. Skonfiguruj OTBR
Wykonaj ćwiczenia z programowania dotyczące routera granic wątków – dwukierunkowe połączenia IPv6 i wykrywania usług opartego na DNS, aby skonfigurować router granic wątków na Raspberry Pi.
Po zakończeniu konfigurowania urządzenie Raspberry Pi powinno było utworzyć działającą sieć Thread i nawiązać połączenie z siecią Wi-Fi.
W ciągu kilku sekund OTBR powinien stać się głównym routerem szkieletowym.
$ 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. Tworzenie i flashowanie urządzeń Thread
Utwórz aplikację interfejsu wiersza poleceń Thread 1.2 przy użyciu multiemisji i wgraj 2 płyty nRF52840 DK.
Tworzenie oprogramowania układowego nRF52840 DK
Postępuj zgodnie z instrukcjami, aby skopiować projekt i stworzyć oprogramowanie układowe nRF52840.
$ 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
Udane oprogramowanie układowe szesnastkowe znajdziesz pod adresem ot-cli-ftd.hex
.
Oprogramowanie Flash nRF52840 DK
Wgraj oprogramowanie układowe w nRF52840 DK przy użyciu interfejsu nrfjprog
, który jest częścią narzędzi wiersza poleceń nRF.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. Podłączanie urządzeń Thread do sieci Thread
W poprzednich krokach OTBR utworzył(a) sieć Thread. Możemy teraz dodać pakiety nRF52840 DK do sieci Thread:
Pobierz nieprzetworzony aktywny zbiór danych z OTBR:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Połącz się z płytką nRF52840 DK:
$ screen /dev/ttyACM0 115200
Skonfiguruj aktywny zbiór danych dla nRF52840 DK:
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
Uruchom stos Thread, poczekaj kilka sekund i sprawdź, czy urządzenie zostało podłączone:
> ifconfig up Done > thread start Done > state child
Powtórz powyższe kroki, aby podłączyć drugą płytkę nRF52840 DK do sieci Thread.
Udało się skonfigurować sieć Thread na 3 urządzeniach Thread: OTBR i 2 płytki nRF52840 DK.
5. Skonfiguruj sieć Wi-Fi
Skonfiguruj sieć Wi-Fi OTBR i laptopa, aby były połączone z tym samym punktem dostępu Wi-Fi.
Przy użyciu polecenia raspi-config możemy skonfigurować identyfikator SSID sieci Wi-Fi i hasło na urządzeniu OTBR Raspberry Pi.
Ostateczna topologia sieci wygląda tak:
6. Subskrybuj adres transmisji grupowej IPv6
Subskrybuj ff05::abcd na nRF52840 Urządzeniem końcowym 1:
> ipmaddr add ff05::abcd Done
Sprawdź, czy ff05::abcd
ma subskrypcję:
> 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
Zasubskrybuj ff05::abcd na laptopie:
Potrzebny jest skrypt w języku Python subscribe6.py
, aby zasubskrybować adres transmisji grupowej 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 zasubskrybować ff05::abcd
przez interfejs sieci Wi-Fi (np. wlan0):
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
Ostateczną topologię sieci z subskrypcjami multicast znajdziesz poniżej:
Po zasubskrybowaniu adresu multiemisji IPv6 zarówno na urządzeniu końcowym nRF52840 nRF52840, jak i na laptopie w sieci Wi-Fi, sprawdzimy osiągalność dwukierunkowej transmisji grupowych IPv6 w kolejnych sekcjach.
7. Zweryfikuj przychodzący multiemisję IPv6
Teraz powinno być możliwe dotarcie zarówno do nRF52840, urządzenia końcowego 1 w sieci Thread, jak i do laptopa przy użyciu adresu multiemisji IPv6 ff05::abcd
w sieci Wi-Fi.
Ping ff05::abcd w 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 otrzymać 2 odpowiedzi pingu zarówno z urządzenia końcowego nRF52840, jak i laptopa, ponieważ obie mają subskrypcję usługi ff05::abcd
. To pokazuje, że OTBR może przekierować pakiety multiemisyjne żądania Ping IPv6 z sieci Wi-Fi do sieci Thread.
8. Zweryfikuj wychodzący multiemisję IPv6
Ping ff05::abcd na nRF52840 Urządzenie końcowe 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 2 nRF52840 może otrzymywać odpowiedzi ping zarówno z urządzenia końcowego nRF52840, jak i laptopa. Pokazuje to, że OTBR może przekierować pakiety multicast odpowiedzi IPv6 z sieci Thread do sieci Wi-Fi.
9. Gratulacje
Gratulujemy! Udało Ci się skonfigurować router granic wątków i zweryfikować multiemisję IPv6 dwukierunkową.
Więcej informacji o OpenThread znajdziesz na openthread.io.
Dokumenty referencyjne: