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

Bu codelab hakkında
schedule22 dakika
subjectSon güncelleme 23 Mayıs 2025
account_circleYazan: Kangping Dong, Jonathan Hui

1. Giriş

699d673d05a55535.png

Thread nedir?

Thread, cihazlar arası ve cihazdan buluta güvenli iletişim sağlayan IP tabanlı, düşük güç tüketimine sahip bir kablosuz örgülü ağ protokolüdür. Konu ağları, tek noktadan arızaları önlemek için topoloji değişikliklerine uyum sağlayabilir.

OpenThread nedir?

Google tarafından yayınlanan OpenThread, Thread®'in açık kaynaklı bir uygulamasıdır.

Thread sınır yönlendirici nedir?

Thread Sınır Yönlendirici, bir Thread ağını kablosuz veya Ethernet gibi IP tabanlı diğer ağlara bağlar. Thread ağının diğer ağlara bağlanması için bir sınır yönlendirici gerekir. Thread sınır yönlendiricisi en azından aşağıdaki işlevleri destekler:

  • Thread ile kablosuz/Ethernet ağları arasında iki yönlü IP bağlantısı.
  • mDNS (Kablosuz/Ethernet bağlantısında) ve SRP (Thread ağında) üzerinden iki yönlü hizmet keşfi.
  • IP tabanlı bağlantılar üzerinden Thread bölümlerini birleştiren altyapı üzerinden Thread.
  • Bir Thread cihazının kimliğini doğrulamak ve Thread ağına katılmak için harici Thread kurulumu (ör. cep telefonu).

Google tarafından yayınlanan OpenThread Sınır Yönlendiricisi (OTBR), Thread Sınır Yönlendiricisi'nin açık kaynaklı bir uygulamasıdır.

Ne oluşturacaksınız?

Bu codelab'de, bir Thread sınır yönlendiricisi kuracak ve cep telefonunuzu sınır yönlendirici üzerinden bir Thread son cihazına bağlayacaksınız.

Neler öğreneceksiniz?

  • OTBR'yi ayarlama
  • OTBR ile mesaj dizisi ağı oluşturma
  • SRP özelliğine sahip bir OpenThread CLI cihazı oluşturma
  • Bir hizmeti SRP'ye kaydetme
  • Thread son cihazını bulma ve bu cihaza ulaşma

İhtiyacınız olanlar

  • Thread RCP, OpenThread CLI'yi derlemek ve flaşlamak ve IPv6 çoklu yayınını test etmek için bir Linux iş istasyonu.
  • Thread sınır yönlendirici için bir Raspberry Pi.
  • 2 Nordic Semiconductor nRF52840 USB Dongle (biri RCP, diğeri Thread uç cihaz için).
  • En az iOS 14 yüklü bir iOS telefonu veya en az Android 8.1 yüklü bir Android telefonu

2. OTBR'yi ayarlama

OTBR oluşturmanın en hızlı yolu OTBR Kurulum Kılavuzu'nu izlemektir.

OTBR kurulumu tamamlandıktan sonra, OTBR'nin bir Konu leader olarak davrandığını doğrulamak için ot-ctl öğesini kullanın.

$ sudo ot-ctl state
leader
Done

Ayrıca OTBR'nin, Mesaj Ağı Verileri'nde otomatik olarak bir off-mesh-routable (OMR) ön ekiyle yapılandırdığını doğrulayın.

$ 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

3. SRP istemci son cihazını ayarlama

OT CLI'yi derleme ve flaş etme

nRF52840 CLI uç cihazı oluşturmak ve flaşlamak için nRF52840 kartları ve OpenThread ile Thread ağı oluşturma codelab'inin 5. adımını uygulayın.

Ancak CLI düğümünde OT_COMMISSIONER ve OT_JOINER yerine OT_SRP_CLIENT ve OT_ECDSA özellikleri etkin olmalıdır.

Dolayısıyla, derleme çağrısının tamamı şu şekilde görünür:

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

Thread ağına katılma

Thread ağına katılmak için OTBR cihazından Etkin Operasyonel Veri Kümesi'ni almamız gerekir. ot-ctl'e geri dönüp etkin veri kümesini alalım:

$ 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ı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 basılanla eşleştiğinden emin olun. Artık OTBR'nin OMR adresine 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

4. Hizmeti son cihazda yayınlama

mDNS, bağlantı yerelinde DNS-SD hizmeti yayınlamak için yaygın olarak kullanılmıştır. Ancak çoklu yayın mesajları çok fazla bant genişliği tüketir ve düşük güç tüketimi olan cihazların pilini hızla tüketir. Thread, hizmetlerini Sınır Yönlendirici'ye kaydetmek için tekil yayın SRP protokolünü kullanır ve hizmetlerinin kablosuz ağ veya Ethernet bağlantısında reklamını yapmak için Sınır Yönlendirici'ye güvenir.

srp client komutuyla bir hizmeti kaydedebiliriz.

SRP istemci 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. Bu süre zarfında hizmetin kaydedildiğini görebilirsiniz:

> 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 ve _ipps._tcp hizmetinin kablosuz ağ/Ethernet bağlantısında reklamı yapılmış olmalıdır. Son cihazı bulup ona ulaşmanın zamanı geldi.

5. Hizmeti keşfetme

Hizmeti cep telefonuyla keşfetme

54a136a8940897cc.png

Android telefonda mDNS hizmetlerini keşfetmek için Hizmet Tarayıcı uygulamasını kullanırız. iOS mobil cihazlar için de eşdeğer bir uygulama bulunabilir. Uygulamayı açın. _ipps._tcp hizmeti gösterilir.

Linux ana makineyle hizmeti keşfetme

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

avahi-daemon ve avahi-utils'ü yükleyin:

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

Hizmeti çözümleme:

$ 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 makineyle hizmeti keşfetme

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

6. Son cihaza ping gönderme

Cep telefonundan ping gönderme

Pixel telefonu örnek alalım. Daha önce kayıtlı olan "ot-service" hizmetinin OMR adresini, Hizmet Tarayıcısı uygulamasındaki hizmet örneğinin ayrıntılar sayfasında bulabilirsiniz.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Artık OMR adresine başka bir Network Analyzer uygulamasıyla ping gönderebiliriz.

Maalesef Ağ Analizi uygulamasının Android sürümü, ping yardımcı programı için mDNS sorgularını desteklemez ve ot-host.local ana makine adını doğrudan pingleyemeyiz (Uygulamanın iOS sürümüyle ana makine adını pingleyebiliriz).

Linux/macOS ana makinesinden ping gönderme

Thread Sınır Yönlendiricisi, ön eklerin (Ön Ek Bilgisi Seçeneği aracılığıyla) ve Wi-Fi/Ethernet bağlantısındaki rotaların (Rota Bilgisi Seçeneği aracılığıyla) reklamını yapmak için ICMPv6 Yönlendirici Reklamları (RA) gönderir.

Linux ana makinesini hazırlama

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

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

accept_ra, çoğu dağıtımda varsayılan olarak 1 olarak ayarlanır. Ancak bu seçeneği geçersiz kılan başka ağ daemon'ları da olabilir (örneğin, Raspberry Pi'deki dhcpcd, accept_ra değerini 0 olarak geçersiz kılar). accept_ra değerini şu şekilde kontrol edebilirsiniz:

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

Ardından, değeri 1 (veya IP yönlendirme 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ında accept_ra_rt_info_max_plen seçeneği varsayılan olarak 0 olarak ayarlanmıştır. Aşağıdaki adımları uygulayarak 64 olarak 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 makine yeniden başlatıldıktan sonra değişiklik kaybolur. Örneğin, RIO'yu kalıcı olarak etkinleştirmek için aşağıdaki komutları /etc/sysctl.conf dosyasına ekleyin:

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

OTBR zaten RA mesajları gönderdiği ve iki istenmeyen RA mesajı arasındaki aralık birkaç yüz saniye olabileceği için bu yapılandırmaları değiştirmek için çok geç olabilir. Bir yöntem, OTBR'nin istenen RA'larla yanıt vermesi için Yönlendirici İsteği mesajları göndermek üzere kablosuz AP'nin bağlantısını kesip yeniden bağlamaktır. Başka bir seçenek de Sınır Yönlendiricisi'ndeki Sınır Yönlendirme işlevini yeniden başlatmaktır:

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

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

noipv6
noipv6rs

Değişikliğin geçerli olması için cihazı yeniden başlatmanız gerekir.

macOS ana makinesini hazırlama

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

Ana makine adını veya IPv6 adresini pingleme

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

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

hosts:          files mdns4_minimal mdns6_minimal dns

Elbette dilediğiniz zaman IPv6 adresini doğrudan 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
...

7. Cihazı sonlandırın 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

Şu anda _ipps._tcp hizmetini bulmanız mümkün değildir.

8. Tebrikler

Tebrikler. OTBR'yi, Thread uç cihazları için iki yönlü IP bağlantısı ve hizmet keşfi sağlamak üzere Thread sınır yönlendirici olarak başarıyla oluşturdunuz.

Sırada ne var?

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

Referans dokümanları