1. Giriş
Thread nedir?
Thread, cihazdan cihaza ve cihazdan buluta güvenli iletişimi sağlayan, IP tabanlı düşük güçte kablosuz mesh ağ protokolüdür. Thread ağları, tek nokta hatalarını ö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, Thread ağını kablosuz veya Ethernet gibi diğer IP tabanlı ağlara bağlar. Thread ağının diğer ağlara bağlanması için sınır yönlendirici gerekir. Thread sınır yönlendirici en azından aşağıdaki işlevleri destekler:
- Thread ve kablosuz ağ/Ethernet ağları arasında çift yönlü IP bağlantısı.
- mDNS (Kablosuz/Ethernet bağlantısında) ve SRP (Thread ağında) üzerinden çift yönlü hizmet keşfi.
- Thread bölümlerini IP tabanlı bağlantılar üzerinden birleştiren, altyapı üzerinden Thread.
- Bir Thread cihazının kimliğini doğrulamak ve Thread ağına katmak için harici Thread devreye alma aracı (örneğin, cep telefonu)
Google tarafından yayınlanan OpenThread Border Router (OTBR), Thread Border Router'ın açık kaynaklı bir uygulamasıdır.
Ne oluşturacaksınız?
Bu codelab'de bir Thread sınır yönlendirici kuracak ve mobil telefonunuzu sınır yönlendirici aracılığıyla bir Thread uç cihazına bağlayacaksınız.
Neler öğreneceksiniz?
- OTBR'yi ayarlama
- OTBR ile Thread ağı oluşturma
- SRP özelliğiyle OpenThread CLI cihazı oluşturma
- SRP'ye hizmet kaydetme
- Thread uç cihazlarını keşfetme ve bunlara ulaşma
İhtiyacınız olanlar
- Thread RCP, OpenThread CLI oluşturma ve yanıp sönme ve IPv6 çoklu yayını test etme için Linux iş istasyonu.
- Thread sınır yönlendirici için Raspberry Pi.
- 2 Nordic Semiconductor nRF52840 USB Dongle (bir tanesi RCP, bir tanesi de Thread uç cihazı için).
- En az iOS 14 yüklü bir iOS telefon veya en az Android 8.1 yüklü bir Android telefon
2. OTBR'yi ayarlama
OTBR'yi ayarlamanın en hızlı yolu OTBR Kurulum Kılavuzu'nu takip etmektir.
OTBR kurulumu tamamlandıktan sonra, OTBR'nin Thread leader
olarak çalıştığını doğrulamak için ot-ctl
kullanın.
$ sudo ot-ctl state leader Done
Ayrıca OTBR'nin, Thread Ağı Verileri'nde otomatik olarak bir off-mesh-routable
(OMR) öneki 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 İstemci Uç Cihazını Kurma
OT CLI'yı derleme ve flash'leme
nRF52840 CLI uç cihazı oluşturmak ve flashlamak için nRF52840 kartları ve OpenThread ile Thread ağı oluşturma adlı codelab'in5. adımını uygulayın.
Ancak CLI düğümü, OT_COMMISSIONER
ve OT_JOINER
özelliklerinin etkinleştirilmesi yerine OT_SRP_CLIENT
ve OT_ECDSA
özelliklerini gerektirir.
Bu nedenle, derleme çağrısının tamamı şu şekilde görünmelidir:
$ 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 Active Operational Dataset'i almamız gerekir. ot-ctl
'ya 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 yazılı olanla 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ılmaktadır. Ancak çoklu yayın mesajları çok fazla bant genişliği tüketir ve düşük güçteki cihazların pilini hızlıca bitirir. Thread, hizmetlerini Border Router'a kaydetmek için tek noktaya yayın SRP protokolünü kullanır ve hizmetleri kablosuz ağ veya Ethernet bağlantısında yayınlamak için Border Router'a güvenir.
Bir hizmeti srp client
komutuyla 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ı üzerinden bir Thread uç cihazına ulaşmak için uç cihazın OMR adresinin duyurulması 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. Kayıtlı hizmeti görebilirsiniz:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
Tüm kurulum çalışmaları tamamlandı ve _ipps._tcp
hizmetinin Wi-Fi/Ethernet bağlantısında reklamı yapılmış olmalıdır. Artık son cihaza ulaşma ve onu keşfetme zamanı!
5. Hizmeti Keşfetme
Hizmeti cep telefonuyla keşfetme
Android telefonda mDNS hizmetlerini keşfetmek için Service Browser uygulamasını kullanırız. iOS mobil cihazlar için de eşdeğer bir uygulama bulabilirsiniz. Uygulamayı açtığınızda hizmet _ipps._tcp
gösterilir.
Linux ana makinesiyle hizmeti keşfetme
Hizmeti başka bir Linux ana makinesinden 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
Hizmeti çözüme ulaştırı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 = [] ...
macOS ana makinesiyle 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
Örneğin, Pixel telefonu ele alalım. Daha önce kaydedilmiş "ot-service" hizmetinin OMR adresini, Hizmet Tarayıcı Uygulamasındaki hizmet örneğinin ayrıntılar sayfasında bulabiliriz.
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ı desteklemiyor ve ana makine adına ot-host.local
doğrudan ping atamıyoruz (Uygulamanın iOS sürümüyle ana makine adına ping atabiliriz).
Linux/macOS ana makinesinden ping gönderme
Thread Border Router, Wi-Fi/Ethernet bağlantısında öneklerin (Önek Bilgisi Seçeneği aracılığıyla) ve rotaların (Rota Bilgisi Seçeneği aracılığıyla) reklamını yapmak için ICMPv6 Router Advertisements (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:
- IP yönlendirme etkin değilse
net.ipv6.conf.wlan0.accept_ra
en az1
, aksi takdirde2
olmalıdır. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
,64
değerinden küçük olmamalıdır.
accept_ra
, çoğu dağıtım için varsayılan olarak 1
olarak ayarlanır. Ancak bu seçeneği geçersiz kılacak başka ağ daemon'ları olabilir (örneğin, Raspberry Pi'deki dhcpcd
, accept_ra
değerini 0
olarak geçersiz kılar). accept_ra
değerini şu komutla kontrol edebilirsiniz:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
Aşağıdaki komutla 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
'dir. Aşağıdaki komutla 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
Değişiklik, ana makine yeniden başlatıldıktan sonra 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, RA mesajları göndermeye başladığı 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 talebi mesajları göndermek üzere kablosuz ağ erişim noktasıyla bağlantıyı kesip yeniden bağlamaktır. Diğer bir seçenek de sınır yönlendiricide 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 dhcpcd'nin kablosuz/Ethernet IPv6 ağınızı yönetmek için 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 kaybolur. 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ınızı yeniden başlatmanız gerekir.
macOS ana makinesini hazırlama
Her iki accept_ra*
seçenek de varsayılan olarak etkindir ancak sisteminizi en az macOS Big Sur'a yükseltmeniz gerekir.
Ana makine adını veya IPv6 adresini ping'leyin.
Artık ot-host.local
ana makine adına ping -6
komutuyla ping gönderebiliriz (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 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 çözümlememesidir. /etc/nsswitch.conf
dosyasını açın ve hosts
ile başlayan satıra mdns6_minimal
ifadesini ekleyin:
hosts: files mdns4_minimal mdns6_minimal dns
Elbette, IPv6 adresine doğrudan ping de gönderebilirsiniz:
$ 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. Hizmetin Cihazda Yayınını Kaldırma
SRP istemci düğümünden kayıtlı adresi ve hizmeti kaldırmak için:
> srp client host remove Done
Artık _ipps._tcp
hizmetini keşfedememeniz gerekir.
8. Tebrikler
Tebrikler. Thread uç cihazları için çift yönlü IP bağlantısı ve hizmet keşfi sağlamak üzere OTBR'yi Thread sınır yönlendirici olarak başarıyla ayarladınız.
Sırada ne var?
Aşağıdaki codelab'lere göz atın: