1. مقدمة
ما هو بروتوكول Thread؟
Thread هو بروتوكول شبكة لاسلكية منخفضة الطاقة مستند إلى بروتوكول الإنترنت (IP) ويتيح إجراء اتصالات آمنة بين الأجهزة وبين الأجهزة والسحابة الإلكترونية. يمكن أن تتكيّف شبكات Thread مع التغييرات في البنية لتجنُّب الأعطال في نقطة واحدة.
ما هي OpenThread؟
OpenThread، الذي أصدرته Google، هو تطبيق مفتوح المصدر لبروتوكول Thread®.
ما هو جهاز توجيه حدود شبكة Thread؟
يربط جهاز توجيه حدود شبكة Thread شبكة Thread بشبكات أخرى تستند إلى بروتوكول الإنترنت، مثل شبكة Wi-Fi أو إيثرنت. تتطلّب شبكة Thread جهاز توجيه حدود شبكة Thread للاتصال بالشبكات الأخرى. يجب أن يتيح جهاز توجيه حدود شبكة Thread الحد الأدنى من الوظائف التالية:
- إمكانية الاتصال الثنائي الاتجاه عبر بروتوكول الإنترنت بين شبكات Thread وWi-Fi/Ethernet
- اكتشاف الخدمات الثنائي الاتجاه من خلال mDNS (على رابط Wi-Fi/Ethernet) وSRP (على شبكة Thread).
- بنية أساسية لبروتوكول Thread تدمج أقسام Thread عبر روابط مستندة إلى بروتوكول الإنترنت
- تفعيل جهاز Thread خارجي (مثل هاتف جوّال) للمصادقة والانضمام إلى شبكة Thread
OpenThread Border Router (OTBR) الذي أصدرته Google هو تطبيق مفتوح المصدر لجهاز توجيه حدود شبكة Thread.
ما ستنشئه
في هذا الدرس العملي، ستتعرّف على كيفية إعداد جهاز توجيه حدود شبكة Thread وربط هاتفك الجوّال بجهاز طرفي لشبكة Thread من خلال جهاز توجيه الحدود.
أهداف الدورة التعليمية
- كيفية إعداد OTBR
- كيفية إنشاء شبكة Thread باستخدام OTBR
- كيفية إنشاء جهاز OpenThread CLI باستخدام ميزة SRP
- كيفية تسجيل خدمة باستخدام SRP
- كيفية العثور على جهاز طرفي يعمل بنظام Thread والوصول إليه
المتطلبات
- محطة عمل Linux لإنشاء وتثبيت Thread RCP وOpenThread CLI واختبار البث المتعدد IPv6
- جهاز Raspberry Pi لجهاز توجيه حدود شبكة Thread
- جهازان من Nordic Semiconductor nRF52840 USB Dongles (أحدهما لجهاز RCP والآخر لجهاز Thread النهائي)
- هاتف iOS يعمل بالإصدار 14 أو الإصدارات الأحدث أو هاتف Android يعمل بالإصدار 8.1 أو الإصدارات الأحدث
2. إعداد OTBR
أسرع طريقة لإعداد OTBR هي اتّباع دليل إعداد OTBR.
بعد اكتمال عملية إعداد OTBR، استخدِم ot-ctl
للتأكّد من أنّ OTBR يعمل كجهاز leader
Thread.
$ 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
3- إعداد جهاز المستخدم النهائي لبرنامج SRP
إنشاء واجهة سطر الأوامر (CLI) وتثبيتها
اتّبِع الخطوة 5 من برنامج Build a Thread network with nRF52840 boards and OpenThread التدريبي لإنشاء جهاز طرفي nRF52840 CLI وتثبيت البرنامج عليه.
ولكن بدلاً من تفعيل OT_COMMISSIONER
وOT_JOINER
، تتطلّب عقدة واجهة سطر الأوامر الميزتَين 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
4. نشر الخدمة على الجهاز الطرفي
يتم استخدام mDNS على نطاق واسع لنشر خدمة DNS-SD على الرابط المحلي. لكن رسائل البث المتعدد تستهلك الكثير من معدل نقل البيانات وتستنزف البطارية في الأجهزة المنخفضة الطاقة بسرعة. تستخدم أجهزة Thread بروتوكول SRP أحادي الإرسال لتسجيل خدماتها لدى جهاز توجيه الحدود، وتعتمد على جهاز توجيه الحدود للإعلان عن الخدمات على رابط Wi-Fi أو Ethernet.
يمكننا تسجيل خدمة باستخدام الأمر 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. حان الوقت لاكتشاف الجهاز النهائي والوصول إليه الآن.
5- استكشاف الخدمة
اكتشاف الخدمة باستخدام هاتف جوّال
نستخدم تطبيق Service Browser للعثور على خدمات 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 "" ...
6. إرسال إشارة إلى الجهاز النهائي
إرسال إشارة من هاتف جوّال
لنأخذ هاتف Pixel كمثال، يمكننا معرفة عنوان OMR للخدمة "ot-service" المسجّلة سابقًا في صفحة التفاصيل الخاصة بمثيل الخدمة في تطبيق "متصفّح الخدمات".
يمكننا الآن إرسال طلب اختبار الاتصال إلى عنوان OMR باستخدام تطبيق آخر من تطبيقات Network Analyzer.
لا يتيح إصدار تطبيق Network Analyzer على Android طلبات mDNS لأداة ping، ولا يمكننا إرسال طلب ping إلى اسم المضيف ot-host.local
مباشرةً (يمكننا إرسال طلب ping إلى اسم المضيف باستخدام إصدار التطبيق على iOS).
اختبار الاتصال من مضيف Linux أو macOS
يرسل جهاز توجيه حدود شبكة Thread إعلانات جهاز التوجيه 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 وإعادة الاتصال بها لإرسال رسائل طلب جهاز التوجيه حتى يستجيب OTBR برسائل RA المطلوبة. يمكنك أيضًا إعادة تشغيل وظيفة "توجيه الحدود" على جهاز توجيه الحدود باتّباع الخطوات التالية:
$ sudo ot-ctl br disable Done $ sudo ot-ctl br enable Done
إذا كنت تحاول إعادة الاتصال بشبكة Wi-Fi أو إعادة تشغيل واجهة إيثرنت، تأكَّد من عدم استخدام dhcpcd لإدارة شبكة IPv6 الخاصة بشبكة Wi-Fi أو إيثرنت. لأنّ 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 ...
قد يتعذّر تنفيذ هذا الأمر على مضيفي 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 ...
7. إنهاء نشر الخدمة على الأجهزة
لإزالة العنوان والخدمة المسجّلتَين من عقدة برنامج SRP:
> srp client host remove Done
من المفترض ألا تتمكّن من العثور على خدمة _ipps._tcp
الآن.
8. تهانينا
تهانينا، لقد نجحت في إعداد OTBR كجهاز توجيه حدود شبكة Thread لتوفير اتصال IP ثنائي الاتجاه واكتشاف الخدمة لأجهزة Thread الطرفية.
ما هي الخطوات التالية؟
يمكنك الاطّلاع على بعض دروس الترميز التطبيقية هذه...