1. مقدمة
ما هو جهاز توجيه حدود Thread؟
Thread هو بروتوكول للشبكات اللاسلكية المتداخلة يستند إلى بروتوكول الإنترنت (IP) ويتيح إجراء الاتصالات الآمنة من جهاز إلى آخر ومن جهاز إلى آخر في السحابة الإلكترونية. يمكن أن تتكيّف شبكات سلاسل المحادثات مع التغييرات في الهيكلية لتجنّب حدوث نقطة عطل واحدة.
يربط جهاز توجيه حدود Thread شبكة Thread بشبكات أخرى مستندة إلى عناوين IP، مثل Wi-Fi أو إيثرنت. تتطلب شبكة Thread جهاز توجيه الحدود للاتصال بشبكات أخرى. يتيح جهاز توجيه حدود مؤشر الترابط تنفيذ الوظائف التالية إلى حدّ أدنى:
- إمكانية اتصال عنوان IP ثنائي الاتجاه بين شبكة Thread وشبكات Wi-Fi/Ethernet
- اكتشاف الخدمة الثنائية الاتجاه من خلال mDNS (على رابط Wi-Fi/Ethernet) وSRP (على شبكة Thread).
- البنية الأساسية لسلاسل المحادثات التي تدمج أقسام Thread عبر الروابط المستندة إلى IP.
- تكليف خارجي بسلاسل محادثات (مثل هاتف جوّال) لمصادقة جهاز Thread وربطه بشبكة Thread
OpenThread Border Router (OTBR) الذي طرحته Google هو تطبيق مفتوح المصدر لجهاز Thread Border Router.
ما الذي ستنشئه
في هذا الدرس التطبيقي حول الترميز، ستتمكّن من إعداد جهاز توجيه الحدود Thread وربط هاتفك الجوّال بجهاز طرف تسلسلي عبر جهاز توجيه الحدود.
ما ستتعرَّف عليه
- كيفية إعداد تجربة البث المباشر على الإنترنت
- كيفية إنشاء شبكة Thread باستخدام OTBR
- كيفية إنشاء جهاز OpenThread CLI باستخدام ميزة SRP
- كيفية تسجيل خدمة في SRP
- كيفية اكتشاف جهاز نهاية Thread والوصول إليه.
المتطلبات
- جهاز Raspberry Pi 3/4 وبطاقة SD بقدرة 8 غيغابايت على الأقل
- لوحتا مطوّري برامج Nordic حظر الموصّلات nRF52840
- نقطة وصول Wi-Fi بدون تفعيل واقي إعلانات على جهاز توجيه IPv6 على جهاز التوجيه.
- يجب أن يكون لديك هاتف iOS يعمل بنظام التشغيل iOS 14 أو هاتف Android يعمل بنظام التشغيل Android 8.1 على الأقل.
2. إعداد OTBR
إعداد Raspberry Pi
من السهل إعداد جهاز Raspberry Pi جديد باستخدام أداة rpi-imager
عن طريق اتّباع التعليمات الواردة على raspberrypi.org (بدلاً من استخدام أحدث إصدار من Raspberry Pi OS في الأداة، يُرجى تنزيل 2021-05-07-raspios-buster-armhf-lite بنفسك). لإكمال خطوات الهاتف الجوّال في هذا الدرس التطبيقي حول الترميز، عليك توصيل جهاز Raspberry Pi بنقطة اتصال Wi-Fi. اتبع هذا الدليل لإعداد الاتصال اللاسلكي. من السهل تسجيل الدخول إلى Raspberry Pi باستخدام SSH، ويمكنك العثور على التعليمات هنا.
الحصول على رمز OTBR
سجِّل الدخول إلى جهاز Raspberry Pi واستنساخ ot-br-posix
من GitHub:
$ git clone https://github.com/openthread/ot-br-posix.git --depth 1
إنشاء وتثبيت OTBR
تتضمن OTBR نصين برمجيين يتم تشغيلهما وإعداد جهاز توجيه حدود Thread:
$ cd ot-br-posix $ ./script/bootstrap $ INFRA_IF_NAME=wlan0 ./script/setup
تعمل ميزة OTBR على كل من واجهة Thread وواجهة شبكة البنية الأساسية (مثل شبكة Wi-Fi/Ethernet) المحدّدة باستخدام السمة INFRA_IF_NAME
. يتم إنشاء واجهة Thread من خلال OTBR نفسها، وهي تحمل اسم wpan0
تلقائيًا، وتحتوي واجهة البنية الأساسية على قيمة تلقائية wlan0
في حال عدم تحديد INFRA_IF_NAME
بشكل صريح. إذا كان جهاز Raspberry Pi متصلاً بكابل إيثرنت، حدِّد اسم واجهة الإيثرنت (مثل eth0
):
$ INFRA_IF_NAME=eth0 ./script/setup
تحقق مما إذا تم تثبيت OTBR بنجاح:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2) Main PID: 2444 (code=exited, status=2)
من المتوقّع أن تكون خدمة otbr-agent
غير نشطة، لأنّها تتطلّب شريحة RCP
للتشغيل.
يُرجى إعادة تشغيل Raspberry Pi لتطبيق التغييرات.
إنشاء البرامج الثابتة لـ RCP
تتوافق تقنية OTBR مع شريحة راديو مقاس 15.4 في وضع المعالج اللاسلكي (RCP). في هذا الوضع، يعمل مكدس OpenThread على الجانب المضيف ويرسل/يستقبل الإطارات عبر جهاز الإرسال والاستقبال IEEE802.15.4.
اتّبِع الخطوة 4 من إنشاء شبكة Thread باستخدام لوحات nRF52840 ودرس تطبيقي حول ترميز OpenThread لإنشاء جهاز يعمل بترميز nRF52840 RCP:
$ script/build nrf52840 USB_trans
بدء تشغيل OTBR والتحقّق من الحالة
وصِّل لوحة nRF52840 بجهاز Raspberry Pi وابدأ خدمة otbr-agent
:
$ sudo service otbr-agent restart
تأكَّد من أنّ خدمة "otbr-agent
" نشطة:
$ sudo service otbr-agent status ● otbr-agent.service - Border Router Agent Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago Main PID: 2997 (otbr-agent) Tasks: 1 (limit: 4915) CGroup: /system.slice/otbr-agent.service └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0 Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started. Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId] Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down
3- إنشاء شبكة Thread
هناك أمر ot-ctl
يمكن استخدامه للتحكّم في خدمة otbr-agent
. يقبل ot-ctl
جميع أوامر OpenThread CLI. يُرجى الاطّلاع على دليل OpenThread CLI لمزيد من التفاصيل.
تكوين شبكة Thread باستخدام OTBR:
$ sudo ot-ctl dataset init new Done $ sudo ot-ctl dataset commit active Done $ sudo ot-ctl ifconfig up Done $ sudo ot-ctl thread start Done
انتظر بضع ثوانٍ، من المفترض أن نلاحظ أن OTBR تعمل كسلسلة محادثات leader
وهناك بادئة off-mesh-routable
(OMR) في بيانات شبكة Thread:
$ sudo ot-ctl state leader Done $ 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
4. إعداد الجهاز النهائي لعميل SRP
إنشاء ملف OT CLI وتحميله فلاش
اتّبِع الخطوة 5 من إنشاء شبكة Thread باستخدام لوحات nRF52840 ودرس تطبيقي حول ترميز OpenThread لإنشاء جهاز نهاية nRF52840 CLI وتثبيته.
ولكن بدلاً من تفعيل OT_COMMISSIONER
وOT_JOINER
، تتطلب عقدة CLI ميزتي OT_SRP_CLIENT
وOT_ECDSA
.
وبالتالي يجب أن يظهر استدعاء الإصدار الكامل على النحو التالي:
$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
الانضمام إلى شبكة OTBR
للانضمام إلى شبكة Thread التي أنشأتها خدمة "otbr-agent
"، نحتاج إلى الحصول على مجموعة البيانات التشغيلية النشطة من جهاز OTBR. لنعد إلى سطر الأوامر otbr-agent
ونحصل على مجموعة البيانات النشطة:
$ 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
5- نشر الخدمة على الجهاز النهائي
تم استخدام mDNS على نطاق واسع لنشر خدمة DNS-SD على رابط محلي. غير أنّ رسائل البث المتعدد تستهلك مقدارًا كبيرًا من معدل نقل البيانات، كما أنّها تستنفد طاقة البطارية إذا كانت الأجهزة منخفضة الطاقة. تستخدم Thread بروتوكول SRP الأحادي لتسجيل خدماتها في جهاز توجيه الحدود، كما تعتمد على جهاز توجيه الحدود للإعلان عن الخدمات على رابط Wi-Fi أو شبكة إيثرنت.
يمكننا تسجيل خدمة باستخدام الأمر srp client
.
انتقِل إلى جلسة شاشة عقدة عميل SRP وشغِّل برنامج SRP تلقائيًا:
> srp client autostart enable Done
اضبط اسم المضيف الذي سيتم الإعلان عنه على رابط Wi-Fi/Ethernet:
> srp client host name ot-host Done
لكي يصل جهاز على رابط Wi-Fi/Ethernet إلى جهاز نهاية 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. حان الوقت الآن لاكتشاف الجهاز النهائي والوصول إليه!
6- التعرّف على الخدمة
اكتشاف الخدمة باستخدام هاتف جوّال
نستخدم تطبيق متصفّح الخدمات لاكتشاف خدمات mDNS على هاتف Android، ويمكن أيضًا العثور على تطبيق مكافئ للأجهزة الجوّالة التي تعمل بنظام التشغيل iOS. افتح التطبيق وستظهر الخدمة "_ipps._tcp
".
اكتشاف الخدمة من خلال مضيف Linux
إذا أردت الاطّلاع على الخدمة من مضيف Linux آخر، يمكنك استخدام الأمر 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 "" ...
7. اختبار اتصال الجهاز النهائي
فحص الاتصال من هاتف جوّال
لنأخذ هاتف Pixel كمثال، يمكننا معرفة عنوان OMR الخاص بالخدمة المسجَّلة مسبقًا "ot-service" في صفحة تفاصيل مثيل الخدمة في تطبيق متصفح الخدمة.
يمكننا الآن اختبار اتصال عنوان OMR باستخدام تطبيق Network Analysis آخر.
للأسف، لا يتوافق إصدار Android من تطبيق "تحليل الشبكة" مع طلبات بحث mDNS لأداة اختبار الاتصال ولا يمكننا اختبار اتصال اسم المضيف ot-host.local
مباشرةً (يمكننا فحص اتصال اسم المضيف باستخدام إصدار iOS من التطبيق).
اختبار الاتصال من مضيف Linux/macOS
يرسل جهاز توجيه حدود سلسلة التعليمات إعلانات جهاز توجيه ICMPv6 (RA) للإعلان عن البادئات (عبر خيار معلومات البادئة) والمسارات (عبر خيار معلومات المسار) على رابط Wi-Fi/Ethernet.
إعداد مضيف Linux
من المهم التأكد من تمكين كل من 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
في معظم توزيعات Linux هو 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 من خلال الطلبات التي يتم جمعها في قاعدة البيانات. هناك خيار آخر وهو إعادة تشغيل وظيفة "توجيه الحدود" على جهاز توجيه الحدود:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
إذا كنت تحاول إعادة الاتصال بشبكة Wi-Fi أو إعادة تشغيل واجهة إيثرنت، تأكَّد من عدم استخدام dhcpcd لإدارة شبكة WiFi-/Ethernet IPv6. نظرًا لأنّ dhcpcd يؤدّي دائمًا إلى تجاهل الخيار accept_ra
في كلّ مرّة تُعيد فيها تشغيل الواجهة وسيتم فقدان إعدادات accept_ra
. ألحِق الأسطر التالية بملف الإعداد dhcpcd (مثل /etc/dhcpcd.conf
) لإيقاف IPv6 صراحةً في dhcpcd:
noipv6 noipv6rs
يجب إعادة تشغيل لكي تسري التغييرات.
إعداد مضيف macOS
يتم تفعيل كلا خيارَي accept_ra*
تلقائيًا، ولكن عليك ترقية نظامك إلى الإصدار Big Sur على الأقل من نظام التشغيل macOS.
فحص اتصال اسم المضيف أو عنوان 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 ...
قد يتعذّر تنفيذ هذا الأمر على مضيفي Linux مع ظهور الخطأ "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 ...
8. إلغاء نشر الخدمة على الجهاز
لإزالة العنوان والخدمة المسجَّلَين من عقدة عميل SRP:
> srp client host remove Done
من المفترض ألا تتمكّن من اكتشاف خدمة _ipps._tcp
الآن.
9. تهانينا
تهانينا، لقد تم إعداد OTBR بنجاح كجهاز توجيه ذات حدود Thread لتوفير اتصال ثنائي الاتجاه واستكشاف الخدمة للأجهزة التي تستخدم شبكة Thread.
الخطوات التالية
اطّلع على بعض هذه الدروس التطبيقية حول الترميز...