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.
OpenThread Sınır Yönlendiricisi nedir?
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.
IPv6 Çoklu Yayın
Thread, alan yerelinden daha geniş kapsama sahip çoklu yayın adresleri için karma bir ağda (Thread ve kablosuz/Ethernet ağı segmentleri) çoklu yayını destekleyen bir dizi özellik tanımlar.
Konu sınır yönlendiricisi, ana hat yönlendiricisi (BBR) veri kümesini kaydeder ve seçilen BBR hizmeti, çoklu yayın gelen/giden yönlendirme işleminden sorumlu olan birincil ana hat yönlendiricisidir (PBBR).
Adres, yerel alan adından daha büyükse bir Thread cihazı, çoklu yayın adresini PBBR'ye (Çoklu Yayın Dinleyicisi Kaydı, kısaca MLR) kaydetmek için bir CoAP mesajı gönderir. PBBR, yerel Thread ağı adına dinlenmesi gereken IPv6 çoklu yayın grupları hakkında daha geniş IPv6 LAN/WAN ile iletişim kurmak için harici arayüzünde MLDv2'yi kullanır. PBBR, çoklu yayın trafiğini yalnızca hedefe en az bir Thread cihazı abone olduysa Thread ağına yönlendirir.
Thread Minimal Son Cihazlar, çoklu yayın adresini toplamak ve kendileri adına MLR yapmak için üst cihazlarına güvenebilir veya üst cihazları Thread 1.1 ise kendilerini kaydedebilir.
Daha fazla bilgi için lütfen Sekme Spesifikasyonu'na bakın.
Ne oluşturacaksınız?
Bu codelab'de bir Thread sınır yönlendirici ve iki Thread cihaz kuracak, ardından Thread cihazlarda ve kablosuz cihazlarda çoklu yayın özelliklerini etkinleştirip doğrulayacaksınız.
Öğrenecekleriniz
- IPv6 çoklu yayın desteğine sahip nRF52840 donanım yazılımı oluşturma.
- Thread cihazlarda IPv6 çoklu yayın adreslerine abone olma
İ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 için, ikisi de Thread uç cihazları için).
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 saniyeler içinde birincil ana hat yönlendiricisi olduğunu doğrulamak için ot-ctl
'i kullanın.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. Thread cihazları oluşturma ve flaşlama
Thread CLI uygulamasını çoklu yayınla derleyin ve iki nRF52840 DK kartını flaşlayın.
nRF52840 DK donanım yazılımını derleme
Projeyi klonlama ve nRF52840 donanım yazılımını derleme talimatlarını uygulayın.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
nRF52840 kartları ve OpenThread codelab ile Thread ağı oluşturma başlıklı makaleyi, yazıldığı şekilde uygulayın. Son cihaza CLI resmi yüklendikten sonra Thread cihazını Thread ağına eklemek için İkinci düğümü Thread ağına katılma bölümünü uygulayın. İkinci Thread uç cihaz için de aynı işlemi tekrarlayın.
4. IPv6 çoklu yayın adresine abone olma
nRF52840 uç cihaz 1'de ff05::abcd adresine abone olma:
> ipmaddr add ff05::abcd Done
ff05::abcd
'ün başarıyla abone olduğunu doğrulayın:
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff02:0:0:0:0:0:0:2 ff03:0:0:0:0:0:0:2 ff02:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:fc Done
Dizüstü bilgisayarda ff05::abcd adresine abone olma:
Dizüstü bilgisayarda çoklu yayın adresine abone olmak için bir Python komut dosyasına subscribe6.py
ihtiyacımız var.
Aşağıdaki kodu kopyalayıp subscribe6.py
olarak kaydedin:
import ctypes
import ctypes.util
import socket
import struct
import sys
libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')
Kablosuz ağ arayüzünde (ör. wlan0) ff05::abcd
abone olmak için subscribe6.py
'yi çalıştırın:
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
Çoklu yayın abonelikleri içeren nihai ağ topolojisi aşağıda gösterilmiştir:
Hem Thread ağındaki nRF52840 son cihaz 1'e hem de kablosuz ağındaki dizüstü bilgisayara IPv6 çoklu yayın adresini abone ettik. Artık aşağıdaki bölümlerde iki yönlü IPv6 çoklu yayın erişilebilirliğini doğrulayacağız.
5. Gelen IPv6 Çoklu Yayınını Doğrulama
Artık hem Thread ağındaki nRF52840 Son Cihaz 1'e hem de kablosuz ağdaki IPv6 çoklu yayın adresini ff05::abcd
kullanarak dizüstü bilgisayara ulaşabiliriz.
Kablosuz arayüz üzerinden OTBR'de ff05::abcd adresine ping gönderme:
$ ping -6 -b -t 5 -I wlan0 ff05::abcd PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
OTBR'nin, her ikisi de ff05::abcd
'ye abone olduğu için hem nRF52840 Son Cihaz 1'den hem de dizüstü bilgisayardan iki ping yanıtı alabileceğini görüyoruz. Bu, OTBR'nin IPv6 Ping İsteği çoklu yayın paketlerini kablosuz ağdan Thread ağına iletebileceğini gösterir.
6. Giden IPv6 Çoklu Yayınını Doğrulama
nRF52840 uç cihaz 2'de ff05::abcd adresine ping gönderme:
> ping ff05::abcd 100 10 1 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms
nRF52840 Son Cihaz 2, hem nRF52840 Son Cihaz 1'den hem de Dizüstü Bilgisayar'dan ping yanıtları alabilir. Bu, OTBR'nin IPv6 Ping Yanıtı çoklu yayın paketlerini Thread ağından kablosuz ağa iletebileceğini gösterir.
7. Tebrikler
Tebrikler, Thread sınır yönlendiriciyi başarıyla oluşturdunuz ve iki yönlü IPv6 çoklu yayını doğruladınız.
OpenThread hakkında daha fazla bilgi için openthread.io adresini ziyaret edin.
Referans dokümanları: