Google is committed to advancing racial equity for Black communities. See how.

İş Parçacığı Sınır Yönlendiricisi - Çift Yönlü IPv6 Bağlantısı ve DNS Tabanlı Hizmet Keşfi

699d673d05a55535.png

İş Parçacığı Sınır Yönlendiricisi 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 İş Parçacığı Sınır Yönlendiricisi, bir İş Parçacığı 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 Sınır Yönlendiricisi gerektirir. Bir İş Parçacığı Sınır Yönlendiricisi, 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ı.
  • MDNS (Wi-Fi / Ethernet bağlantısında) ve SRP (İş Parçacığı ağında) aracılığıyla çift yönlü hizmet keşfi.
  • IP tabanlı bağlantılar üzerinden iş parçacığı bölümlerini birleştiren altyapı üzerinden iş parçacığı.
  • Bir Thread cihazını doğrulamak ve bir Thread ağına katılmak için Harici İş Parçacığı Devreye Alma (örneğin, bir cep telefonu).

Google tarafından yayınlanan OpenThread Border Router (OTBR), Thread Border Router'ın açık kaynaklı bir uygulamasıdır.

Ne inşa edeceksin

Bu kod laboratuarında, bir İplik Sınır Yönlendiricisi kuracak ve cep telefonunuzu Sınır Yönlendiricisi aracılığıyla bir İplik Sonlandırma Cihazına bağlayacaksınız.

Ne öğreneceksin

  • OTBR nasıl kurulur
  • OTBR ile iş parçacığı 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 ona ulaşılır.

Neye ihtiyacın olacak

Raspberry Pi'yi Kurun

Bir taze Ahududu Pi cihazı kurmak basittir rpi-imager yönergeleri izleyerek aracı raspberrypi.org (indirme yerine aracında son Ahududu Pi OS kullanan raspbian-2020/02/14 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. Kablosuz bağlantıyı kurmak için bu kılavuzu izleyin. Raspberry Pi'ye SSH ile giriş yapmak uygundur, talimatları burada bulabilirsiniz.

OTBR kodunu alın

Raspberry Pi'nize giriş yapın ve GitHub'dan ot-br-posix klonlayın:

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

OTBR'yi oluşturun ve yükleyin

OTBR, İş Parçacığı Sınır Yönlendiricisini önyükleyen ve kuran iki komut dosyasına sahiptir:

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

OTBR hem bir İş Parçacığı arayüzünde hem de INFRA_IF_NAME ile belirtilen altyapı ağı arayüzünde (örn. Wi-Fi / Ethernet) INFRA_IF_NAME . Thread arayüzü OTBR'nin kendisi tarafından oluşturulur ve varsayılan olarak wpan0 adlandırılır ve INFRA_IF_NAME açıkça belirtilmezse altyapı arayüzü varsayılan wlan0 değerine sahiptir. Raspberry Pi'niz bir Ethernet kablosuyla bağlıysa, Ethernet arayüz adını belirtin (örn. eth0 ):

$ INFRA_IF_NAME=eth0 ./script/setup

OTBR'nin başarıyla kurulup kurulmadığını 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)

otbr-agent hizmetinin, çalışması için bir RCP yongası gerektirdiğinden aktif olmaması beklenmektedir.

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

RCP bellenimini oluşturun ve flaşlayın

OTBR, Radyo Eş İşlemci (RCP) modunda 15,4 radyo çipini destekler. Bu modda, OpenThread yığını ana bilgisayar tarafında çalışır ve çerçeveleri IEEE802.15.4 alıcı-vericisi üzerinden iletir / alır.

Bir nRF52840 RCP cihazı oluşturmak ve flaş etmek için bu kod laboratuarının 4. adımını izleyin. Derleme adımı için ek bir seçeneğe ihtiyacınız var -DOT_THREAD_VERSION=1.2 :

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

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

NRF52840 kartını Raspberry Pi'nize bağlayın ve otbr otbr-agent hizmetini başlatın:

$ sudo service otbr-agent restart

otbr-agent hizmetinin etkin olduğunu doğrulayın:

$ 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

otbr-agent servisini kontrol etmek için kullanılabilecek bir ot-ctl komutu vardır. ot-ctl , tüm OpenThread CLI komutlarını kabul eder, daha fazla ayrıntı için bkz. OpenThread CLI Kılavuzu .

OTBR ile bir İş Parçacığı 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, OTBR'nin bir İş Parçacığı leader olarak hareket ettiğini ve İş Parçacığı Ağ Verisinde off-mesh-routable (OMR) bir önek olduğunu görebilmeliyiz:

$ 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

OT CLI oluşturma ve flaş etme

Bir nRF52840 CLI uç cihazı oluşturmak ve flaş etmek için bu kod laboratuarının 5. adımını izleyin. Ancak OT_COMMISSIONER ve OT_JOINER etkinleştirilmesi yerine, CLI düğümü OT_SRP_CLIENT ve OT_ECDSA özelliklerini gerektirir:

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

OTBR ağına katılın

otbr-agent hizmeti tarafından oluşturulan Thread ağına katılmak için OTBR cihazından Aktif Operasyonel Veri Kümesini almamız gerekiyor. otbr-agent komut satırına geri dönelim ve aktif veri setini alalım:

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

SRP istemci düğüm ekranı oturumuna geri dönün ve aktif 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ı kontrol edin:

> 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

mDNS, bağlantı-yerelde DNS-SD hizmetini 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 için pili hızla tüketir. Thread, hizmetlerini Border Router'a kaydetmek için unicast SRP protokolünü kullanır ve servislerin Wi-Fi veya Ethernet bağlantısı üzerinden reklamını yapmak için Border Router'a güvenir.

srp client komutu ile bir servisi kaydedebiliriz.

SRP istemcisi 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 reklamı yapılacak ana bilgisayar adını ayarlayın:

> srp client host name ot-host
Done

Wi-Fi / Ethernet bağlantısı üzerindeki bir cihazın bir İş Parçacığı uç cihazına ulaşması için son cihazın OMR adresinin bildirilmesi gerekir:

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

Sonunda, sahte bir _ipps._tcp hizmeti _ipps._tcp :

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

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

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

Tüm kurulum çalışmalarını tamamladık ve _ipps._tcp hizmetinin Wi-Fi / Ethernet bağlantısında ilan edilmiş olması gerekirdi. Şimdi son cihazı keşfetme ve ulaşma zamanı!

Hizmeti bir cep telefonuyla keşfedin

54a136a8940897cc.png

Android telefon ile mDNS hizmetlerini keşfetmek için Service Browser Uygulamasını kullanıyoruz, iOS mobil cihazlar için eşdeğer bir Uygulama da bulunabilir. Uygulamayı açın ve _ipps._tcp hizmeti _ipps._tcp .

Hizmeti bir Linux ana bilgisayarla keşfedin

Hizmeti başka bir Linux sunucusundan keşfetmek istiyorsanız, avahi-browse komutunu kullanabilirsiniz.

avahi-daemon ve avahi-utils avahi-daemon kurun:

$ 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

Hizmeti çözmek için macOS'ta dns-sd sd'yi kullanabilirsiniz:

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

Cep telefonundan ping atma

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

bb992962e68d250b.png888daa1df1e1a9bf.png

Artık OMR adresine başka bir Network Analyzer Uygulaması ile ping atabiliriz.

Ne yazık ki, Network Analyzer Uygulamasının Android sürümü, ping yardımcı programı için mDNS sorgularını desteklemiyor ve ot-host.local ana bilgisayar adını doğrudan ot-host.local (uygulamanın iOS sürümüyle ana bilgisayar adına ping atabiliriz).

Linux / macOS ana bilgisayarından ping gönderme

İş Parçacığı Sınır Yönlendiricisi, Wi-Fi / Ethernet bağlantısındaki ön ekleri (Önek Bilgi Seçeneği aracılığıyla) ve yolları (Yol Bilgileri Seçeneği aracılığıyla) duyurmak için ICMPv6 Yönlendirici Bildirimleri (RA) gönderir.

Linux ana bilgisayarını hazırlayın

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

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

accept_ra çoğu dağıtım için varsayılan olarak 1 . Ancak bu seçeneği geçersiz kılacak başka ağ arka plan programları olabilir (örneğin, Raspberry dhcpcd , accept_ra 0 geçersiz kılar). accept_ra değerini şununla kontrol edebilirsiniz:

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

Ve değeri 1 (veya IP iletiminin etkinleştirilmesi durumunda 2 ) ayarlayın:

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

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

$ 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, /etc/sysctl.conf kalıcı olarak etkinleştirmek için /etc/sysctl.conf aşağıdaki komutları ekleyin:

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

Bu yapılandırmaları değiştirmek için çok geç olabilir çünkü OTBR halihazırda RA mesajları göndermektedir ve iki istenmeyen RA mesajı arasındaki aralık birkaç yüz saniye olabilir. Bunun bir yolu, OTBR'nin istenen RA'larla yanıt vermesi için Yönlendirici Talep mesajlarını göndermek için Wi-Fi AP'nin bağlantısını kesmek ve yeniden bağlanmaktır. Diğer bir seçenek de Sınır Yönlendiricisinde Sınır Yönlendirme işlevini yeniden başlatmaktır:

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

Wi-Fi'ye yeniden bağlanmaya veya Ethernet arayüzünü yeniden başlatmaya çalışıyorsanız, dhcpcd'nin WiFi- / Ethernet IPv6 ağınızı yönetmek için kullanılmadığından emin olun. Dhcpcd, arabirim her yeniden başlatıldığında her zaman accept_ra seçeneğini geçersiz kılar ve accept_ra yapılandırmanız kaybolur. Dhcpcd'de IPv6'yı açıkça devre dışı bırakmak için dhcpcd yapılandırma dosyasına (ör. /etc/dhcpcd.conf ) aşağıdaki satırları ekleyin:

noipv6
noipv6rs

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

MacOS ana bilgisayarını hazırlayın

Her ikisi de accept_ra* seçeneği varsayılan olarak etkindir, ancak sisteminizi en azından macOS Big Sur'a yükseltmeniz gerekir.

Ana bilgisayar adını veya IPv6 adresini pingleyin

Artık ot-host.local ana bilgisayar adına ping -6 komutuyla ping -6 ot-host.local (macOS için ping6 ):

$ 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, Linux ana bilgisayarlarında "Name or service not known" hatasıyla başarısız olabilir. Bunun nedeni, ping komutunun ot-host.local. mDNS sorguları ile isim. /etc/nsswitch.conf açın ve hosts başlayan satıra mdns6_minimal ekleyin:

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

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.

Tebrikler, iş parçacığı uçlu cihazlar için çift yönlü IP bağlantısı ve hizmet keşfi sağlamak için OTBR'yi bir İş Parçacığı Sınır Yönlendiricisi olarak başarıyla kurdunuz.

Sıradaki ne?

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

Referans dokümanlar