Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

موجه حدود الخيط - اتصال IPv6 ثنائي الاتجاه واكتشاف الخدمة المستندة إلى DNS

699d673d05a55535.png

ما هو موجه الحدود الموضوع؟

Thread هو بروتوكول شبكة لاسلكية منخفض الطاقة قائم على بروتوكول الإنترنت يتيح إجراء اتصالات آمنة من جهاز إلى جهاز ومن جهاز إلى شبكة سحابية. يمكن لشبكات الخيط أن تتكيف مع تغييرات الهيكل لتجنب نقطة واحدة من الفشل.

يقوم موجه الحدود الخيط بتوصيل شبكة Thread بشبكات أخرى قائمة على IP ، مثل Wi-Fi أو Ethernet. تتطلب شبكة مؤشر الترابط جهاز توجيه حدود للاتصال بالشبكات الأخرى. يدعم Thread Border Router الوظائف التالية إلى الحد الأدنى:

  • اتصال IP ثنائي الاتجاه بين شبكات Wi-Fi / Ethernet.
  • اكتشاف الخدمة ثنائية الاتجاه عبر mDNS (على ارتباط Wi-Fi / Ethernet) و SRP (على شبكة الخيط).
  • خيط عبر البنية التحتية التي تدمج أقسام الخيط عبر الروابط المستندة إلى IP.
  • التكليف بالخيط الخارجي (على سبيل المثال ، الهاتف المحمول) لمصادقة جهاز Thread وضمه إلى شبكة Thread.

OpenThread Border Router (OTBR) الذي أصدرته Google هو تطبيق مفتوح المصدر لـ Thread Border Router.

ما ستبنيه

في معمل الرموز هذا ، ستقوم بإعداد موجه حدود الموضوع وتوصيل هاتفك المحمول بجهاز Thread End عبر Border Router.

ماذا ستتعلم

  • كيفية إعداد OTBR
  • كيفية تكوين شبكة موضوع باستخدام OTBR
  • كيفية بناء جهاز OpenThread CLI مع ميزة SRP
  • كيفية تسجيل الخدمة مع SRP
  • كيفية اكتشاف والوصول إلى جهاز نهاية الموضوع.

ماذا ستحتاج

  • جهاز Raspberry Pi 3/4 وبطاقة SD بسعة 8 جيجابايت على الأقل.
  • 2 من لوحات ديف نورديك لأشباه الموصلات nRF52840 .
  • تم تمكين Wi-Fi AP بدون حماية إعلان IPv6 Router على جهاز التوجيه.
  • هاتف iOS يعمل بنظام iOS 14 على الأقل أو هاتف Android يعمل بنظام Android 8.1 على الأقل.

قم بإعداد Raspberry Pi

من السهل إعداد جهاز Raspberry Pi جديد باستخدام أداة rpi-imager باتباع الإرشادات الموجودة على raspberrypi.org (بدلاً من استخدام أحدث نظام تشغيل Raspberry Pi في الأداة ، قم بتنزيل raspbian-2020-02-14 بنفسك). لإكمال خطوات الهاتف المحمول في مختبر الرموز هذا ، تحتاج إلى توصيل Raspberry Pi بواجهة Wi-Fi AP. اتبع هذا الدليل لإعداد الاتصال اللاسلكي. من المريح تسجيل الدخول إلى Raspberry Pi باستخدام SSH ، يمكنك العثور على التعليمات هنا .

احصل على كود OTBR

تسجيل الدخول إلى Raspberry Pi الخاص بك واستنساخ ot-br-posix من GitHub:

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

بناء وتثبيت OTBR

يحتوي OTBR على نصين برمجيين يقومان بتمهيد وإعداد جهاز توجيه الحدود الموضوع:

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

يعمل OTBR على كل من واجهة مؤشر الترابط وواجهة شبكة البنية التحتية (مثل Wi-Fi / Ethernet) المحددة باستخدام INFRA_IF_NAME . يتم إنشاء واجهة مؤشر الترابط بواسطة OTBR نفسها وتسمى wpan0 افتراضيًا wpan0 البنية التحتية قيمة افتراضية wlan0 إذا لم يتم تحديد INFRA_IF_NAME بشكل صريح. إذا كان جهاز Raspberry Pi الخاص بك متصلاً عن طريق كبل Ethernet ، فحدد اسم واجهة Ethernet (مثل 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 في وضع Radio Co-Processor (RCP). في هذا الوضع ، يتم تشغيل مكدس OpenThread على جانب المضيف ويرسل / يستقبل الإطارات عبر جهاز الإرسال والاستقبال IEEE802.15.4.

اتبع الخطوة 4 من هذا البرنامج التدريبي لإنشاء جهاز nRF52840 RCP وفلاشه. أنت بحاجة إلى خيار إضافي -DOT_THREAD_VERSION=1.2 :

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

ابدأ 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

يوجد أمر ot-ctl يمكن استخدامه للتحكم في خدمة otbr-agent . يقبل ot-ctl جميع أوامر OpenThread CLI ، راجع OpenThread CLI Guide لمزيد من التفاصيل.

تشكيل شبكة موضوع مع 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) البادئة في الموضوع بيانات الشبكة:

$ 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

بناء وفلاش OT CLI

اتبع الخطوة 5 من معمل الرموز هذا لإنشاء جهاز نهاية 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

ثم ابدأ واجهة الموضوع:

> ifconfig up
Done
> Thread start
Done

انتظر بضع ثوانٍ وتحقق مما إذا كان الانضمام إلى شبكة سلاسل الرسائل ناجحًا أم لا:

> 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 ويعتمد على Border Router للإعلان عن الخدمات على ارتباط 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 على _ipps._tcp Wi-Fi / Ethernet. حان الوقت لاكتشاف الجهاز النهائي والوصول إليه الآن!

اكتشف الخدمة بهاتف محمول

54a136a8940897cc.png

نستخدم تطبيق متصفح الخدمة لاكتشاف خدمات mDNS باستخدام هاتف Android ، ويمكن أيضًا العثور على تطبيق مكافئ لأجهزة iOS المحمولة. افتح التطبيق _ipps._tcp الخدمة _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     ""
...

بينغ من هاتف محمول

خذ هاتف Pixel كمثال ، يمكننا معرفة عنوان OMR للخدمة المسجلة سابقًا "ot-service" في صفحة التفاصيل الخاصة بمثيل الخدمة في تطبيق متصفح الخدمة.

bb992962e68d250b.png888daa1df1e1a9bf.png

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

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

Ping من مضيف Linux / macOS

يرسل Thread Border Router إعلانات جهاز التوجيه ICMPv6 (RA) للإعلان عن البادئات (عبر خيار معلومات البادئة) والمسارات (عبر خيار معلومات المسار) على رابط Wi-Fi / Ethernet.

قم بإعداد مضيف 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 بشكل accept_ra إلى 1 لمعظم التوزيعات. ولكن قد يكون هناك شياطين أخرى للشبكة dhcpcd هذا الخيار (على سبيل المثال ، 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 ، accept_ra_rt_info_max_plen على 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 مع طلبات RAs المطلوبة. خيار آخر هو إعادة تشغيل وظيفة Border Routing على Border Router:

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

إذا كنت تحاول إعادة الاتصال واي فاي أو إعادة تشغيل واجهة إيثرنت، تأكد من أن dhcpcd لا يستخدم لإدارة الخاص بك شبكة WiFi- / إيثرنت الإصدار IPv6. نظرًا لأن dhcpcd يتخطى دائمًا خيار accept_ra كل مرة يتم فيها إعادة تشغيل الواجهة 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 لنظام ping6 ):

$ 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
...

لإزالة العنوان والخدمة المسجلة من عقدة عميل SRP:

> srp client host remove
Done

يجب ألا تكون قادرًا على اكتشاف خدمة _ipps._tcp الآن.

تهانينا ، لقد نجحت في إعداد OTBR كجهاز توجيه Thread Border لتوفير اتصال IP ثنائي الاتجاه واكتشاف الخدمة للأجهزة الطرفية لـ Thread.

ماذا بعد؟

تحقق من بعض مختبرات الرموز هذه ...

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