1. مقدمه
Thread چیست؟
Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از خرابی های تک نقطه ای جلوگیری کنند.
OpenThread چیست؟
OpenThread منتشر شده توسط Google یک پیاده سازی متن باز Thread® است.
Thread Border Router چیست؟
Thread Border Router یک شبکه Thread را به سایر شبکه های مبتنی بر IP مانند Wi-Fi یا Ethernet متصل می کند. یک شبکه Thread برای اتصال به شبکه های دیگر به یک مسیریاب مرزی نیاز دارد. روتر Thread Border حداقل از توابع زیر پشتیبانی می کند:
- اتصال IP دوطرفه بین شبکه های Thread و Wi-Fi/Ethernet.
- کشف سرویس دوطرفه از طریق mDNS (در پیوند Wi-Fi/Ethernet) و SRP (در شبکه Thread).
- Thread-over-Infrastructure که پارتیشن های Thread را روی پیوندهای مبتنی بر IP ادغام می کند.
- راه اندازی Thread خارجی (به عنوان مثال، تلفن همراه) برای احراز هویت و پیوستن یک دستگاه Thread به شبکه Thread.
روتر مرزی OpenThread (OTBR) منتشر شده توسط گوگل یک پیاده سازی متن باز از Thread Border Router است.
چیزی که خواهی ساخت
در این کد لبه، شما قصد دارید یک Thread Border Router راه اندازی کنید و تلفن همراه خود را از طریق Border Router به یک Thread End Device متصل کنید.
چیزی که یاد خواهید گرفت
- نحوه راه اندازی OTBR
- نحوه تشکیل شبکه Thread با OTBR
- چگونه یک دستگاه OpenThread CLI با ویژگی SRP بسازیم
- نحوه ثبت سرویس با SRP
- نحوه کشف و دسترسی به یک دستگاه پایان Thread
آنچه شما نیاز دارید
- یک ایستگاه کاری لینوکس، برای ساختن و فلش کردن Thread RCP، OpenThread CLI و آزمایش چندپخشی IPv6.
- Raspberry Pi برای روتر مرزی Thread.
- 2 دانگل USB نیمه هادی Nordic nRF52840 (یکی برای RCP و یکی برای دستگاه انتهایی Thread).
- تلفن iOS با حداقل iOS 14 یا تلفن Android با حداقل Android 8.1.
2. OTBR را راه اندازی کنید
سریعترین راه برای راه اندازی OTBR پیروی از راهنمای راه اندازی OTBR است.
پس از تکمیل راهاندازی OTBR، ot-ctl
استفاده کنید تا تأیید کنید که OTBR بهعنوان leader
Thread عمل میکند.
$ sudo ot-ctl state leader Done
همچنین تأیید کنید که OTBR به طور خودکار یک پیشوند off-mesh-routable
(OMR) را در داده شبکه موضوعی پیکربندی کرده است.
$ 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
3. SRP Client End Device را راه اندازی کنید
ساخت و فلش OT CLI
برای ساختن و فلش کردن یک دستگاه انتهایی nRF52840 CLI ، مرحله 5 از شبکه Build a Thread را با بردهای nRF52840 و Codelab OpenThread دنبال کنید.
اما به جای فعال کردن OT_COMMISSIONER
و OT_JOINER
، گره CLI به ویژگیهای OT_SRP_CLIENT
و OT_ECDSA
نیاز دارد.
بنابراین فراخوان کامل ساخت باید به شکل زیر باشد:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
به شبکه Thread بپیوندید
برای پیوستن به شبکه Thread باید Active Operational Dataset را از دستگاه OTBR دریافت کنیم. بیایید به ot-ctl
برگردیم و مجموعه داده فعال را دریافت کنیم:
$ sudo ot-ctl dataset active -x 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
به جلسه صفحه نمایش گره مشتری SRP برگردید و مجموعه داده فعال را تنظیم کنید:
> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff Done
سپس، رابط Thread را راه اندازی کنید:
> ifconfig up Done > thread start Done
چند ثانیه صبر کنید و بررسی کنید که آیا پیوستن به شبکه Thread موفقیت آمیز است یا خیر:
> 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
مطمئن شوید که داده های شبکه با داده های چاپ شده در OTBR مطابقت دارند. اکنون می توانیم آدرس OMR OTBR را پینگ کنیم:
> 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
4. سرویس را در دستگاه پایانی منتشر کنید
mDNS به طور گسترده برای انتشار سرویس DNS-SD در لینک محلی استفاده شده است. اما پیامهای چندپخشی پهنای باند زیادی مصرف میکنند و باتری دستگاههای کم مصرف را به سرعت تمام میکنند. Thread از پروتکل unicast SRP برای ثبت خدمات خود در Border Router استفاده می کند و برای تبلیغ خدمات در پیوند Wi-Fi یا Ethernet به Border Router متکی است.
ما می توانیم یک سرویس را با دستور srp client
ثبت کنیم.
به جلسه صفحه نمایش گره کلاینت SRP بروید و کلاینت SRP را به طور خودکار راه اندازی کنید:
> srp client autostart enable Done
نام میزبانی را که در پیوند Wi-Fi/Ethernet تبلیغ میشود، تنظیم کنید:
> srp client host name ot-host Done
برای اینکه دستگاهی در پیوند Wi-Fi/Ethernet به دستگاه پایان رشته دسترسی پیدا کند، آدرس OMR دستگاه پایانی باید تبلیغ شود:
> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 Done
در پایان یک سرویس _ipps._tcp
جعلی ثبت کنید:
> srp client service add ot-service _ipps._tcp 12345 Done
چند ثانیه صبر کنید تا بتوانیم سرویس ثبت شده را ببینیم:
> srp client service instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0 Done
ما تمام کارهای راه اندازی را تکمیل کرده ایم و سرویس _ipps._tcp
باید در پیوند Wi-Fi/Ethernet تبلیغ می شد. اکنون زمان کشف و رسیدن به دستگاه نهایی است!
5. سرویس را کشف کنید
سرویس را با تلفن همراه کشف کنید
ما از برنامه مرورگر سرویس برای کشف سرویسهای mDNS با تلفن Android استفاده میکنیم، یک برنامه معادل برای دستگاههای همراه iOS نیز میتوان یافت. برنامه را باز کنید و سرویس _ipps._tcp
باید ظاهر شود.
سرویس را با هاست لینوکس کشف کنید
اگر می خواهید سرویس را از یک هاست لینوکس دیگر کشف کنید، می توانید از دستور avahi-browse
استفاده کنید.
avahi-daemon
و avahi-utils
را نصب کنید:
$ sudo apt-get install -y avahi-daemon avahi-utils
رفع سرویس:
$ 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 کشف کنید
برای حل این سرویس می توانید از dns-sd
در macOS استفاده کنید:
$ 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 "" ...
6. دستگاه پایان را پینگ کنید
پینگ از تلفن همراه
تلفن Pixel را به عنوان مثال در نظر بگیرید، ما میتوانیم آدرس OMR سرویس ثبتشده قبلی «ot-service» را در صفحه جزئیات نمونه سرویس در برنامه مرورگر سرویس پیدا کنیم.
اکنون می توانیم آدرس OMR را با یک برنامه تحلیلگر شبکه دیگر پینگ کنیم.
متأسفانه، نسخه Android برنامه Network Analyzer از درخواستهای mDNS برای ابزار پینگ پشتیبانی نمیکند و ما نمیتوانیم نام میزبان ot-host.local
را مستقیماً پینگ کنیم (میتوانیم نام میزبان را با نسخه iOS برنامه پینگ کنیم).
پینگ از یک میزبان Linux/macOS
Thread Border Router تبلیغات روتر ICMPv6 (RA) را برای تبلیغ پیشوندها (از طریق گزینه اطلاعات پیشوند) و مسیرها (از طریق گزینه اطلاعات مسیر) در پیوند Wi-Fi/Ethernet ارسال می کند.
هاست لینوکس را آماده کنید
مهم است که مطمئن شوید RA و RIO در هاست شما فعال هستند:
-
net.ipv6.conf.wlan0.accept_ra
باید حداقل1
باشد اگر ارسال IP فعال نیست و2
در غیر این صورت. -
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen
نباید کوچکتر از64
باشد.
برای اکثر توزیعها، accept_ra
به طور پیشفرض روی 1
تنظیم شده است. اما ممکن است دیمون های شبکه دیگری وجود داشته باشند که این گزینه را لغو کنند (به عنوان مثال، dhcpcd
در Raspberry Pi، accept_ra
به 0
تغییر می دهد). می توانید مقدار accept_ra
با استفاده از:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
و مقدار را روی 1
(یا 2
در صورت فعال بودن ارسال IP) قرار دهید:
$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1 Net.ipv6.conf.wlan0.accept_ra = 1
گزینه accept_ra_rt_info_max_plen
در اکثر توزیعهای لینوکس به طور پیشفرض روی 0
است، آن را روی 64
تنظیم کنید:
$ 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
این تغییر پس از راه اندازی مجدد میزبان از بین می رود. برای مثال، برای فعال کردن دائمی RIO، دستورات زیر را به /etc/sysctl.conf
اضافه کنید:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
ممکن است برای تغییر این تنظیمات خیلی دیر باشد زیرا OTBR قبلاً پیامهای RA ارسال کرده است و فاصله بین دو پیام RA ناخواسته میتواند چند صد ثانیه باشد. یکی از راه ها قطع و اتصال مجدد به Wi-Fi AP برای ارسال پیام های Router Solicitation است تا OTBR با RA های درخواست شده پاسخ دهد. گزینه دیگر راه اندازی مجدد تابع Border Routing در Border Router است:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
اگر میخواهید دوباره Wi-Fi را وصل کنید یا رابط اترنت را دوباره راهاندازی کنید، مطمئن شوید که dhcpcd برای مدیریت شبکه WiFi/Ethernet IPv6 شما استفاده نمیشود. زیرا dhcpcd همیشه هر بار که رابط راه اندازی مجدد می شود، گزینه accept_ra
لغو می کند و پیکربندی accept_ra
شما از بین می رود. برای غیرفعال کردن صریح IPv6 در dhcpcd، خطوط زیر را به فایل پیکربندی dhcpcd (به عنوان مثال /etc/dhcpcd.conf
) اضافه کنید:
noipv6 noipv6rs
برای اعمال تغییرات باید ریبوت کنید.
میزبان macOS را آماده کنید
هر دو گزینه accept_ra*
به طور پیش فرض فعال هستند، اما باید سیستم خود را حداقل به macOS Big Sur ارتقا دهید.
نام میزبان یا آدرس IPv6 را پینگ کنید
اکنون می توانیم نام میزبان ot-host.local
را با دستور ping -6
پینگ کنیم ( ping6
برای macOS):
$ 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 ...
این دستور ممکن است در هاست های لینوکس با خطای "Name or service not known"
ناموفق باشد. دلیلش این است که دستور ping
ot-host.local.
نام با پرس و جوهای mDNS. /etc/nsswitch.conf
را باز کنید و mdns6_minimal
به خط شروع شده با hosts
اضافه کنید:
hosts: files mdns4_minimal mdns6_minimal dns
البته، همیشه می توانید آدرس IPv6 را مستقیماً پینگ کنید:
$ 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 ...
7. پایان دادن به دستگاه، سرویس را لغو انتشار کنید
برای حذف آدرس و سرویس ثبت شده از گره مشتری SRP:
> srp client host remove Done
اکنون نمی توانید سرویس _ipps._tcp
را کشف کنید.
8. تبریک می گویم
تبریک میگوییم، شما با موفقیت OTBR را بهعنوان یک مسیریاب مرزی برای ارائه اتصال IP دو طرفه و کشف سرویس برای دستگاههای پایانی Thread راهاندازی کردید.
بعدش چی؟
برخی از این کدها را بررسی کنید...