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

1 المقدمة

699d673d05a55535.png

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

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

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

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

OpenThread الحدود راوتر (OTBR) التي أطلقتها جوجل هو تنفيذ المصدر المفتوح من الموضوع راوتر الحدود.

ماذا ستبني

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

ماذا ستتعلم

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

ماذا ستحتاج

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

2. إعداد OTBR

قم بإعداد Raspberry Pi

انها بسيطة لإعداد جهاز التوت بي الطازجة مع rpi-imager أداة باتباع الإرشادات التي تظهر على raspberrypi.org (بدلا من استخدام أحدث التوت بي OS في أداة، وتحميل 2021/05/07-raspios للتحصينات-armhf -lite من نفسك). لإكمال خطوات الهاتف المحمول في مختبر الرموز هذا ، تحتاج إلى توصيل Raspberry Pi بواجهة Wi-Fi AP. اتبع هذا دليل على إنشاء اتصال لاسلكي. أنه لأمر مريح للدخول إلى التوت بي مع SSH، يمكنك العثور على تعليمات هنا .

احصل على كود OTBR

تسجيل الدخول إلى حسابك في بي توت العليق واستنساخ ot-br-posix من جيثب:

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

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

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

ابدأ OTBR وتحقق من الحالة

ربط مجلس nRF52840 إلى الخاص بي توت العليق وبدء 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. تشكيل شبكة موضوع

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

تشكيل شبكة موضوع مع 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

4. إعداد جهاز طرف عميل SRP

بناء وفلاش OT CLI

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

للانضمام الى شبكة الموضوع أنشأتها 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

5. انشر الخدمة على الجهاز النهائي

تم استخدام mDNS على نطاق واسع لنشر خدمة DNS-SD على الارتباط المحلي. لكن رسائل البث المتعدد تستهلك الكثير من النطاق الترددي وستستنفد البطارية للأجهزة منخفضة الطاقة بسرعة. يستخدم الموضوع وأحادي SRP بروتوكول لتسجيل خدماتها مع راوتر الحدود ويعتمد على راوتر الحدود للإعلان عن خدمات على صلة واي فاي أو إيثرنت.

يمكننا تسجيل الخدمة مع 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 كان ينبغي الإعلان عن الخدمة على / وصلة واي فاي إيثرنت. حان الوقت لاكتشاف الجهاز النهائي والوصول إليه الآن!

6. اكتشف الخدمة

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

54a136a8940897cc.png

نحن نستخدم متصفح خدمة التطبيقات لاكتشاف خدمات MDNS مع الهاتف الروبوت، و التطبيقات يعادل يمكن العثور عليها أيضا للأجهزة المحمولة دائرة الرقابة الداخلية. فتح التطبيق والخدمة _ipps._tcp ينبغي أن تظهر للتو.

اكتشف الخدمة مع مضيف 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 على ماك لحل هذه الخدمة:

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

bb992962e68d250b.png888daa1df1e1a9bf.png

يمكننا الآن ping على عنوان OMR مع آخر محلل شبكة التطبيقات.

للأسف، لا يعتمد الروبوت إصدار محلل التطبيقات شبكة MDNS الاستفسارات لفائدة بينغ، ونحن لا يمكن ping اسم المضيف ot-host.local مباشرة (يمكننا تنفيذ الأمر ping اسم المضيف مع نسخة دائرة الرقابة الداخلية من التطبيق).

Ping من مضيف Linux / macOS

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

قم بإعداد مضيف Linux

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

  1. net.ipv6.conf.wlan0.accept_ra يجب أن يكون على الأقل 1 إذا لم يتم تمكين إعادة توجيه الملكية الفكرية، و 2 خلاف ذلك.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen لا ينبغي أن يكون أصغر من 64 .

و accept_ra وتخلفت إلى 1 لمعظم التوزيعات. ولكن قد يكون هناك الشياطين الشبكة الأخرى التي ستتجاوز هذا الخيار (على سبيل المثال، dhcpcd على التوت بي ستتجاوز 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 الخيار على معظم توزيعات لينكس هو الافتراضي إلى 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 مع طلبات 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 ستفقد التكوين. إلحاق أدناه خطوط لملف التكوين dhcpcd (على سبيل المثال /etc/dhcpcd.conf ) لتعطيل صراحة IPv6 في dhcpcd:

noipv6
noipv6rs

تحتاج إلى إعادة التشغيل لتفعيل التغيير.

تحضير مضيف macOS

كلا accept_ra* هي الخيارات ممكنة افتراضيا، ولكن تحتاج إلى ترقية النظام إلى ما لا يقل عن ماك سور كبير.

قم باختبار اتصال اسم المضيف أو عنوان IPv6

يمكننا الآن تنفيذ الأمر ping اسم المضيف ot-host.local مع قيادة ping -6 ( 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
...

قد تفشل هذا الأمر على المضيفين لينكس مع "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 Border لتوفير اتصال IP ثنائي الاتجاه واكتشاف الخدمة للأجهزة الطرفية لـ Thread.

ماذا بعد؟

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

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