Thread Border Router - Thread 1.2 Multicast

1. معرفی

608c4c35050eb280.png

Thread چیست؟

Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از خرابی های تک نقطه ای جلوگیری کنند.

OpenThread چیست؟

OpenThread منتشر شده توسط Google یک پیاده سازی متن باز Thread® است.

روتر مرزی OpenThread چیست؟

روتر مرزی OpenThread (OTBR) منتشر شده توسط گوگل یک پیاده سازی متن باز از Thread Border Router است.

Thread 1.2 Multicast

Thread 1.2 مجموعه‌ای از ویژگی‌ها را برای پشتیبانی از چندپخشی در یک شبکه ناهمگن (بخش‌های شبکه و Wi-Fi/Ethernet) برای آدرس‌های چندپخشی با دامنه بزرگ‌تر از حوزه محلی تعریف می‌کند.

یک مسیریاب مرزی Thread 1.2 مجموعه داده مسیریاب ستون فقرات (BBR) خود را ثبت می کند، و سرویس BBR انتخاب شده، مسیریاب اصلی ستون فقرات (PBBR) است که مسئول ورود/خروج به جلو چندپخشی است.

یک دستگاه Thread 1.2 یک پیام CoAP برای ثبت آدرس چندپخشی به PBBR (ثبت شنونده چندپخشی، به اختصار MLR) می فرستد، اگر آدرس بزرگتر از محدوده محلی باشد. PBBR از MLDv2 در واسط خارجی خود برای برقراری ارتباط با شبکه گسترده IPv6 LAN/WAN در مورد گروه های چندپخشی IPv6 که نیاز به گوش دادن به آنها دارد، از طرف شبکه Thread محلی خود استفاده می کند. و PBBR فقط در صورتی ترافیک چندپخشی را به شبکه Thread ارسال می کند که مقصد حداقل توسط یک دستگاه Thread مشترک باشد.

برای Thread 1.2 Minimal End Devices، ممکن است برای جمع آوری آدرس چندپخشی و انجام MLR از طرف آنها به والدین خود وابسته باشند، یا اگر والد آنها Thread 1.1 باشد، خود را ثبت کنند.

برای جزئیات بیشتر، لطفاً به Thread 1.2 Specification بخش 5.24 Multicast Forwarding برای بزرگتر از Realm-Local Scope مراجعه کنید.

آنچه خواهید ساخت

در این کد لبه، شما می‌خواهید یک Thread Border Router و دو دستگاه Thread راه‌اندازی کنید، سپس ویژگی‌های Multicast را در دستگاه‌های Thread و دستگاه‌های Wi-Fi فعال و تأیید کنید.

آنچه خواهید آموخت

  • نحوه ساخت سیستم عامل nRF52840 با ویژگی های Thread 1.2 Multicast.
  • نحوه اشتراک در آدرس های چندپخشی IPv6 در دستگاه های Thread.

آنچه شما نیاز خواهید داشت

  • یک دستگاه Raspberry Pi 3/4 و یک کارت SD با حداقل ظرفیت 8 گیگابایت.
  • 3 برد Nordic Semiconductor nRF52840 DK .
  • یک AP Wi-Fi بدون محافظ تبلیغات روتر IPv6 روی روتر فعال شده است.
  • لپ تاپ Linux/macOS (Raspberry Pi نیز کار می کند) با نصب Python3.

2. OTBR را راه اندازی کنید

برای راه‌اندازی Thread Border Router - دوطرفه IPv6 Connectivity و Code Discovery سرویس مبتنی بر DNS را دنبال کنید تا یک Thread Border Router در Raspberry Pi راه‌اندازی کنید.

پس از تکمیل، Raspberry Pi باید یک شبکه Thread فعال ایجاد کرده و به یک شبکه Wi-Fi متصل شود.

OTBR باید در عرض چند ثانیه به روتر اصلی ستون فقرات تبدیل شود.

$ sudo ot-ctl bbr state
Primary
Done
$ sudo ot-ctl bbr
BBR Primary:
server16: 0xD800
seqno:    23
delay:    1200 secs
timeout:  3600 secs
Done

3. دستگاه های Thread را بسازید و فلش کنید

برنامه Thread 1.2 CLI را با Multicast بسازید و دو برد nRF52840 DK را فلش کنید.

سیستم عامل nRF52840 DK را بسازید

دستورالعمل ها را برای شبیه سازی پروژه و ساخت سیستم عامل nRF52840 دنبال کنید.

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx/
$ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2
$ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex

ما می توانیم سیستم عامل HEX را که با موفقیت ساخته شده است در ot-cli-ftd.hex پیدا کنیم.

سیستم عامل فلش nRF52840 DK

با استفاده از nrfjprog که بخشی از nRF Command Line Tools است، سیستم عامل را روی nRF52840 DK فلش کنید.

$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset

4. دستگاه های Thread را به شبکه Thread وصل کنید

OTBR در مراحل قبلی یک شبکه Thread ایجاد کرده است. اکنون می توانیم DK های nRF52840 را به شبکه Thread اضافه کنیم:

مجموعه داده فعال خام را از OTBR دریافت کنید:

$ sudo ot-ctl dataset active -x
0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff

اتصال به برد nRF52840 DK:

$ screen /dev/ttyACM0 115200

مجموعه داده فعال را برای nRF52840 DK پیکربندی کنید:

> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
Done

پشته Thread را راه اندازی کنید و چند ثانیه صبر کنید و بررسی کنید که دستگاه با موفقیت وصل شده است:

> ifconfig up
Done
> thread start
Done
> state
child

مراحل بالا را تکرار کنید تا برد دیگر nRF52840 DK را به شبکه Thread متصل کنید.

ما اکنون شبکه Thread را با 3 دستگاه Thread راه اندازی کرده ایم: OTBR و دو برد nRF52840 DK.

5. شبکه Wi-Fi را راه اندازی کنید

شبکه Wi-Fi را روی OTBR و لپ تاپ تنظیم کنید تا به همان AP وای فای متصل شوند.

ما می توانیم از raspi-config برای تنظیم SSID وای فای و عبارت عبور در Raspberry Pi OTBR استفاده کنیم.

توپولوژی شبکه نهایی در زیر نشان داده شده است:

5d0f36fd69ebcc9a.png

6. در آدرس چندپخشی IPv6 مشترک شوید

مشترک شدن در ff05::abcd در nRF52840 End Device 1:

> ipmaddr add ff05::abcd
Done

تأیید کنید ff05::abcd با موفقیت مشترک شد:

> ipmaddr
ff33:40:fdde:ad00:beef:0:0:1
ff32:40:fdde:ad00:beef:0:0:1
ff05:0:0:0:0:0:0:abcd            <--- ff05::abcd subscribed
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

اشتراک در ff05::abcd در لپ تاپ:

ما به یک اسکریپت پایتون subscribe6.py برای اشتراک در یک آدرس چندپخشی در لپ تاپ نیاز داریم.

کد زیر را کپی کرده و به عنوان subscribe6.py ذخیره کنید:

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.')

subscribe6.py برای اشتراک ff05::abcd در رابط شبکه Wi-Fi (مثلا wlan0) اجرا کنید:

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

توپولوژی نهایی شبکه با اشتراک های چندپخشی در زیر نشان داده شده است:

b118448c98b2d583.png

اکنون که آدرس IPv6 چندپخشی را در هر دو دستگاه پایانی nRF52840 در شبکه Thread و لپ‌تاپ در شبکه Wi-Fi مشترک کرده‌ایم، می‌خواهیم دسترسی چندپخشی IPv6 دو طرفه را در بخش‌های زیر بررسی کنیم.

7. Inbound IPv6 Multicast را تأیید کنید

اکنون باید بتوانیم به nRF52840 End Device 1 در شبکه Thread و لپ تاپ با استفاده از آدرس چندپخشی IPv6 ff05::abcd از شبکه Wi-Fi دسترسی پیدا کنیم.

پینگ ff05::abcd در OTBR از طریق رابط Wi-Fi:

$ 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 می‌تواند دو پاسخ پینگ را هم از دستگاه nRF52840 End Device 1 و هم از لپ‌تاپ دریافت کند، زیرا هر دو در ff05::abcd مشترک شده‌اند. این نشان می دهد که OTBR می تواند بسته های چندپخشی درخواست پینگ IPv6 را از شبکه Wi-Fi به شبکه Thread ارسال کند.

8. Outbound IPv6 Multicast را تأیید کنید

پینگ ff05::abcd در nRF52840 End Device 2:

> 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 End Device 2 می تواند پاسخ های پینگ را از nRF52840 End Device 1 و Laptop دریافت کند. این نشان می دهد که OTBR می تواند بسته های چندپخشی IPv6 Ping Reply را از شبکه Thread به شبکه Wi-Fi ارسال کند.

9. تبریک می گویم

تبریک می‌گوییم، شما با موفقیت یک Thread Border Router را راه‌اندازی کردید و IPv6 چندپخشی دوطرفه را تأیید کردید!

برای اطلاعات بیشتر در مورد OpenThread، به openthread.io مراجعه کنید.

اسناد مرجع: