۱. مقدمه

نخ چیست؟
ترد (Thread) یک پروتکل شبکه مش بیسیم کممصرف مبتنی بر IP است که ارتباطات امن دستگاه به دستگاه و دستگاه به ابر را امکانپذیر میکند. شبکههای ترد میتوانند با تغییرات توپولوژی سازگار شوند تا از خرابیهای تک نقطهای جلوگیری کنند.
اوپنترید چیست؟
OpenThread که توسط گوگل منتشر شده است، یک پیادهسازی متنباز از Thread® است.
روتر مرزی OpenThread چیست؟
روتر مرزی OpenThread (OTBR) که توسط گوگل منتشر شده است، یک پیادهسازی متنباز از روتر مرزی Thread است.
IPv6 چندپخشی
Thread مجموعهای از ویژگیها را برای پشتیبانی از چندپخشی در یک شبکه ناهمگن (بخشهای Thread و شبکه Wi-Fi/Ethernet) برای آدرسهای چندپخشی با دامنه بزرگتر از قلمرو محلی تعریف میکند.
یک روتر Thread Border مجموعه داده روتر Backbone (BBR) خود را ثبت میکند و سرویس BBR انتخاب شده، روتر Backbone اصلی (PBBR) است که مسئول ارسال/دریافت multicast است.
یک دستگاه Thread یک پیام CoAP برای ثبت آدرس چندپخشی به PBBR (ثبت شنونده چندپخشی، به اختصار MLR) ارسال میکند اگر آدرس بزرگتر از محدوده محلی باشد. PBBR از MLDv2 در رابط خارجی خود برای ارتباط با LAN/WAN گستردهتر IPv6 در مورد گروههای چندپخشی IPv6 که باید به آنها گوش دهد، به نمایندگی از شبکه Thread محلی خود استفاده میکند. و PBBR فقط در صورتی ترافیک چندپخشی را به شبکه Thread ارسال میکند که مقصد توسط حداقل یک دستگاه Thread مشترک شده باشد.
برای دستگاههای انتهایی با حداقل نخ (Thread Minimal End Devices)، ممکن است برای تجمیع آدرس چندپخشی و انجام MLR از طرف آنها به والد خود وابسته باشند، یا اگر والد آنها از نخ ۱.۱ باشد، خودشان ثبت نام کنند.
برای جزئیات بیشتر، لطفاً به مشخصات نخ مراجعه کنید.
آنچه خواهید ساخت
در این آزمایشگاه کد، شما یک روتر Thread Border و دو دستگاه Thread راهاندازی خواهید کرد، سپس ویژگیهای Multicast را در دستگاههای Thread و دستگاههای Wi-Fi فعال و تأیید خواهید کرد.
آنچه یاد خواهید گرفت
- نحوه ساخت میانافزار nRF52840 با پشتیبانی از IPv6 Multicast.
- نحوه اشتراک در آدرسهای چندپخشی IPv6 در دستگاههای Thread.
آنچه نیاز دارید
- یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن RCP Thread، رابط خط فرمان OpenThread و آزمایش IPv6 multicast.
- یک رزبری پای برای روتر مرزی Thread.
- دو دانگل USB از شرکت Nordic Semiconductor به شماره nRF52840 (یکی برای RCP و دو تا برای دستگاههای Thread-end).
۲. راهاندازی OTBR
سریعترین راه برای راهاندازی OTBR، دنبال کردن راهنمای راهاندازی OTBR است.
پس از اتمام راهاندازی OTBR، ot-ctl برای تأیید اینکه OTBR در عرض چند ثانیه به روتر اصلی Backbone تبدیل شده است، استفاده کنید.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
۳. ساخت و فلش کردن دستگاههای Thread
برنامه Thread CLI را با Multicast بسازید و دو برد nRF52840 DK را فلش کنید.
ساخت سیستم عامل nRF52840 DK
دستورالعملها را برای کلون کردن پروژه و ساخت میانافزار nRF52840 دنبال کنید.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
با ساخت یک شبکه Thread با بردهای nRF52840 و OpenThread codelab همانطور که نوشته شده است ادامه دهید. پس از اینکه دستگاه نهایی با تصویر CLI فلش شد، گره دوم را به شبکه Thread متصل کنید تا دستگاه Thread به شبکه Thread اضافه شود. این کار را برای دستگاه نهایی Thread دوم تکرار کنید.
۴. در آدرس چندپخشی IPv6 مشترک شوید
مشترک شدن در ff05::abcd در nRF52840 دستگاه انتهایی ۱:
> ipmaddr add ff05::abcd Done
تأیید کنید که ff05::abcd با موفقیت مشترک شده است:
> 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
در لپتاپ در 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.')
برای ff05::abcd در رابط شبکه وایفای (مثلاً wlan0)، subscribe6.py اجرا کنید:
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
توپولوژی نهایی شبکه با اشتراکهای چندپخشی در زیر نشان داده شده است:

اکنون که آدرس چندپخشی IPv6 را هم در دستگاه انتهایی nRF52840 1 در شبکه Thread و هم در لپتاپ در شبکه Wi-Fi مشترک شدهایم، در بخشهای بعدی قصد داریم قابلیت دسترسی چندپخشی IPv6 دو جهته را تأیید کنیم.
۵. تأیید ورودی IPv6 Multicast
اکنون، ما باید بتوانیم از طریق شبکه وایفای به هر دو دستگاه انتهایی nRF52840 در شبکه Thread و لپتاپ با استفاده از آدرس چندپخشی IPv6 ff05::abcd دسترسی پیدا کنیم.
از طریق رابط وایفای، ff05::abcd را روی OTBR پینگ کنید:
$ 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 و لپتاپ دریافت کند، زیرا هر دو در ff05::abcd مشترک شدهاند. این نشان میدهد که OTBR میتواند بستههای چندپخشی درخواست پینگ IPv6 را از شبکه Wi-Fi به شبکه Thread ارسال کند.
۶. تأیید خروجی IPv6 Multicast
پینگ ff05::abcd روی nRF52840 دستگاه انتهایی ۲:
> 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 2 میتواند پاسخهای پینگ را هم از دستگاه انتهایی nRF52840 1 و هم از لپتاپ دریافت کند. این نشان میدهد که OTBR میتواند بستههای چندپخشی IPv6 Ping Reply را از شبکه Thread به شبکه Wi-Fi ارسال کند.
۷. تبریک
تبریک میگویم، شما با موفقیت یک روتر Thread Border راهاندازی کردید و IPv6 multicast دو جهته را تأیید کردید!
برای اطلاعات بیشتر در مورد OpenThread، به openthread.io مراجعه کنید.
اسناد مرجع: