۱. مقدمه

نخ چیست؟
ترد (Thread) یک پروتکل شبکه مش بیسیم کممصرف مبتنی بر IP است که ارتباطات امن دستگاه به دستگاه و دستگاه به ابر را امکانپذیر میکند. شبکههای ترد میتوانند با تغییرات توپولوژی سازگار شوند تا از خرابیهای تک نقطهای جلوگیری کنند.
اوپنترید چیست؟
OpenThread که توسط گوگل منتشر شده است، یک پیادهسازی متنباز از Thread® است.
روتر حاشیهای نخ چیست؟
یک روتر Thread Border، یک شبکه Thread را به سایر شبکههای مبتنی بر IP مانند Wi-Fi یا Ethernet متصل میکند. یک شبکه Thread برای اتصال به سایر شبکهها به یک روتر Border نیاز دارد. یک روتر Thread Border حداقل از عملکردهای زیر پشتیبانی میکند:
- اتصال IP دو طرفه بین شبکههای Thread و Wi-Fi/Ethernet.
- کشف سرویس دو طرفه از طریق mDNS (روی لینک Wi-Fi/Ethernet) و SRP (روی شبکه Thread).
- زیرساخت Thread-over که پارتیشنهای Thread را روی لینکهای مبتنی بر IP ادغام میکند.
- راهاندازی Thread خارجی (به عنوان مثال، یک تلفن همراه) برای تأیید اعتبار و اتصال یک دستگاه Thread به شبکه Thread.
روتر مرزی OpenThread (OTBR) که توسط گوگل منتشر شده است، یک پیادهسازی متنباز از روتر مرزی Thread است.
آنچه خواهید ساخت
در این کدلب، شما یک روتر مرزی ترد راهاندازی میکنید و تلفن همراه خود را از طریق روتر مرزی به یک دستگاه انتهای ترد متصل میکنید.
آنچه یاد خواهید گرفت
- نحوه تنظیم OTBR
- نحوه تشکیل شبکه Thread با OTBR
- نحوه ساخت یک دستگاه OpenThread CLI با ویژگی SRP
- نحوه ثبت سرویس در SRP
- نحوه کشف و دسترسی به دستگاه انتهای Thread
آنچه نیاز دارید
- یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن RCP Thread، رابط خط فرمان OpenThread و آزمایش IPv6 multicast.
- یک رزبری پای برای روتر مرزی Thread.
- دو دانگل USB از شرکت Nordic Semiconductor به شماره nRF52840 (یکی برای RCP و یکی برای دستگاه Thread end).
- یک گوشی iOS با حداقل iOS 14 یا یک گوشی اندرویدی با حداقل اندروید ۸.۱.
۲. تنظیم OTBR
سریعترین راه برای راهاندازی OTBR، دنبال کردن راهنمای راهاندازی OTBR است.
پس از اتمام راهاندازی OTBR، ot-ctl برای تأیید اینکه OTBR به عنوان یک Thread leader عمل میکند، استفاده کنید.
$ sudo ot-ctl state leader Done
همچنین تأیید کنید که OTBR به طور خودکار یک پیشوند off-mesh-routable (OMR) را در دادههای شبکه Thread پیکربندی کرده است.
$ 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
۳. دستگاه نهایی کلاینت SRP را تنظیم کنید
ساخت و فلش کردن OT CLI
برای ساخت و فلش کردن یک دستگاه انتهایی nRF52840 CLI ، مرحله 5 از ساخت شبکه 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، باید مجموعه دادههای عملیاتی فعال را از دستگاه 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
۴. سرویس را در دستگاه نهایی منتشر کنید
mDNS به طور گسترده برای انتشار سرویس DNS-SD در لینک محلی استفاده شده است. اما پیامهای چندپخشی پهنای باند زیادی مصرف میکنند و باتری دستگاههای کممصرف را به سرعت خالی میکنند. Thread از پروتکل SRP تکپخشی برای ثبت سرویسهای خود در Border Router استفاده میکند و برای تبلیغ سرویسها در لینک Wi-Fi یا Ethernet به Border Router متکی است.
ما میتوانیم یک سرویس را با دستور srp client ثبت کنیم.
به صفحه گره کلاینت SRP بروید و کلاینت SRP را به صورت خودکار شروع کنید:
> srp client autostart enable Done
نام میزبانی که قرار است در لینک وایفای/اترنت نمایش داده شود را تنظیم کنید:
> srp client host name ot-host Done
برای اینکه دستگاهی که روی لینک وایفای/اترنت قرار دارد به دستگاه انتهایی Thread دسترسی پیدا کند، آدرس 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 نمایش داده میشد. حالا وقت آن است که دستگاه نهایی را پیدا کرده و به آن دسترسی پیدا کنیم!
۵. سرویس را کشف کنید
با یک تلفن همراه، سرویس را کشف کنید

ما از برنامه مرورگر سرویس برای کشف سرویسهای mDNS با گوشی اندروید استفاده میکنیم، یک برنامه معادل نیز برای دستگاههای تلفن همراه 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 "" ...
۶. دستگاه انتهایی را پینگ کنید
پینگ از تلفن همراه
به عنوان مثال، گوشی پیکسل را در نظر بگیرید، میتوانیم آدرس OMR سرویس قبلاً ثبت شده "ot-service" را در صفحه جزئیات نمونه سرویس در برنامه مرورگر سرویس پیدا کنیم.


اکنون میتوانیم آدرس OMR را با یک برنامه تحلیلگر شبکه دیگر پینگ کنیم.
متأسفانه، نسخه اندروید برنامه Network Analyzer از درخواستهای mDNS برای ابزار پینگ پشتیبانی نمیکند و ما نمیتوانیم نام میزبان ot-host.local را مستقیماً پینگ کنیم (میتوانیم نام میزبان را با نسخه iOS برنامه پینگ کنیم).
پینگ گرفتن از یک هاست لینوکس/مک او اس
روتر Thread Border، اعلانهای روتر ICMPv6 (RA) را برای اعلان پیشوندها (از طریق گزینه اطلاعات پیشوند) و مسیرها (از طریق گزینه اطلاعات مسیر) روی لینک Wi-Fi/Ethernet ارسال میکند.
آماده سازی هاست لینوکس
مهم است که مطمئن شوید RA و RIO روی هاست شما فعال هستند:
- اگر ip forwarding فعال نباشد،
net.ipv6.conf.wlan0.accept_raباید حداقل1و در غیر این صورت2باشد. -
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plenنباید کوچکتر از64باشد.
مقدار پیشفرض accept_ra در اکثر توزیعها 1 است. اما ممکن است سرویسهای شبکهی دیگری وجود داشته باشند که این گزینه را لغو کنند (برای مثال، dhcpcd در رزبری پای، accept_ra به 0 لغو میکند). میتوانید مقدار accept_ra با دستور زیر بررسی کنید:
$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra 0
و مقدار را روی 1 (یا 2 در صورتی که IP forwarding فعال باشد) تنظیم کنید:
$ 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
این تغییر پس از راهاندازی مجدد میزبان از بین خواهد رفت. برای مثال، دستورات زیر را به /etc/sysctl.conf اضافه کنید تا RIO به طور دائم فعال شود:
$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64
ممکن است برای تغییر این تنظیمات خیلی دیر شده باشد زیرا OTBR قبلاً پیامهای RA ارسال کرده است و فاصله بین دو پیام RA ناخواسته میتواند چند صد ثانیه باشد. یک راه این است که اتصال به Wi-Fi AP را قطع و دوباره وصل کنید تا پیامهای درخواست روتر ارسال شود تا OTBR با RAهای درخواستی پاسخ دهد. گزینه دیگر راهاندازی مجدد عملکرد Border Routing در Border Router است:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
اگر میخواهید وایفای را دوباره وصل کنید یا رابط اترنت را مجدداً راهاندازی کنید، مطمئن شوید که از dhcpcd برای مدیریت شبکه WiFi-/Ethernet IPv6 خود استفاده نمیکنید. زیرا dhcpcd همیشه گزینه accept_ra را هر بار که رابط راهاندازی مجدد میشود، لغو میکند و پیکربندی accept_ra شما از بین میرود. خطوط زیر را به فایل پیکربندی dhcpcd (مثلاً /etc/dhcpcd.conf ) اضافه کنید تا IPv6 را در dhcpcd به طور صریح غیرفعال کنید:
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 ...
۷. پایان دادن به انتشار سرویس توسط دستگاه
برای حذف آدرس و سرویس ثبت شده از گره کلاینت SRP:
> srp client host remove Done
اکنون نباید بتوانید سرویس _ipps._tcp را پیدا کنید.
۸. تبریک
تبریک میگوییم، شما با موفقیت OTBR را به عنوان یک روتر Thread Border راهاندازی کردید تا اتصال IP دو طرفه و کشف سرویس را برای دستگاههای Thread end فراهم کند.
بعدش چی؟
به برخی از این آزمایشگاههای کد نگاهی بیندازید...