Router granic wątków – transmisja grupowa Thread 1.2

1. Wprowadzenie

608c4c35050eb280.png

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:

5d0f36fd69ebcc9a.png

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:

b118448c98b2d583.png

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: