1. مقدمه
Thread چیست؟
Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از خرابی های تک نقطه ای جلوگیری کنند.
OpenThread چیست؟
OpenThread منتشر شده توسط Google یک پیاده سازی متن باز Thread® است.
روتر مرزی OpenThread چیست؟
روتر مرزی OpenThread (OTBR) منتشر شده توسط گوگل یک پیاده سازی متن باز از Thread Border Router است.
IPv6 چندپخشی
Thread مجموعهای از ویژگیها را برای پشتیبانی از چندپخشی در یک شبکه ناهمگن (بخشهای شبکه و Wi-Fi/Ethernet) برای آدرسهای چندپخشی با دامنه بزرگتر از حوزه محلی تعریف میکند.
یک مسیریاب مرزی رشته دادههای مسیریاب ستون فقرات (BBR) خود را ثبت میکند، و سرویس BBR انتخاب شده، مسیریاب اصلی ستون فقرات (PBBR) است که مسئول ورود/خروج به جلو چندپخشی است.
یک دستگاه Thread یک پیام CoAP برای ثبت آدرس چندپخشی به PBBR (ثبت شنونده چندپخشی، به اختصار MLR) می فرستد، اگر آدرس بزرگتر از قلمرو محلی باشد. PBBR از MLDv2 در واسط خارجی خود برای برقراری ارتباط با شبکه گسترده IPv6 LAN/WAN در مورد گروه های چندپخشی IPv6 که نیاز به گوش دادن به آنها دارد، از طرف شبکه Thread محلی خود استفاده می کند. و PBBR فقط در صورتی ترافیک چندپخشی را به شبکه Thread ارسال می کند که مقصد حداقل توسط یک دستگاه Thread مشترک باشد.
برای دستگاههای Thread Minimal End، ممکن است برای جمعآوری آدرس چندپخشی و انجام MLR از طرف آنها به والدین خود وابسته باشند، یا اگر والدین آنها Thread 1.1 هستند، خودشان را ثبت کنند.
برای جزئیات بیشتر، لطفاً به مشخصات موضوع مراجعه کنید.
آنچه خواهید ساخت
در این کد لبه، شما میخواهید یک Thread Border Router و دو دستگاه Thread راهاندازی کنید، سپس ویژگیهای Multicast را در دستگاههای Thread و دستگاههای Wi-Fi فعال و تأیید کنید.
آنچه خواهید آموخت
- نحوه ساخت سیستم عامل nRF52840 با پشتیبانی از IPv6 Multicast.
- نحوه اشتراک در آدرس های چندپخشی IPv6 در دستگاه های Thread.
آنچه شما نیاز خواهید داشت
- یک ایستگاه کاری لینوکس، برای ساختن و فلش کردن Thread RCP، OpenThread CLI و آزمایش چندپخشی IPv6.
- Raspberry Pi برای روتر مرزی Thread.
- 2 دانگل USB نیمه هادی Nordic nRF52840 (یکی برای RCP و دو عدد برای دستگاه های انتهایی Thread).
2. OTBR را راه اندازی کنید
سریعترین راه برای راه اندازی OTBR استفاده از Docker به دنبال OTBR با Docker Guide است.
پس از تکمیل راهاندازی OTBR، ot-ctl
استفاده کنید تا تأیید کنید که OTBR ظرف چند ثانیه به روتر اصلی ستون فقرات تبدیل شده است.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. دستگاه های Thread را بسازید و فلش کنید
برنامه Thread CLI را با Multicast بسازید و دو برد nRF52840 DK را فلش کنید.
سیستم عامل nRF52840 DK را بسازید
دستورالعمل ها را برای شبیه سازی پروژه و ساخت سیستم عامل nRF52840 دنبال کنید.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
همانطور که نوشته شده است ، شبکه Build a Thread را با بردهای nRF52840 و کد OpenThread ادامه دهید. پس از اینکه دستگاه انتهایی با تصویر CLI فلش شد، Join node دوم به شبکه Thread را دنبال کنید تا دستگاه Thread به شبکه Thread اضافه شود. این کار را برای دومین دستگاه پایان Thread تکرار کنید.
4. در آدرس چندپخشی IPv6 مشترک شوید
مشترک شدن در ff05::abcd در nRF52840 End Device 1:
> 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.')
subscribe6.py
برای اشتراک ff05::abcd
در رابط شبکه Wi-Fi (مثلا wlan0) اجرا کنید:
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
توپولوژی نهایی شبکه با اشتراک های چندپخشی در زیر نشان داده شده است:
اکنون که آدرس IPv6 چندپخشی را در هر دو دستگاه پایانی nRF52840 در شبکه Thread و لپتاپ در شبکه Wi-Fi مشترک کردهایم، میخواهیم دسترسی چندپخشی IPv6 دو طرفه را در بخشهای زیر بررسی کنیم.
5. 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 ارسال کند.
6. 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 ارسال کند.
7. تبریک می گویم
تبریک میگوییم، شما با موفقیت یک Thread Border Router را راهاندازی کردید و IPv6 چندپخشی دوطرفه را تأیید کردید!
برای اطلاعات بیشتر در مورد OpenThread، به openthread.io مراجعه کنید.
اسناد مرجع:
1. مقدمه
Thread چیست؟
Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از خرابی های تک نقطه ای جلوگیری کنند.
OpenThread چیست؟
OpenThread منتشر شده توسط Google یک پیاده سازی متن باز Thread® است.
روتر مرزی OpenThread چیست؟
روتر مرزی OpenThread (OTBR) منتشر شده توسط گوگل یک پیاده سازی متن باز از Thread Border Router است.
IPv6 چندپخشی
Thread مجموعهای از ویژگیها را برای پشتیبانی از چندپخشی در یک شبکه ناهمگن (بخشهای شبکه و Wi-Fi/Ethernet) برای آدرسهای چندپخشی با دامنه بزرگتر از حوزه محلی تعریف میکند.
یک مسیریاب مرزی رشته دادههای مسیریاب ستون فقرات (BBR) خود را ثبت میکند، و سرویس BBR انتخاب شده، مسیریاب اصلی ستون فقرات (PBBR) است که مسئول ورود/خروج به جلو چندپخشی است.
یک دستگاه Thread یک پیام CoAP برای ثبت آدرس چندپخشی به PBBR (ثبت شنونده چندپخشی، به اختصار MLR) می فرستد، اگر آدرس بزرگتر از قلمرو محلی باشد. PBBR از MLDv2 در واسط خارجی خود برای برقراری ارتباط با شبکه گسترده IPv6 LAN/WAN در مورد گروه های چندپخشی IPv6 که نیاز به گوش دادن به آنها دارد، از طرف شبکه Thread محلی خود استفاده می کند. و PBBR فقط در صورتی ترافیک چندپخشی را به شبکه Thread ارسال می کند که مقصد حداقل توسط یک دستگاه Thread مشترک باشد.
برای دستگاههای Thread Minimal End، ممکن است برای جمعآوری آدرس چندپخشی و انجام MLR از طرف آنها به والدین خود وابسته باشند، یا اگر والدین آنها Thread 1.1 هستند، خودشان را ثبت کنند.
برای جزئیات بیشتر، لطفاً به مشخصات موضوع مراجعه کنید.
آنچه خواهید ساخت
در این کد لبه، شما میخواهید یک Thread Border Router و دو دستگاه Thread راهاندازی کنید، سپس ویژگیهای Multicast را در دستگاههای Thread و دستگاههای Wi-Fi فعال و تأیید کنید.
آنچه خواهید آموخت
- نحوه ساخت سیستم عامل nRF52840 با پشتیبانی از IPv6 Multicast.
- نحوه اشتراک در آدرس های چندپخشی IPv6 در دستگاه های Thread.
آنچه شما نیاز خواهید داشت
- یک ایستگاه کاری لینوکس، برای ساختن و فلش کردن Thread RCP، OpenThread CLI و آزمایش چندپخشی IPv6.
- Raspberry Pi برای روتر مرزی Thread.
- 2 دانگل USB نیمه هادی Nordic nRF52840 (یکی برای RCP و دو عدد برای دستگاه های انتهایی Thread).
2. OTBR را راه اندازی کنید
سریعترین راه برای راه اندازی OTBR استفاده از Docker به دنبال OTBR با Docker Guide است.
پس از تکمیل راهاندازی OTBR، ot-ctl
استفاده کنید تا تأیید کنید که OTBR ظرف چند ثانیه به روتر اصلی ستون فقرات تبدیل شده است.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. دستگاه های Thread را بسازید و فلش کنید
برنامه Thread CLI را با Multicast بسازید و دو برد nRF52840 DK را فلش کنید.
سیستم عامل nRF52840 DK را بسازید
دستورالعمل ها را برای شبیه سازی پروژه و ساخت سیستم عامل nRF52840 دنبال کنید.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
همانطور که نوشته شده است ، شبکه Build a Thread را با بردهای nRF52840 و کد OpenThread ادامه دهید. پس از اینکه دستگاه انتهایی با تصویر CLI فلش شد، Join node دوم به شبکه Thread را دنبال کنید تا دستگاه Thread به شبکه Thread اضافه شود. این کار را برای دستگاه پایان Thread دوم تکرار کنید.
4. در آدرس چندپخشی IPv6 مشترک شوید
مشترک شدن در ff05::abcd در nRF52840 End Device 1:
> 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.')
subscribe6.py
برای اشتراک ff05::abcd
در رابط شبکه Wi-Fi (مثلا wlan0) اجرا کنید:
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
توپولوژی نهایی شبکه با اشتراک های چندپخشی در زیر نشان داده شده است:
اکنون که آدرس IPv6 چندپخشی را در هر دو دستگاه پایانی nRF52840 در شبکه Thread و لپتاپ در شبکه Wi-Fi مشترک کردهایم، میخواهیم دسترسی چندپخشی IPv6 دو طرفه را در بخشهای زیر بررسی کنیم.
5. 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 ارسال کند.
6. 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 ارسال کند.
7. تبریک می گویم
تبریک میگوییم، شما با موفقیت یک Thread Border Router را راهاندازی کردید و IPv6 چندپخشی دوطرفه را تأیید کردید!
برای اطلاعات بیشتر در مورد OpenThread، به openthread.io مراجعه کنید.
اسناد مرجع: