جهاز توجيه حدود مؤشر الترابط - إمكانية الاتصال ثنائي الاتجاه عبر IPv6 واكتشاف الخدمة المستندة إلى نظام أسماء النطاقات

1. مقدمة

699d673d05a55535.png

ما هو بروتوكول 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- التعرّف على الخدمة

التعرّف على الخدمة باستخدام هاتف جوّال

54a136a8940897cc.png

نستخدم تطبيق متصفّح الخدمات لاكتشاف خدمات 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" في صفحة تفاصيل مثيل الخدمة في تطبيق "متصفّح الخدمات".

bb992962e68d250b.png 888daa1df1e1a9bf.png

يمكننا الآن إرسال طلب اتصال إلى عنوان OMR باستخدام تطبيق Network Analyzer آخر.

لا يتيح إصدار Android من تطبيق "محلل الشبكة" طلبات البحث عن mDNS لأداة ping، ولا يمكننا إرسال طلب بحث عن اسم المضيف ot-host.local مباشرةً (يمكننا إرسال طلب بحث عن اسم المضيف باستخدام إصدار iOS من التطبيق).

اختبار الاتصال من مضيف Linux/macOS

يُرسِل "جهاز توجيه حدود الخيط" إعلانات أجهزة توجيه ICMPv6 (RA) للإعلان عن البادئات (من خلال خيار معلومات البادئة) والمسارات (من خلال خيار معلومات المسار) على رابط Wi-Fi/إيثرنت.

إعداد مضيف Linux

من المهم التأكّد من تفعيل RA وRIO على المضيف:

  1. يجب أن تكون قيمة net.ipv6.conf.wlan0.accept_ra 1 على الأقل في حال عدم تفعيل إعادة توجيه عنوان IP، و2 في حال عدم تفعيلها.
  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.

ما هي الخطوات التالية؟

اطّلِع على بعض هذه الدروس التطبيقية حول الترميز...

المستندات المرجعية