1. مقدمة
ما هو بروتوكول Thread؟
Thread هو بروتوكول شبكة شبكة لاسلكية منخفضة الطاقة يستند إلى بروتوكول الإنترنت (IP) ويتيح اتصالات آمنة بين الأجهزة والأجهزة السحابية. يمكن لشبكات المواضيع التكيّف مع تغييرات البنية لتجنُّب الأعطال في نقطة واحدة.
ما هو OpenThread؟
بروتوكول OpenThread الذي أصدرته Google هو تطبيق مفتوح المصدر لبروتوكول Thread®.
ما هو جهاز توجيه الحدود في Thread؟
يربط جهاز "جهاز توجيه حدودي لبروتوكول Thread" شبكة Thread بشبكات أخرى مستندة إلى بروتوكول الإنترنت (IP)، مثل Wi-Fi أو إيثرنت. تتطلب شبكة Thread جهاز توجيه حدوديًا للاتصال بالشبكات الأخرى. يتوافق "موجه حدودي" لبروتوكول Thread مع الوظائف التالية على الأقل:
- اتصال بروتوكول الإنترنت (IP) ثنائي الاتجاه بين شبكات Thread وWi-Fi/إيثرنت
- اكتشاف الخدمة في الاتجاهين من خلال mDNS (على رابط Wi-Fi/إيثرنت) وSRP (على شبكة Thread)
- بنية أساسية لبروتوكول Thread تُدمج أقسام Thread عبر الروابط المستندة إلى عناوين IP
- تفعيل Thread الخارجي (على سبيل المثال، هاتف جوّال) للمصادقة على جهاز Thread والانضمام إلى شبكة Thread
OpenThread Border Router (OTBR) الذي أصدرته Google هو تطبيق مفتوح المصدر لبرنامج Thread Border Router.
ما ستُنشئه
في هذا الدليل التعليمي حول رموز البرامج، ستُعدّ جهاز توجيه حدود Thread وتربط هاتفك الجوّال بجهاز Thread النهائي عبر جهاز توجيه الحدود.
المُعطيات
- كيفية إعداد ميزة OTBR
- كيفية إنشاء شبكة Thread باستخدام تقنية OTBR
- كيفية إنشاء جهاز OpenThread CLI باستخدام ميزة SRP
- كيفية تسجيل خدمة باستخدام ميزة "الاستجابة السريعة للطلبات"
- كيفية اكتشاف جهاز Thread النهائي والوصول إليه
المتطلبات
- محطة عمل Linux لإنشاء وفلاش Thread RCP وواجهة سطر أوامر OpenThread واختبار البث المتعدد لبروتوكول IPv6
- جهاز Raspberry Pi لجهاز توجيه الحدود في Thread
- جهازان لتوصيل USB من طراز nRF52840 من شركة Nordic Semiconductor (أحدهما لوحدة التحكّم في الطاقة والآخر لجهاز Thread الطرفي)
- هاتف iOS يعمل بالإصدار 14 على الأقل أو هاتف Android يعمل بالإصدار 8.1 على الأقل
2. إعداد ميزة "إعادة توجيه الطلبات"
إنّ أسرع طريقة لإعداد ميزة "الاستجابة على الإنترنت" هي اتّباع دليل إعداد ميزة "الاستجابة على الإنترنت".
بعد اكتمال عملية إعداد OTBR، استخدِم ot-ctl
للتحقّق من أنّ OTBR يعمل كسلسلة محادثات leader
.
$ 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
إنشاء واجهة سطر أوامر OT وفلاشها
اتّبِع الخطوة 5 من إنشاء شبكة Thread باستخدام لوحات nRF52840 وOpenThread في ورشة التعلم لإنشاء جهاز طرفي لواجهة سطر الأوامر nRF52840 وبرمجته.
ولكن بدلاً من تفعيل 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
4. نشر الخدمة على الجهاز الطرفي
تم استخدام نظام أسماء النطاقات ذي البث المتعدد على نطاق واسع لنشر خدمة نظام أسماء النطاقات (DNS) للاكتشاف على الشبكة المحلية. تستهلك رسائل البث المتعدد قدرًا كبيرًا جدًا من معدل نقل البيانات، وستستنفد البطارية في الأجهزة ذات الطاقة المنخفضة بسرعة. يستخدم بروتوكول 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/إيثرنت من الوصول إلى جهاز 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/إيثرنت. حان الوقت لاكتشاف الجهاز النهائي والوصول إليه الآن.
5- التعرّف على الخدمة
التعرّف على الخدمة باستخدام هاتف جوّال
نستخدم تطبيق متصفّح الخدمات لاكتشاف خدمات 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 آخر.
لا يتيح إصدار Android من تطبيق "محلل الشبكة" طلبات البحث عن mDNS لأداة ping، ولا يمكننا إرسال طلب بحث عن اسم المضيف ot-host.local
مباشرةً (يمكننا إرسال طلب بحث عن اسم المضيف باستخدام إصدار iOS من التطبيق).
اختبار الاتصال من مضيف Linux/macOS
يُرسِل "جهاز توجيه حدود الخيط" إعلانات أجهزة توجيه ICMPv6 (RA) للإعلان عن البادئات (من خلال خيار معلومات البادئة) والمسارات (من خلال خيار معلومات المسار) على رابط Wi-Fi/إيثرنت.
إعداد مضيف 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.
ما هي الخطوات التالية؟
اطّلِع على بعض هذه الدروس التطبيقية حول الترميز...