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

1. Giriş

699d673d05a55535.png

İple Sınır Yönlendirici nedir?

Thread, cihazlar arası ve cihazlar arası güvenli iletişim olanağı sağlayan IP tabanlı düşük güçlü kablosuz örgü ağ protokolüdür. Mesaj dizisi ağları, tek bir hata noktasından kaçınmak için topolojideki değişikliklere uyum sağlayabilir.

İş parçacığı sınırı yönlendiricisi, bir iş parçacığını kablosuz ağ veya Ethernet gibi diğer IP tabanlı ağlara bağlar. Mesaj dizisi ağı, diğer ağlara bağlanmak için bir Sınır Yönlendirici gerektirir. İş parçacığı sınırı yönlendiricisi, aşağıdaki işlevleri minimum düzeyde destekler:

  • Thread ve kablosuz/Ethernet ağları arasında iki yönlü IP bağlantısı.
  • mDNS (Kablosuz/Ethernet bağlantısında) ve SRP (Thread ileti dizisinde) üzerinden çift yönlü hizmet keşfi.
  • Thread bölümlerini IP tabanlı bağlantılar üzerinde birleştiren Thread-over-frastructure.
  • Bir İleti Dizisi cihazının kimliğini doğrulamak ve bir İleti Dizisi ağına eklemek için Harici İleti Dizisi Oluşturma (örneğin, bir cep telefonu).

Google tarafından yayınlanan OpenThread Sınır Yönlendirici (OTBR), İleti Dizisi Sınır Yönlendiricisinin açık kaynak uygulamasıdır.

Geliştirme

Bu codelab'de bir İplik Sınır Yönlendirici'yi kuracak ve cep telefonunuzu Sınır Yönlendirici üzerinden bir Mesaj Dizisi Son Cihazı'na bağlayacaksınız.

Neler öğreneceksiniz?

  • OTBR kurulumu
  • OTBR ile bir Thread ağı oluşturma
  • SRP özelliğiyle OpenThread CLI cihazı oluşturma
  • Bir hizmeti SRP'ye kaydettirme
  • Thread son cihazı bulma ve cihaza erişme

Gerekenler

  • Raspberry Pi 3/4 cihazı ve en az 8 GB kapasitesi olan bir SD kart.
  • 2 Nordic Semiconputor nRF52840 geliştirici kartı.
  • Yönlendiricide IPv6 Yönlendirici Reklam Koruyucu'nun etkinleştirilmemiş olduğu bir kablosuz erişim noktası.
  • En az iOS 14 yüklü bir iOS telefon veya en az Android 8.1 yüklü Android telefon.

2. OTBR Kurulumu

Ahududu Pi'si ayarlayın

raspberrypi.org adresindeki talimatları uygulayarak rpi-imager aracıyla yeni bir Raspberry Pi cihazı kolayca ayarlayabilirsiniz (araçta en son Raspberry Pi OS'i kullanmak yerine, kendiniz 2021-05-07-raspios-buster-armhf-lite indirin.) Bu codelab'deki cep telefonu adımlarını tamamlamak için Raspberry Pi'yi kablosuz ağ AP'sine bağlamanız gerekiyor. Kablosuz bağlantıyı kurmak için bu kılavuzu uygulayın. SSH ile Raspberry Pi'ye giriş yapmak oldukça kolaydır. Talimatları burada bulabilirsiniz.

OTBR kodunu alın

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

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

OTBR'yi derleme ve yükleme

OTBR, İplik Sınırı Yönlendiricisini önyüklemek ve kurmak için iki komut dosyasına sahiptir:

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

OTBR, INFRA_IF_NAME ile belirtilen bir Thread arayüzü ve altyapı ağ arayüzü (ör. Kablosuz/Ethernet) üzerinde çalışır. Mesaj dizisi arayüzü, OTBR tarafından oluşturulur ve varsayılan olarak wpan0 olarak adlandırılır. INFRA_IF_NAME açıkça belirtilmediğinde altyapı arayüzü varsayılan olarak wlan0 değerine sahiptir. Raspberry Pi'niz bir Ethernet kablosuyla bağlıysa Ethernet arayüz adını (ör. eth0) belirtin:

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

Çalışması için RCP çipi gerektiğinden otbr-agent hizmetinin etkin olmaması beklenir.

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

RCP donanım yazılımı oluşturma ve tetikleme

OTBR, Radyo Ortak İşlemci (RCP) modunda 15,4 radyo çipini destekler. Bu modda OpenThread yığını, ana makine tarafında çalışır ve IEEE802.15.4 alıcı-verici üzerinden kareleri aktarır/alır.

nRF52840 RCP cihazı oluşturmak ve tetiklemek için nRF52840 panolar ve OpenThread ile bilgi dizisi oluşturma 4. adımı uygulayın:

$ script/build nrf52840 USB_trans

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

nRF52840 panosunu Raspberry Pi'nize bağlayıp 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

3. Mesaj dizisi ağı oluşturma

otbr-agent hizmetini 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 OpenThread CLI Kılavuzu'na bakın.

OTBR ile bir Mesaj Dizisi 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 İleti Dizisi leader işlevi gördüğünü ve Thread Ağ Verilerinde off-mesh-routable (OMR) önekinin olduğunu görelim:

$ 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. SRP istemcisi son cihazını kur

OT KSA'yı oluşturup yanıp sönme

nRF52840 CLI son cihazı oluşturmak ve tetiklemek için nRF52840 panolar ve OpenThread ile bir Thread ağı oluşturma başlıklı makalenin 5. adımını uygulayın.

Ancak CLI düğümünde OT_COMMISSIONER ve OT_JOINER öğelerinin etkinleştirilmiş olması yerine OT_SRP_CLIENT ve OT_ECDSA özellikleri gerekir.

Dolayısıyla, tam derleme çağrısı aşağıdaki gibi görünmelidir:

$ 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 Etkin Operasyonel Veri Kümesini almamız gerekiyor. otbr-agent komut satırına geri dönelim ve etkin veri kümesini alalım:

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

SRP istemcisi 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ılma işleminin 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. OTBR'nin OMR adresine artık ping gönderebiliriz:

> 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. Son Cihazda Hizmet Yayınlama

mDNS, link-local'da DNS-SD hizmetini yayınlamak için yaygın olarak kullanılır. Ancak çoklu yayın mesajları çok fazla bant genişliği kullanır ve düşük güçteki cihazlarda pili hızlı bir şekilde tüketir. Thread, hizmetlerini Sınır Yönlendirici'ye kaydetmek için tek renkli SRP protokolünü kullanır ve kablosuz veya Ethernet bağlantısında hizmetlerin reklamını yapmak için Sınır Yönlendirici'yi kullanır.

Bir hizmeti srp client komutuyla kaydedebiliriz.

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

> srp client autostart enable
Done

Kablosuz/Ethernet bağlantısında reklamı yapılacak ana makine adını ayarlayın:

> srp client host name ot-host
Done

Kablosuz/Ethernet bağlantısındaki bir cihazın Thread son cihazına ulaşması için son cihazın OMR adresinin reklamının yapılması gerekir:

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

Son olarak, sahte bir _ipps._tcp hizmeti kaydedin:

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

Birkaç saniye bekleyin. Kaydedilen hizmeti görmemiz için:

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

Tüm kurulum işlemlerini tamamladık. _ipps._tcp hizmetinin kablosuz/Ethernet bağlantısında reklamı yapılmış olmalıydı. Artık son cihazı keşfedip cihaza ulaşma zamanı geldi.

6. Hizmeti Keşfedin

Hizmeti bir cep telefonuyla keşfetme

54a136a8940897cc.png

Android telefonla mDNS hizmetlerini keşfetmek için Hizmet Tarayıcısı uygulamasını kullanırız. iOS mobil cihazlarda da eşdeğer Uygulama bulunabilir. Uygulamayı açtığınızda _ipps._tcp hizmeti görünecektir.

Bir Linux ana makinesiyle hizmeti keşfetme

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

avahi-daemon ve avahi-utils uygulamalarını yükleyin:

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

Hizmet sorununu çözme:

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

MacOS ana makinesiyle hizmeti keşfetme

Hizmeti çözmek için macOS'te dns-sd 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     ""
...

7. Son cihaza ping gönderin

Cep telefonundan ping yapma

Örneğin, Pixel telefonu, daha önce kaydedilmiş "ot-service" hizmetinin OMR adresini Hizmet Tarayıcısı uygulamasındaki hizmet örneğinin ayrıntılar sayfasında bulabiliriz.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Artık OMR adresini başka bir Network Analiz Aracı uygulamasıyla pingleyebiliriz.

Ne yazık ki, Network Analyzer Uygulamasının Android sürümü ping yardımcı programı için mDNS sorgularını desteklemez. Ayrıca, ana makine adına ot-host.local doğrudan ping atamayız (Uygulamanın iOS sürümüyle ana makine adına ping gönderebiliriz).

Linux/macOS barındırıcısından ping gönderme

Mesaj Dizisi Sınır Yönlendiricisi, kablosuz/Ethernet bağlantısında ön eklerin (Önek Bilgi Seçeneği ile) ve rotaların (Rota Bilgisi Seçeneği üzerinden) reklamını yapmak için ICMPv6 Yönlendirici Reklamlarını (RA) gönderir.

Linux ana makinesini hazırlama

RA ve RIO'nun barındırıcınızda etkinleştirildiğinden emin olmanız önemlidir:

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

Çoğu dağıtımda accept_ra varsayılan olarak 1 değerine ayarlanır. Ancak bu seçeneği geçersiz kılacak başka ağ arka plan programları olabilir (örneğin, Raspberry Pi'deki dhcpcd parametresi 0 ile accept_ra değerlerini geçersiz kılar). accept_ra değerini şunlarla kontrol edebilirsiniz:

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

Ayrıca, değeri aşağıdaki gibi 1 (veya IP yönlendirmesi etkinse 2) olarak 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ındaki accept_ra_rt_info_max_plen seçeneği varsayılan olarak 0 değerine sahiptir ve aşağıdaki değerleri 64 olarak ayarlar:

$ 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 makine yeniden başlatıldıktan sonra değişiklik kaybolur. Örneğin, RIO'yu kalıcı olarak etkinleştirmek için /etc/sysctl.conf komutlarına aşağıdaki komutları ekleyin:

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

OTBR zaten RA mesajları gönderdiği için bu yapılandırmaları değiştirmek için çok geç olabilir ve istenmeyen iki RA mesajı arasındaki aralık birkaç saniye olabilir. OTBR'nin istenen RA'larla yanıt verebilmesi için Yönlendirici Talep mesajları göndermek üzere kablosuz AP'nin bağlantısını kesip tekrar bağlamak gerekir. Diğer bir seçenek de Sınır Yönlendirici işlevindeki Sınır Yönlendirme işlevini yeniden başlatmaktır:

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

Kablosuz ağı yeniden bağlamaya veya Ethernet arayüzünü yeniden başlatmaya çalışıyorsanız Kablosuz/Ethernet IPv6 ağınızı yönetmek için dhcpcd'in kullanılmadığından emin olun. çünkü dhcpcd, arayüz her yeniden başlatıldığında 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 geçerli olması için cihazı yeniden başlatmanız gerekir.

macOS ana makinesi hazırlama

Her iki accept_ra* seçenek de varsayılan olarak etkindir, ancak sisteminizi en azından macOS Big Sur sürümüne yükseltmeniz gerekir.

Ana makine adını veya IPv6 adresini pingleme

Artık ana makine adını ot-host.local pinglemek için ping -6 (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, "Name or service not known" hatasını içeren Linux ana makinelerinde başarısız olabilir. Bunun nedeni, ping komutunun ot-host.local. adını mDNS sorgularıyla çözmemesidir. /etc/nsswitch.conf öğesini açıp hosts ile başlayan satıra mdns6_minimal ifadesini ekleyin:

hosts:          files mdns4_minimal mdns6_minimal dns

Elbette dilediğiniz zaman doğrudan IPv6 adresini pingleyebilirsiniz:

$ 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. Son Cihaz Hizmeti Yayından Kaldırma

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

> srp client host remove
Done

Şu anda _ipps._tcp hizmetini keşfedemezsiniz .

9. Tebrikler

Tebrikler, OTBR'yi Thread uç cihazları için çift yönlü IP bağlantısı ve hizmet keşfi sağlamak amacıyla Thread Bsınır Yönlendirici olarak başarıyla ayarladınız.

Sırada ne var?

Bu codelab'lerden bazılarına göz atın...

Referans dokümanlar