1. Wprowadzenie
Co to jest router granic wątków?
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 pojedynczego punktu.
Router graniczny Thread łączy sieć Thread z innymi sieciami opartymi na IP, takimi jak Wi-Fi czy Ethernet. Sieć Thread wymaga routera Border Router do łączenia się z innymi sieciami. Router granic wątków obsługuje minimalnie te funkcje:
- Dwukierunkowe połączenia IP między sieciami Thread i Wi-Fi/Ethernet.
- Dwukierunkowe wykrywanie usług przez mDNS (w połączeniu Wi-Fi/Ethernet) i SRP (w sieci Thread).
- Infrastruktura typu „Thread-over-infrastruktura”, która scala partycje Thread przy użyciu linków opartych na adresach IP.
- Zewnętrzne przekazywanie wątków (np. telefon komórkowy) umożliwia uwierzytelnianie urządzenia Thread i dołączanie do sieci Thread.
Opublikowany przez Google rozwiązanie OpenThread Border Router (OTBR) to implementacja open source routera Border Router.
Co utworzysz
W ramach tego ćwiczenia w Codelabs dowiesz się, jak skonfigurować router granic wątków i połączyć telefon komórkowy z urządzeniem końcowym Thread za pomocą routera Border Router.
Czego się nauczysz
- Jak skonfigurować OTBR
- Jak utworzyć sieć Thread przy użyciu OTBR
- Jak utworzyć urządzenie interfejsu wiersza poleceń OpenThread z funkcją SRP
- Jak zarejestrować usługę w SRP
- Jak znaleźć urządzenie końcowe Thread i się z nim połączyć.
Czego potrzebujesz
- urządzenie Raspberry Pi 3/4 i karta SD o pojemności co najmniej 8 GB;
- 2 płytki deweloperskie Nordic Semiconductor nRF52840.
- punkt dostępu Wi-Fi bez włączonego zabezpieczenia przed reklamami routera IPv6.
- Telefon z iOS w wersji 14 lub nowszej albo telefon z Androidem w wersji 8.1 lub nowszej.
2. Skonfiguruj OTBR
Skonfiguruj Raspberry Pi
Możesz łatwo skonfigurować nowe urządzenie Raspberry Pi za pomocą narzędzia rpi-imager
, postępując zgodnie z instrukcjami na raspberrypi.org (zamiast korzystać z najnowszej wersji systemu operacyjnego Raspberry Pi – pobierz samodzielnie 2021-05-07-raspios-buster-armhf-lite). Aby wykonać na telefonie komórkowym opisane w tym ćwiczeniu w programie czynności, musisz połączyć Raspberry Pi z punktem dostępu Wi-Fi. Postępuj zgodnie z tym przewodnikiem, aby skonfigurować łączność bezprzewodową. Zalogowanie się do Raspberry Pi przez SSH jest wygodne – instrukcje znajdziesz tutaj.
Uzyskaj kod OTBR
Zaloguj się w Raspberry Pi i skopiuj ot-br-posix
z GitHuba:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
Tworzenie i instalowanie OTBR
OTBR ma 2 skrypty, które ładują się i konfigurują router granic wątków:
$ cd ot-br-posix $ ./script/bootstrap $ INFRA_IF_NAME=wlan0 ./script/setup
OTBR działa zarówno w interfejsie Thread, jak i w interfejsie sieci infrastruktury (np. Wi-Fi/Ethernet), który jest określony za pomocą INFRA_IF_NAME
. Interfejs Thread jest tworzony przez OTBR i domyślnie nazywa się wpan0
, a interfejs infrastruktury ma domyślną wartość wlan0
, jeśli nie określono wyraźnie parametru INFRA_IF_NAME
. Jeśli Twoje urządzenie Raspberry Pi jest podłączone kablem Ethernet, podaj nazwę interfejsu Ethernet (np. eth0
):
$ INFRA_IF_NAME=eth0 ./script/setup
Sprawdź, czy OTBR został zainstalowany:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2) Main PID: 2444 (code=exited, status=2)
Usługa otbr-agent
powinna być nieaktywna, ponieważ do działania wymaga elementu RCP
.
Aby zastosować zmiany, uruchom ponownie Raspberry Pi.
Tworzenie i wdrażanie oprogramowania RCP
OTBR obsługuje układ radiowy 15.4 w trybie współprocesora radiowego (RCP). W tym trybie stos OpenThread działa po stronie hosta i przesyła/odbiera ramki przez odbiornik IEEE802.15.4.
Wykonaj krok 4 z tworzenia sieci Thread przy użyciu tablic nRF52840 i ćwiczenia z programowania OpenThread, aby utworzyć i zainstalować urządzenie RCP nRF52840:
$ script/build nrf52840 USB_trans
Uruchom OTBR i sprawdź stan
Podłącz płytkę nRF52840 do Raspberry Pi i uruchom usługę otbr-agent
:
$ sudo service otbr-agent restart
Sprawdź, czy usługa otbr-agent
jest aktywna:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago Main PID: 2997 (otbr-agent) Tasks: 1 (limit: 4915) CGroup: /system.slice/otbr-agent.service └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0 Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started. Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId] Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down
3. Tworzenie sieci Thread
Do sterowania usługą otbr-agent
można użyć polecenia ot-ctl
. ot-ctl
akceptuje wszystkie polecenia interfejsu wiersza poleceń OpenThread. Więcej informacji znajdziesz w przewodniku po interfejsie wiersza poleceń OpenThread.
Tworzenie sieci Thread przy użyciu OTBR:
$ sudo ot-ctl dataset init new Done $ sudo ot-ctl dataset commit active Done $ sudo ot-ctl ifconfig up Done $ sudo ot-ctl thread start Done
Zaczekaj kilka sekund. Powinny być już widoczne OTBR działające jako leader
wątku, a w danych sieciowych Thread zawiera prefiks off-mesh-routable
(OMR):
$ sudo ot-ctl state leader Done $ sudo ot-ctl netdata show Prefixes: Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done $ sudo ot-ctl ipaddr fda8:5ce9:df1e:6620:0:ff:fe00:fc11 fda8:5ce9:df1e:6620:0:0:0:fc38 fda8:5ce9:df1e:6620:0:ff:fe00:fc10 fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 fda8:5ce9:df1e:6620:0:ff:fe00:fc00 fda8:5ce9:df1e:6620:0:ff:fe00:4000 fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d fe80:0:0:0:a6:301c:3e9f:2f5b Done
4. Skonfiguruj urządzenie końcowe klienta SRP
Tworzenie i flashowanie interfejsu OT CLI
Wykonaj krok 5 z instrukcji tworzenia sieci Thread przy użyciu tablic nRF52840 i ćwiczenia z programowania OpenThread, aby utworzyć i zainstalować urządzenie końcowe nRF52840 w interfejsie wiersza poleceń nRF52840.
Jednak zamiast włączonego interfejsu OT_COMMISSIONER
i OT_JOINER
węzeł interfejsu wiersza poleceń wymaga funkcji OT_SRP_CLIENT
i OT_ECDSA
.
Pełne wywołanie kompilacji powinno wyglądać tak:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Dołącz do sieci OTBR
Aby dołączyć do sieci Thread utworzonej przez usługę otbr-agent
, musimy pobrać aktywny zbiór danych operacyjnych z urządzenia OTBR. Wróćmy do wiersza poleceń otbr-agent
i pobierzmy aktywny zbiór danych:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Wróć do sesji na ekranie węzła klienta SRP i ustaw aktywny zbiór danych:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
Następnie uruchom interfejs Thread:
> ifconfig up Done > thread start Done
Zaczekaj kilka sekund i sprawdź, czy udało się dołączyć do sieci Thread:
> state child Done > netdata show Prefixes: fd76:a5d1:fcb0:1707::/64 paos med 4000 Routes: fd49:7770:7fc5:0::/64 s med 4000 Services: 44970 5d c000 s 4000 44970 01 9a04b000000e10 s 4000 Done > ipaddr fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 fda8:5ce9:df1e:6620:0:ff:fe00:4001 fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba fe80:0:0:0:d4a9:39a0:abce:b02e Done
Upewnij się, że dane sieciowe są zgodne z danymi wydrukowanymi na OTBR. Możemy teraz wysłać ping do adresu OMR OTBR:
> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9 Done > 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms
5. Publikowanie usługi na urządzeniu końcowym
mDNS jest powszechnie stosowany do publikowania usługi DNS-SD w linku lokalnym. Jednak wiadomości w trybie multicast wykorzystują zbyt dużą przepustowość i szybko wyczerpują baterię urządzeń o niskim zużyciu energii. Thread używa protokołu unicast SRP do zarejestrowania swoich usług w routerze Border Router i używa routera Border Router do rozgłaszania usług przez połączenie Wi-Fi lub Ethernet.
Możemy zarejestrować usługę za pomocą polecenia srp client
.
Otwórz sesję ekranu węzła klienta SRP i automatycznie uruchom klienta SRP:
> srp client autostart enable Done
Ustaw nazwę hosta, która będzie rozgłaszana przy użyciu połączenia Wi-Fi/Ethernet:
> srp client host name ot-host Done
Aby urządzenie korzystające z połączenia Wi-Fi/Ethernet miało dostęp do urządzenia końcowego Thread, musi być rozgłaszany adres OMR tego urządzenia:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
Na koniec zarejestruj fałszywą usługę _ipps._tcp
:
> srp client service add ot-service _ipps._tcp 12345 Done
Zaczekaj kilka sekund. Aplikacja powinna być zarejestrowana:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
Zakończyliśmy wszystkie prace konfiguracyjne i usługa _ipps._tcp
powinna być rozgłaszana przez połączenie Wi-Fi/Ethernet. Nadszedł czas na znalezienie urządzenia końcowego i dotarcie do niego.
6. Odkryj Usługę
Poznawanie usługi na telefonie komórkowym
Do wykrywania usług mDNS za pomocą telefonu z Androidem używamy aplikacji przeglądarki usług. Odpowiednią aplikację można też znaleźć na urządzenia mobilne z iOS. Otwórz aplikację. Powinna pojawić się usługa _ipps._tcp
.
Poznawanie usługi na hoście z systemem Linux
Jeśli chcesz wykryć usługę na innym hoście z Linuksem, możesz użyć polecenia avahi-browse
.
Zainstaluj avahi-daemon
i avahi-utils
:
$ sudo apt-get install -y avahi-daemon avahi-utils
Rozwiąż problem z usługą:
$ sudo service avahi-daemon start # Ensure the avahi daemon is started. $ avahi-browse -r _ipps._tcp + wlan0 IPv6 ot-service Secure Internet Printer local = wlan0 IPv6 ot-service Secure Internet Printer local hostname = [ot-host.local] address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927] port = [12345] txt = [] ...
Poznawanie usługi z hostem macOS
Aby rozwiązać problem, możesz użyć dns-sd
w systemie macOS:
$ dns-sd -Z _ipps._tcp local. Browsing for _ipps._tcp.local. DATE: ---Sun 14 Mar 2021--- 21:31:42.125 ...STARTING... ; To direct clients to browse a different domain, substitute that domain in place of '@' lb._dns-sd._udp PTR @ ; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names. ; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local ; names with the correct fully-qualified (unicast) domain name of the target host offering the service. _ipps._tcp PTR ot-service._ipps._tcp ot-service._ipps._tcp SRV 0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host ot-service._ipps._tcp TXT "" ...
7. Pingowanie urządzenia końcowego
Ping z telefonu komórkowego
Na przykładzie telefonu Pixel możemy znaleźć adres OMR zarejestrowanej wcześniej usługi „ot-service”. na stronie szczegółów instancji usługi w aplikacji przeglądarki usług.
Możemy teraz wysłać ping do adresu OMR z inną aplikacją Analizator sieci.
Wersja aplikacji Network Analyzer na Androida nie obsługuje zapytań mDNS w narzędziu ping i nie możemy wysłać pinga bezpośrednio do nazwy hosta ot-host.local
(możemy wysłać ping do nazwy hosta z wersją aplikacji na iOS).
Ping z hosta Linux/macOS
Router granic wątków wysyła reklamy routerów ICMPv6 (RA) w celu rozgłaszania prefiksów (za pomocą opcji informacji o prefiksie) i tras (za pomocą opcji informacji o trasie) w połączeniu Wi-Fi/Ethernet.
Przygotowywanie hosta z Linuksa
Ważne jest, aby upewnić się, że na hoście są włączone operacje RA i RIO:
- Wartość
net.ipv6.conf.wlan0.accept_ra
powinna wynosić co najmniej1
, jeśli przekierowanie adresu IP nie jest włączone, lub2
, jeśli nie jest włączone. - Wartość
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
nie może być mniejsza niż64
.
W większości dystrybucji accept_ra
jest domyślnie ustawiony na 1
. Mogą jednak istnieć inne demony sieciowe, które zastąpią tę opcję (np. dhcpcd
w Raspberry Pi zastąpi accept_ra
na 0
). Wartość accept_ra
możesz sprawdzić za pomocą:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
Ustaw wartość 1
(lub 2
, jeśli włączone jest przekierowanie IP) za pomocą:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1 Net.ipv6.conf.wlan0.accept_ra = 1
Domyślna opcja accept_ra_rt_info_max_plen
w większości dystrybucji Linuksa to 0
. Ustaw ją na 64
za pomocą tych ustawień:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64 net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Po ponownym uruchomieniu hosta zmiana zostanie utracona. Na przykład dołącz poniższe polecenia do /etc/sysctl.conf
, aby na stałe włączyć RIO:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
Może być już za późno na zmianę tych konfiguracji, ponieważ OTBR wysyła już wiadomości RA, a odstęp między 2 niechcianymi wiadomościami RA może wynosić kilkaset sekund. Jednym ze sposobów jest odłączenie się od punktu dostępu Wi-Fi i ponowne połączenie się z nim w celu wysyłania wiadomości dotyczących pozyskiwania routera, dzięki czemu OTBR będzie odpowiadać za pomocą zamówionych kont RA. Inną możliwością jest ponowne uruchomienie funkcji Border Routing na routerze Border Router:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
Jeśli próbujesz ponownie połączyć się z siecią Wi-Fi lub ponownie uruchomić interfejs Ethernet, upewnij się, że parametr dhcpcd nie jest używany do zarządzania siecią IPv6 Wi-Fi/Ethernet. Ponieważ parametr dhcpcd zawsze zastępuje opcję accept_ra
po każdym ponownym uruchomieniu interfejsu, co powoduje utratę konfiguracji accept_ra
. Dołącz poniższe wiersze do pliku konfiguracji dhcpcd (np. /etc/dhcpcd.conf
), aby jednoznacznie wyłączyć IPv6 w dhcpcd:
noipv6 noipv6rs
Aby zmiana zaczęła obowiązywać, musisz zrestartować urządzenie.
Przygotowywanie hosta macOS
Obie opcje accept_ra*
są domyślnie włączone, ale musisz uaktualnić system do wersji co najmniej macOS Big Sur.
Pingowanie nazwy hosta lub adresu IPv6
Możemy teraz wysłać ping do nazwy hosta ot-host.local
za pomocą polecenia ping -6
(ping6
w systemie macOS):
$ ping -6 ot-host.local. PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms ...
To polecenie może zakończyć się niepowodzeniem na hostach z systemem Linux z powodu błędu "Name or service not known"
. Dzieje się tak, ponieważ polecenie ping
nie rozpoznaje nazwy ot-host.local.
za pomocą zapytań mDNS. Otwórz plik /etc/nsswitch.conf
i dodaj mdns6_minimal
do wiersza, zaczynając od hosts
:
hosts: files mdns4_minimal mdns6_minimal dns
Oczywiście możesz też zawsze wysłać ping bezpośrednio do adresu IPv6:
$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms 64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms ...
8. Cofanie publikacji usługi na urządzeniu końcowym
Aby usunąć adres i usługę zarejestrowane w węźle klienta SRP:
> srp client host remove Done
Odkrywanie usługi _ipps._tcp
nie powinno być teraz możliwe.
9. Gratulacje
Gratulacje! Udało Ci się skonfigurować OTBR jako router granic wątków, który zapewnia dwukierunkową łączność IP i wykrywanie usług na urządzeniach końcowych Thread.
Co dalej?
Zapoznaj się z tymi ćwiczeniami z programowania...