1. Giriş
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
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.
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:
- 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ı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...