1. Giriş
İ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
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.
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:
- IP yönlendirme etkin değilse
net.ipv6.conf.wlan0.accept_ra
en az1
, değilse2
olmalıdır. 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...