Thread Border Router - Çift Yönlü IPv6 Bağlantısı ve DNS Tabanlı Hizmet Keşfi

1. Giriş

699d673d05a55535.png

Thread Border Router nedir?

Thread, cihazdan cihaza ve cihazdan buluta güvenli iletişim sağlayan IP tabanlı, düşük güçlü bir kablosuz ağ protokolüdür. İş parçacığı ağları, tek hata noktasından kaçınmak için topoloji değişikliklerine uyum sağlayabilir.

Bir Thread Border Router, bir Thread ağını Wi-Fi veya Ethernet gibi diğer IP tabanlı ağlara bağlar. Bir Thread ağı, diğer ağlara bağlanmak için bir Border Router gerektirir. Bir Thread Border Router, aşağıdaki işlevleri minimum düzeyde destekler:

  • Thread ve Wi-Fi/Ethernet ağları arasında çift yönlü IP bağlantısı.
  • Üzerinden iki yönlü servis keşif mDNS ve (Wi-Fi / Ethernet bağlantısı üzerine) SRP (Konu ağında).
  • İş parçacığı bölümlerini IP tabanlı bağlantılar üzerinden birleştiren iş parçacığı üzerinden altyapı.
  • Bir Thread cihazının kimliğini doğrulamak ve bir Thread ağına bağlamak için Harici Thread Devreye Alma (örneğin, bir cep telefonu).

OpenThread Sınır Yönlendirici Google tarafından yayımlanan (OTBR) Konu Sınır Yönlendirici bir açık kaynak uygulamasıdır.

ne inşa edeceksin

Bu kod laboratuvarında, bir Thread Border Router kuracaksınız ve cep telefonunuzu Border Router aracılığıyla bir Thread End Cihazına bağlayacaksınız.

ne öğreneceksin

  • OTBR nasıl kurulur
  • OTBR ile Thread ağı nasıl oluşturulur
  • SRP özelliğine sahip bir OpenThread CLI cihazı nasıl oluşturulur
  • SRP ile bir hizmet nasıl kaydedilir
  • Bir Thread uç cihazı nasıl keşfedilir ve ulaşılır.

Neye ihtiyacın olacak

  • Bir Raspberry Pi 3/4 cihazı ve en az 8 GB kapasiteli bir SD kart.
  • 2 Nordic Semiconductor nRF52840 dev panoları.
  • Olmayan bir Wi-Fi AP IPv6 Yönlendirici Bildirisi Guard yönlendirici etkinleştirilmiş.
  • En az iOS 14 yüklü bir iOS telefon veya en az Android 8.1 yüklü bir Android telefon.

2. OTBR'yi kurun

Raspberry Pi'yi kurun

Bir taze Ahududu Pi cihazı kurmak basittir rpi-imager yönergeleri izleyerek aracı raspberrypi.org , indir (yerine aracında son Ahududu Pi OS kullanan 2021/05/07-raspios-buster-armhf -Lite ) kendiniz. Bu kod laboratuvarındaki cep telefonu adımlarını tamamlamak için Raspberry Pi'yi bir Wi-Fi AP'ye bağlamanız gerekir. Takip Bu kablosuz bağlantı kurmak için rehber. Talimatları bulabilirsiniz, SSH ile Ahududu Pi için giriş uygundur burada .

OTBR kodunu al

Senin Ahududu Pi Girişi ve klon ot-br-posix GitHub:

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

OTBR'yi oluşturun ve yükleyin

OTBR, Thread Border Router'ı önyükleyen ve ayarlayan iki komut dosyasına sahiptir:

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

OTBR ile belirtilir (örneğin Wi-Fi / Ethernet) bir Konu arayüzü ve altyapı ağ arayüzü hem çalışır INFRA_IF_NAME . Konu arayüzü OTBR kendisi tarafından oluşturulur ve adlandırılır wpan0 varsayılan ve altyapı arayüzü varsayılan değere sahiptir wlan0 eğer INFRA_IF_NAME açıkça belirtilmemiştir. Senin Ahududu Pi Ethernet kablosu ile bağlıysa, (örneğin, Ethernet arayüzü adını belirtmek eth0 ):

$ INFRA_IF_NAME=eth0 ./script/setup

OTBR'nin başarıyla yüklenip yüklenmediğini kontrol edin:

$ 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)

Beklenmektedir otbr-agent bir gerektirdiği için hizmet, aktif değil RCP çalıştırmak için çip.

Değişikliklerin geçerli olması için Raspberry Pi'yi yeniden başlatın.

RCP bellenimini oluşturun ve flaşlayın

OTBR bir 15.4 radyo çipi destekleyen Radyo Eş İşlemci (BİP) modu. Bu modda, OpenThread yığını ana bilgisayar tarafında çalışır ve çerçeveleri IEEE802.15.4 alıcı-verici üzerinden iletir/alır.

Takip Bu codelab adımını 4 sürüme ve nRF52840 BİP cihazı yanıp. Sen ek bir seçenek ihtiyaç -DOT_THREAD_VERSION=1.2 build adım için:

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

OTBR'yi başlatın ve durumu doğrulayın

Senin Ahududu Pi nRF52840 kurulu bağlayın ve başlangıç otbr-agent hizmeti:

$ sudo service otbr-agent restart

Doğrulayın otbr-agent servisi aktif:

$ 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. Bir Thread ağı oluşturun

Bir yoktur ot-ctl kontrol etmek için kullanılabilir komut otbr-agent hizmeti. ot-ctl tüm OpenThread CLI komutları, bkz kabul OpenThread CLI Kılavuzu'na fazla ayrıntı için.

OTBR ile bir Thread ağı oluşturun:

$ 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

Birkaç saniye bekleyin, biz OTBR bir Konu olarak hareket ettiğini görmek gerekir leader ve bir orada off-mesh-routable Konu Ağ Veri içinde (OMR) öneki:

$ 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. Kurulum SRP İstemcisi Son Aygıtı

OT CLI oluşturun ve flaşlayın

Takip Bu codelab adımını 5 sürüme ve nRF52840 CLI uç cihazı yanıp. Ama bunun yerine sahip OT_COMMISSIONER ve OT_JOINER CLI düğüm gerektirir etkin OT_SRP_CLIENT ve OT_ECDSA özellikleri:

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

OTBR ağına katılın

Tarafından oluşturulan Konu ağa katılmak için otbr-agent servisi, biz OTBR cihazdan Aktif Operasyonel Veri Kümesi almak gerekir. En geri dönelim otbr-agent komut satırı ve aktif veri kümesi olsun:

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

SRP istemci düğüm ekranı oturumuna dönün ve etkin veri kümesini ayarlayın:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Ardından, Thread arayüzünü başlatın:

> ifconfig up
Done
> thread start
Done

Birkaç saniye bekleyin ve Thread ağına katılmanın başarılı olup olmadığını doğrulayın:

> 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

Ağ verilerinin OTBR'de yazdırılanla eşleştiğinden emin olun. Artık OTBR'nin OMR adresine ping atabiliriz:

> 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. Hizmeti Uç Cihazda Yayınlayın

mDNS, yerel bağlantıda DNS-SD hizmeti yayınlamak için yaygın olarak kullanılmaktadır. Ancak çok noktaya yayın mesajları çok fazla bant genişliği tüketir ve düşük güçlü cihazların pilini hızla tüketir. Konu tek noktaya kullanan SRP Sınır Router ile hizmetlerini kayıt protokolü ve Wi-Fi veya Ethernet bağlantısını hizmetlerinin reklamını Sınır Router dayanır.

Biz bir hizmeti kaydedebilirsiniz srp client komutu.

SRP istemci düğüm ekranı oturumuna gidin ve SRP istemcisini otomatik olarak başlatın:

> srp client autostart enable
Done

Wi-Fi/Ethernet bağlantısında tanıtılacak ana bilgisayar adını ayarlayın:

> srp client host name ot-host
Done

Wi-Fi/Ethernet bağlantısındaki bir cihazın Thread end cihazına ulaşması için, uç cihazın OMR adresinin bildirilmesi gerekir:

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

Sonunda, sahte kayıt _ipps._tcp hizmeti:

> srp client service add ot-service _ipps._tcp 12345
Done

Birkaç saniye bekleyin ve kayıtlı hizmeti görebilmemiz gerekir:

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

Biz tüm kurulum çalışmalarını tamamladılar ve _ipps._tcp servisi, Wi-Fi / Ethernet bağlantısını reklamı olması gerekirdi. Şimdi uç cihazı keşfetme ve ulaşma zamanı!

6. Hizmeti Keşfedin

Bir cep telefonu ile hizmeti keşfedin

54a136a8940897cc.png

Biz kullanmak Servis Tarayıcısı Android telefonla mDNS servisleri keşfetmek için App, bir eşdeğer App ayrıca iOS mobil cihazlar için bulunabilir. Uygulamasını açın ve servis _ipps._tcp sadece göstermek gerekir.

Bir Linux ana bilgisayarıyla hizmeti keşfedin

Başka bir Linux ana bilgisayardan hizmet keşfetmek istiyorsanız, kullanabileceğiniz avahi-browse komutu.

Yükleme avahi-daemon ve avahi-utils :

$ sudo apt-get install -y avahi-daemon avahi-utils

Hizmeti çözün:

$ 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 = []
...

Hizmeti bir macOS ana bilgisayarıyla keşfedin

Sen kullanabilirsiniz dns-sd hizmetin çözümlenmesinde MacOS tarih:

$ 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. Son Cihaza Ping Atın

Cep telefonundan ping atmak

Örnek olarak Pixel telefonunu ele alalım, Service Browser Uygulamasında hizmet örneğinin ayrıntılar sayfasında daha önce kayıtlı olan "ot-service" hizmetinin OMR adresini bulabiliriz.

bb992962e68d250b.png888daa1df1e1a9bf.png

Biz şimdi başka ile OMR adresine ping Network Analyzer App.

Ne yazık ki, Network Analyzer App Android sürümü ping yardımcı programı mDNS sorguları desteklemez ve biz hostname ping olamaz ot-host.local (biz App iOS sürümü ile hostname ping olabilir) doğrudan.

Bir Linux/macOS ana bilgisayarından ping işlemi

Thread Border Router, Wi-Fi/Ethernet bağlantısında öneklerin (Önek Bilgi Seçeneği aracılığıyla) ve rotaların (Rota Bilgi Seçeneği aracılığıyla) reklamını yapmak için ICMPv6 Yönlendirici Reklamlarını (RA) gönderir.

Linux ana bilgisayarı hazırlayın

Ana makinenizde RA ve RIO'nun etkinleştirildiğinden emin olmanız önemlidir:

  1. net.ipv6.conf.wlan0.accept_ra en az olmalıdır 1 ip yönlendirme etkin değilse, ve 2 aksi.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen daha küçük olmamalıdır 64 .

accept_ra varsayılan ayarı 1 çoğu dağılımlar için. Ama (örneğin bu seçeneği geçersiz kılacaktır diğer ağ cinleri olabilir dhcpcd Ahududu Pi üzerinde geçersiz kılar accept_ra için 0 ). Kontrol edebilirsiniz accept_ra ile değerini:

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

Ve değerini ayarlayın 1 (veya 2 ile etkindir durumda IP yönlendirme olarak):

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

accept_ra_rt_info_max_plen Çoğu Linux dağıtımlarında seçeneği varsayılan 0 olarak ayarlayın, 64 ile:

$ 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

Ana bilgisayar yeniden başlatıldıktan sonra değişiklik kaybolacak. Örneğin, için komutlar aşağıda ekleme /etc/sysctl.conf kalıcı RIO sağlar:

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

OTBR zaten RA mesajları gönderiyor olduğundan ve iki istenmeyen RA mesajı arasındaki aralık birkaç yüz saniye olabileceğinden, bu konfigürasyonları değiştirmek için çok geç olabilir. Bir yol, OTBR'nin istenen RA'larla yanıt vermesi için Yönlendirici Talep mesajları göndermek için Wi-Fi AP'nin bağlantısını kesip yeniden bağlamaktır. Diğer bir seçenek de Border Router'da Border Routing fonksiyonunu yeniden başlatmaktır:

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

Wi-Fi veya yeniden başlatma Ethernet arayüzü yeniden çalışıyorsanız, emin dhcpcd sizin WIFI / Ethernet IPv6 ağına yönetmek için kullanılmaz. Dhcpcd hep geçersiz kılar Çünkü accept_ra seçeneği her şey arayüzü yeniden başlatılır ve accept_ra yapılandırması kaybedilir. Ekleme dhcpcd yapılandırma dosyasına hatları (örneğin aşağıda /etc/dhcpcd.conf dhcpcd açıkça devre dışı IPv6'ya):

noipv6
noipv6rs

Değişikliğin yürürlüğe girmesi için yeniden başlatmanız gerekir.

macOS ana bilgisayarını hazırlayın

Hem accept_ra* seçenekler varsayılan olarak etkindir, ancak en azından MacOS Big Sur için sisteminizi yükseltmeniz gerekir.

Ana bilgisayar adını veya IPv6 adresini pingleyin

Şimdi ana bilgisayar adını ping olabilir ot-host.local komutu ile ping -6 ( ping6 MacOS için):

$ 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
...

Bu komut ile, Linux bilgisayarlar üzerinde başarısız olabilir "Name or service not known" hatası. Yani en yüzünden ping komutu çözme değil ot-host.local. mDNS sorguları ile isim. Açık /etc/nsswitch.conf ve eklenti mdns6_minimal hattına başlar hosts :

hosts:          files mdns4_minimal mdns6_minimal dns

Elbette, IPv6 adresine her zaman doğrudan ping atabilirsiniz:

$ 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. Cihazı Sonlandır Hizmeti Yayından Kaldırın

SRP istemci düğümünden kayıtlı adresi ve hizmeti kaldırmak için:

> srp client host remove
Done

Sen keşfetmek mümkün olmamalıdır _ipps._tcp hizmeti şimdi.

9. Tebrikler

Tebrikler, Thread uç cihazları için çift yönlü IP bağlantısı ve hizmet keşfi sağlamak üzere OTBR'yi Thread Border Router olarak başarıyla kurdunuz.

Sıradaki ne?

Bu kod laboratuvarlarından bazılarına göz atın...

Referans dokümanlar