أنشِئ شبكة Thread باستخدام لوحات nRF52840 وOpenThread

لمحة عن هذا الدرس التطبيقي حول الترميز
schedule88 دقيقة
subjectتاريخ التعديل الأخير: 24 أبريل 2025
account_circleتأليف: Jeff Bumgardner

1. مقدمة

26b7f4f6b3ea0700.png

OpenThread هو بروتوكول شبكة مفتوح المصدر أصدرته Google، وهو يستند إلى Thread®. أصدرت Google Nest بروتوكول OpenThread لتوفير التكنولوجيا المستخدَمة في منتجات Nest على نطاق واسع للمطوّرين من أجل تسريع تطوير المنتجات للشبكة المنزلية المتصلة.

تحدِّد مواصفات Thread بروتوكول اتصال لاسلكي موثوق وآمن وقليل الاستهلاك للطاقة بين الأجهزة المستند إلى IPv6 للتطبيقات المنزلية. ينفِّذ OpenThread جميع طبقات شبكة Thread، بما في ذلك IPv6 و6LoWPAN وIEEE 802.15.4 مع أمان MAC وإنشاء رابط الشبكة وتوجيه الشبكة.

في هذا الدليل التعليمي حول البرمجة، ستبرمج OpenThread على أجهزة حقيقية، وستنشئ شبكة Thread وتُديرها، وستُرسِل الرسائل بين العقد.

4806d16a8c137c6d.jpeg

المُعطيات

  • إنشاء ملفات OpenThread CLI الثنائية وفلاشها على لوحات المطوّرين
  • إنشاء وحدة تحكم في حدود الشبكة (RCP) تتألف من جهاز Linux ولوحة تطوير
  • التواصل مع وحدة التحكّم في الطاقة (RCP) باستخدام OpenThread Daemon وot-ctl
  • إدارة عقد Thread يدويًا باستخدام GNU Screen وواجهة سطر أوامر OpenThread
  • تفعيل الأجهزة بأمان على شبكة Thread
  • آلية عمل البث المتعدد لبروتوكول IPv6
  • تمرير الرسائل بين عقد Thread باستخدام بروتوكول UDP

المتطلبات

الأجهزة:

  • 3 لوحات تطوير nRF52840 من Nordic Semiconductor
  • 3 كابلات USB إلى منفذ USB صغير لتوصيل اللوحات
  • جهاز Linux مزوّد بثلاثة منافذ USB على الأقل

البرامج:

  • مجموعة أدوات GNU
  • أدوات سطر الأوامر في Nordic nRF5x
  • برنامج Segger J-Link
  • OpenThread
  • Git

2. الخطوات الأولى

محاكاة OpenThread

قبل البدء، ننصحك بالاطّلاع على Codelab محاكاة OpenThread للتعرّف على المفاهيم الأساسية لبروتوكول Thread وواجهة OpenThread CLI.

محطات المنافذ التسلسلية

يجب أن تكون على دراية بكيفية الاتصال بمنفذ تسلسلي من خلال وحدة تحكّم. يستخدم هذا الإصدار من Codelab برنامج GNU Screen ويقدّم نظرة عامة على الاستخدام، ولكن يمكن استخدام أي برنامج آخر لواجهة سطر الأوامر.

جهاز Linux

تم تصميم هذا الدرس الدراسي حول رموز البرامج لاستخدام جهاز Linux المستنِد إلى i386 أو x86 ليكون مضيفًا لجهاز Thread المزوّد بمعالج مساعد للراديو (RCP) ولفلاش جميع لوحات تطوير Thread. تم اختبار جميع الخطوات على نظام التشغيل Ubuntu 14.04.5 LTS (Trusty Tahr).

لوحات Nordic Semiconductor nRF52840

يستخدم هذا الدرس التطبيقي ثلاث لوحات nRF52840 PDK.

a6693da3ce213856.png

نستخدم SEGGER J-Link لبرمجة لوحات nRF52840 التي تحتوي على وحدات JTAG مدمجة. ثبِّت هذا البرنامج على جهاز Linux.

نزِّل الحزمة المناسبة لجهازك وثبِّتها في المكان المناسب. في نظام التشغيل Linux، يكون هذا الخيار /opt/SEGGER/JLink.

تثبيت أدوات سطر الأوامر nRF5x

تتيح لك أدوات سطر أوامر nRF5x فلاش ترميزات OpenThread الثنائية على لوحات nRF52840. ثبِّت الإصدار المناسب من nRF5x-Command-Line-Tools-<OS> على جهاز Linux.

ضع الحزمة التي تم استخراجها في المجلد الجذر ~/.

تثبيت ARM GNU Toolchain

يتم استخدام مجموعة أدوات ARM GNU toolchain لعملية الإنشاء.

ننصحك بوضع الأرشيف المستخرَج في /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ على جهاز Linux. اتّبِع التعليمات الواردة في ملف readme.txt في الأرشيف للحصول على تعليمات التثبيت.

شاشة التثبيت (اختيارية)

‫Screen هي أداة بسيطة للوصول إلى الأجهزة المتصلة بمنفذ تسلسلي. يستخدم هذا الدرس التطبيقي برنامج Screen، ولكن يمكنك استخدام أي تطبيق منتقِل للمنافذ التسلسلية تريده.

$ sudo apt-get install screen

3- استنساخ المستودعات

OpenThread

انسخ OpenThread وثبِّته. تتأكّد أوامر script/bootstrap من تثبيت سلسلة الأدوات وضبط البيئة بشكل صحيح:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

إنشاء برنامج OpenThread الخفي:

$ script/cmake-build posix -DOT_DAEMON=ON

أنت الآن جاهز لإنشاء OpenThread وبرمجته على لوحات nRF52840.

4. إعداد أداة "ربط المحتوى في تطبيقات البث"

الإنشاء والفلاش

أنشئ مثال OpenThread nRF52840 باستخدام وظائف Joiner وUSB الأصلية. يستخدم الجهاز دور "المشترِك" ليتم مصادقةه وإعداده بأمان على شبكة Thread. يتيح USB الأصلي استخدام USB CDC ACM كوسيط نقل تسلسلي بين nRF52840 والمضيف.

عليك دائمًا تنظيف مستودع النُسخ السابقة أولاً من خلال تشغيل rm -rf build.

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

انتقِل إلى الدليل الذي يتضمّن ملف OpenThread RCP الثنائي، واحوِّله إلى تنسيق سداسي عشري:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

اربط كابل USB بمنفذ تصحيح أخطاء USB الصغير بجانب دبوس الطاقة الخارجي على لوحة nRF52840، ثم وصِّله بجهاز Linux. اضبط مفتاح مصدر الطاقة في nRF على لوحة nRF52840 على VDD. عند التوصيل بشكل صحيح، يضيء LED5.

20a3b4b480356447.png

إذا كانت هذه هي اللوحة الأولى التي تم توصيلها بجهاز Linux، ستظهر على أنّها المنفذ التسلسلي /dev/ttyACM0 (تستخدم جميع لوحات nRF52840 الرمز ttyACM لمعرّف المنفذ التسلسلي).

$ ls /dev/ttyACM*
/dev/ttyACM0

يُرجى تدوين الرقم التسلسلي للوحة nRF52840 المستخدَمة في وحدة التحكّم عن بُعد:

c00d519ebec7e5f0.jpeg

انتقِل إلى موقع "أدوات سطر أوامر nRFx"، وفلش ملف OpenThread RCP سداسي الأجزاء على لوحة nRF52840 باستخدام الرقم التسلسلي للوحة. يُرجى العِلم أنّه في حال حذف العلامة --verify، ستظهر لك رسالة تحذير تفيد بأنّ عملية الفلاش قد تتعذّر بدون ظهور خطأ.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

يتم إنشاء الإخراج التالي عند نجاح العملية:

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

أدخِل تصنيف "RCP" للوحة لكي لا تختلط عليك أدوار المجلس لاحقًا.

الاتصال بجهاز USB أصلي

بما أنّ إصدار OpenThread RCP يتيح استخدام وحدة التحكّم في الاتصال (ACM) الأصلية عبر USB كوسيط نقل تسلسلي، يجب استخدام منفذ nRF USB على لوحة nRF52840 للتواصل مع مضيف RCP (جهاز Linux).

عليك فصل طرف كابل USB المصغّر من منفذ تصحيح الأخطاء في لوحة nRF52840 التي تم فلاشها، ثم إعادة توصيله بمنفذ nRF USB المصغّر بجانب زر إعادة الضبط. اضبط مفتاح التبديل مصدر الطاقة في جهاز nRF على USB.

46e7b670d2464842.png

بدء برنامج OpenThread الخفي

في تصميم RCP، استخدِم OpenThread Daemon للتواصل مع جهاز Thread وإدارته. ابدأ ot-daemon باستخدام العلامة -v التفصيلية حتى تتمكّن من الاطّلاع على إخراج السجلّ والتأكّد من تشغيله:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'

عند نجاح عملية التنفيذ، يُنشئ ot-daemon في الوضع التفصيلي ناتجًا مشابهًا لما يلي:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

اترك نافذة المحطة الطرفية هذه مفتوحة حتى تتمكّن من الاطّلاع على السجلات من ot-daemon.

استخدِم ot-ctl للتواصل مع عقدة RCP. يستخدم تطبيق ot-ctl واجهة برمجة التطبيقات نفسها المستخدَمة في تطبيق OpenThread CLI. وبالتالي، يمكنك التحكّم في عقد ot-daemon بالطريقة نفسها المستخدَمة في أجهزة Thread المحاكية الأخرى.

في نافذة وحدة طرفية ثانية، ابدأ ot-ctl:

$ sudo ./build/posix/src/posix/ot-ctl
>

تحقَّق من state للعقدة 2 (عقدة RCP) التي بدأتها باستخدام ot-daemon:

> state
disabled
Done

5- إعداد وحدات FTD

عقدتا Thread الأخريان المستخدَمتان في هذا الدليل التعليمي هما Full Thread Devices (FTDs) على تصميم System-on-Chip (SoC) العادي. في الإعدادات العلنية، يمكن استخدام wpantund، وهو برنامج تشغيل واجهة شبكة من فئة الإنتاج، للتحكّم في مثيلات OpenThread NCP، ولكن في هذا الدرس التطبيقي حول الترميز، سنستخدم ot-ctl، وهو واجهة سطر أوامر OpenThread.

يعمل جهاز واحد كمفوّض لمصادقة الأجهزة وتفعيلها بأمان على تلك الشبكة. يعمل الجهاز الآخر كجهاز "مُدرِج" يمكن للمشرف المصادقة عليه في شبكة Thread.

الإنشاء والفلاش

أنشئ مثال OpenThread FTD لمنصّة nRF52840 مع تفعيل دورَي "المفوّض" و"المشارِك":

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

انتقِل إلى الدليل الذي يتضمّن ملف OpenThread Full Thread Device (FTD) CLI الثنائي، واحوِّله إلى تنسيق سداسي عشري:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

اربط كابل USB بمنفذ USB الصغير بجانب دبوس الطاقة الخارجي في لوحة nRF52840، ثم وصِّله بجهاز Linux. إذا كان جهاز RCP لا يزال متصلاً بجهاز Linux، من المفترض أن تظهر هذه اللوحة الجديدة على أنّها المنفذ التسلسلي /dev/ttyACM1 (تستخدم جميع لوحات nRF52840 الرمز ttyACM لمعرّف المنفذ التسلسلي).

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

كما في السابق، يُرجى تدوين الرقم التسلسلي للوحة nRF52840 المستخدَمة في FTD:

c00d519ebec7e5f0.jpeg

انتقِل إلى موقع "أدوات سطر أوامر nRFx"، وفلش ملف OpenThread CLI FTD سداسي الأحرف على لوحة nRF52840، باستخدام الرقم التسلسلي للوحة:

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

أدخِل تصنيف "مفوّض" للوحة.

الاتصال بجهاز USB أصلي

بما أنّ إصدار OpenThread FTD يتيح استخدام وحدة التحكّم في تسلسل الإرسال والاستقبال (ACM) الأصلية في USB لنقل البيانات التسلسلي، عليك استخدام منفذ nRF USB على لوحة nRF52840 للتواصل مع مضيف RCP (جهاز Linux).

عليك فصل طرف كابل USB المصغّر من منفذ تصحيح الأخطاء في لوحة nRF52840 التي تم فلاشها، ثم إعادة توصيله بمنفذ nRF USB المصغّر بجانب زر إعادة الضبط. اضبط مفتاح التبديل مصدر الطاقة في جهاز nRF على USB.

46e7b670d2464842.png

التحقّق من الإصدار

تأكَّد من نجاح عملية الإنشاء من خلال الوصول إلى واجهة سطر أوامر OpenThread باستخدام GNU Screen من نافذة طرفية.

$ screen /dev/ttyACM1

في النافذة الجديدة، اضغط على مفتاح Return (إرجاع) على لوحة المفاتيح عدة مرات لعرض طلب > OpenThread CLI. اعرض واجهة IPv6 وتحقّق من العناوين:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

استخدام Ctrl+a →

d لفصل الشاشة عن وحدة تحكّم واجهة برمجة التطبيقات لفوترة حدود الجلسة والرجوع إلى وحدة تحكّم Linux حتى يمكن فلاش اللوحة التالية. لإعادة الدخول إلى واجهة سطر الأوامر في أي وقت، استخدِم screen -r من سطر الأوامر. للاطّلاع على قائمة بالشاشات المتاحة، استخدِم screen -ls:

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

إعداد أداة "ربط FTD"

كرِّر العملية أعلاه لبرمجة لوحة nRF52840 الثالثة باستخدام الإصدار الحالي من ot-cli-ftd.hex. عند الانتهاء، احرص على إعادة توصيل اللوحة بالكمبيوتر الشخصي باستخدام منفذ USB في nRF وضبط مفتاح مصدر طاقة nRF على VDD.

إذا تم ربط العقدتَين الأخرتَين بجهاز Linux عند ربط هذه اللوحة الثالثة، من المفترض أن تظهر على أنّها المنفذ التسلسلي /dev/ttyACM2:

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

أدخِل تصنيف "موصّل" للوحة.

عند التحقّق باستخدام Screen، بدلاً من إنشاء مثيل جديد من Screen من سطر الأوامر، يمكنك إعادة الربط بالمثيل الحالي وإنشاء نافذة جديدة فيه (التي استخدمتها لمفوّض FTD):

$ screen -r

أنشئ النافذة الجديدة داخل الشاشة باستخدام Ctrl+a → c.

سيظهر لك موجِّه سطر أوامر جديد. يمكنك الوصول إلى واجهة سطر أوامر OpenThread لبرنامج FTD Joiner باتّباع الخطوات التالية:

$ screen /dev/ttyACM2

في هذه النافذة الجديدة، اضغط على مفتاح Return (إرجاع) على لوحة المفاتيح عدة مرات لعرض طلب OpenThread CLI >. اعرض واجهة IPv6 وتحقّق من العناوين:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

بما أنّ واجهة سطر أوامر أداة ربط FTD متوفّرة في نسخة الشاشة نفسها التي تتوفّر فيها أداة تنسيق FTD، يمكنك التبديل بينهما باستخدام Ctrl+a → n.

استخدام Ctrl+a →

d في أي وقت للخروج من ميزة "الشاشة"

6. إعداد نافذة المحطة الطرفية

من الآن فصاعدًا، ستتمكّن من التبديل بين أجهزة Thread بشكل متكرّر، لذا تأكّد من أنّها جميعًا قيد الاستخدام ويمكن الوصول إليها بسهولة. حتى الآن، كنّا نستخدم أداة Screen للوصول إلى جهازَي FTD، وتتيح هذه الأداة أيضًا تقسيم الشاشة في نافذة المحطة الطرفية نفسها. استخدِم هذا الخيار لمعرفة كيفية تفاعل عقدة مع الأوامر الصادرة عن عقدة أخرى.

من المفترض أن تظهر لك أربع نوافذ على النحو التالي:

  1. خدمة ot-daemon / السجلات
  2. RCP Joiner عبر ot-ctl
  3. مفوّض FTD عبر واجهة سطر أوامر OpenThread
  4. FTD Joiner عبر OpenThread CLI

إذا أردت استخدام أداة أو إعدادات المحطة الطرفية / المنفذ التسلسلي، يمكنك تخطّي هذه الخطوة والانتقال إلى الخطوة التالية. يمكنك ضبط نوافذ المحطة الطرفية لجميع الأجهزة بالطريقة التي تناسبك.

استخدام الشاشة

لتسهيل الاستخدام، ابدأ جلسة واحدة فقط من جلسات "الشاشة". من المفترض أن يكون لديك مفتاح من وقت إعداد كلتا وحدات التحكّم في حدود الجلسة.

تبدأ جميع الأوامر ضمن الشاشة بـ Ctrl+a.

الأوامر الأساسية للشاشة:

إعادة الربط بجلسة Screen (من سطر الأوامر)

screen -r

مغادرة جلسة "الشاشة"

Ctrl+a → d

إنشاء نافذة جديدة ضمن جلسة الشاشة

Ctrl+a → c

التبديل بين النوافذ في جلسة "الشاشة" نفسها

Ctrl+a → n (للأمام)Ctrl+a → p (للخلف)

إغلاق النافذة الحالية في جلسة Screen

Ctrl+a → k

تقسيم الشاشة

باستخدام Screen، يمكنك تقسيم وحدة التحكّم في المحطة إلى نوافذ متعددة:

f1cbf1258cf0a5a.png

يتم الوصول إلى الأوامر في screen باستخدام Ctrl+a. يجب أن يبدأ كلّ أمر بمجموعة مفاتيح الوصول هذه.

إذا كنت تتّبع خطوات Codelab بدقة، من المفترض أن تظهر لك نافذتان (مفوّض FTD ومُشارِك FTD) في مثيل الشاشة نفسه. لتقسيم الشاشة بين التطبيقَين، عليك أولاً الدخول إلى جلسة "الشاشة" الحالية:

$ screen -r

يجب أن تكون تستخدم أحد أجهزة FTD. اتّبِع الخطوات التالية في "الشاشة":

  1. Ctrl ‏+ a → S لتقسيم النافذة أفقيًا
  2. Ctrl+a → Tab لنقل المؤشر إلى النافذة الجديدة الفارغة
  3. Ctrl+a → n للتبديل من هذه النافذة الجديدة إلى النافذة التالية
  4. إذا كان مطابقًا للنافذة العلوية، اضغط على Ctrl+a → n مرة أخرى لعرض جهاز FTD الآخر.

أصبح كلاهما مرئيًا الآن. يمكنك التبديل بينهما باستخدام Ctrl+a → Tab. ننصحك بإعادة تسمية كل نافذة باستخدام Ctrl+a → A لتجنّب حدوث التباس.

الاستخدام المتقدم

لتقسيم الشاشة إلى أرباع إضافية وعرض سجلات ot-daemon و"أداة ربط RCP" ot-ctl، يجب بدء هذه الخدمات ضمن مثيل الشاشة نفسه. لإجراء ذلك، أوقِف ot-daemon واخرج من ot-ctl، ثم أعِد تشغيلهما في نوافذ شاشة جديدة (Ctrl+a → c).

هذا الإعداد غير مطلوب ويتم تركه كتدريب للمستخدم.

يمكنك تقسيم النوافذ والتنقّل بينها باستخدام الأوامر التالية:

إنشاء نافذة جديدة

Ctrl+a → c

تقسيم النافذة عموديًا

Ctrl+a →

تقسيم النافذة أفقيًا

Ctrl+a → S

الانتقال إلى النافذة التالية المعروضة

Ctrl+a → Tab

تبديل النافذة المعروضة إلى الأمام أو الخلف

Ctrl+a → n أو p

إعادة تسمية النافذة الحالية

Ctrl+a → A

يمكنك مغادرة الشاشة في أي وقت باستخدام Ctrl+a → d وإعادة الربط باستخدام screen -r من سطر الأوامر.

لمزيد من المعلومات حول Screen، اطّلِع على مرجع GNU Screen السريع.

7- إنشاء شبكة Thread

بعد ضبط جميع نوافذ المحطة الطرفية والشاشات، لننشئ شبكة Thread. في مفوّض FTD، أنشئ مجموعة بيانات تشغيلية جديدة واضبطها على أنّها مجموعة البيانات النشطة. مجموعة البيانات التشغيلية هي الإعدادات لشبكة Thread التي تنشئها.

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

يُرجى تدوين مفتاح الشبكة 1234c0de7ab51234c0de7ab51234c0de الذي سيتم استخدامه لاحقًا.

اضبط مجموعة البيانات هذه على أنّها مجموعة البيانات النشطة:

> dataset commit active
Done

اعرض واجهة IPv6:

> ifconfig up
Done

بدء تشغيل بروتوكول Thread:

> thread start
Done

بعد لحظات، تحقَّق من حالة الجهاز. يجب أن يكون "القائد". يمكنك أيضًا الحصول على RLOC16 للرجوع إليه في المستقبل.

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

تحقَّق من عناوين IPv6 للجهاز:

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

أصبحت شبكة "codelab" مرئية الآن عند فحصها من أجهزة Thread الأخرى.

من ot-ctl في RCP Joiner:

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

من وحدة تحكّم سطر الأوامر OpenThread على FTD Joiner:

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

إذا لم تظهر شبكة "codelab" في القائمة، حاوِل المسح الضوئي مرة أخرى.

8. إضافة أداة ربط RCP

لا تكون عملية إعداد Thread مفعّلة على الشبكة، ما يعني أنّنا سنحتاج إلى إضافة أداة ربط RCP إلى شبكة Thread التي أنشأناها للتو باستخدام عملية إعداد خارج النطاق.

في مفوّض FTD، سجّلنا مفتاح الشبكة، على سبيل المثال 1234c0de7ab51234c0de7ab51234c0de. إذا كنت بحاجة إلى البحث عن مفتاح الشبكة مرة أخرى، نفِّذ الأمر التالي على مفوّض FTD:

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

بعد ذلك، في مُجمِّع RCP، اضبط مفتاح شبكة مجموعة البيانات النشطة على مفتاح شبكة مفوض FTD:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

تحقّق من مجموعة البيانات للتأكّد من ضبطها بشكل صحيح.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

افتح سلسلة المحادثات لكي ينضم "مُنشئ جلسة RCP" إلى شبكة "codelab". انتظِر بضع ثوانٍ، وتحقَّق من الحالة وRLOC16 وعناوين IPv6:

## RCP Joiner ##
----------------

> ifconfig up
Done
> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

دوِّن عنوان IPv6 المحلي للشبكة (fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f هنا)، وسيتم استخدامه لاحقًا.

في صفحة مفوّض FTD، راجِع جداول جهاز التوجيه والجدول الفرعي للتأكّد من أنّ كلا الجهازَين جزء من الشبكة نفسها. استخدِم RLOC16 لتحديد "مُنشئ جلسة RCP".

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

يمكنك فحص الاتصال بالعنوان المحلي للشبكة لوحدة ربط RCP (العنوان المحلي للشبكة الذي تم الحصول عليه من ipaddr وحدة ربط RCP) للتحقّق من إمكانية الاتصال:

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

لدينا الآن شبكة Thread تتألف من عقدتَين، كما هو موضّح في مخطّط الطوبولوجيا هذا:

otcodelab_top01C_2nodes.png

مخطّطات الطوبولوجيا

أثناء العمل على بقية ورشة Codelab، سنعرض مخطّطًا بيانيًا جديدًا لبنية Thread عند تغيُّر حالة الشبكة. يتم الإشارة إلى أدوار العقد على النحو التالي:

b75a527be4563215.png

تكون أجهزة التوجيه دائمًا خماسية الأضلاع، وتكون الأجهزة الطرفية دائمًا دائرية. تمثّل الأرقام في كلّ عقدة رقم تعريف جهاز التوجيه أو رقم تعريف الجهاز الفرعي المعروض في ناتج واجهة سطر الأوامر، وذلك استنادًا إلى الدور والحالة الحاليَين لكلّ عقدة في ذلك الوقت.

9- تفعيل أداة ربط FTD

لنضيف الآن جهاز Thread الثالث إلى شبكة "codelab". سنستخدم هذه المرة عملية التفعيل داخل النطاق الأكثر أمانًا، ولن نسمح إلا بمشاركة "مُنشئ مجموعات FTD".

على مُدرِج بيانات FTD، احصل على eui64 ليتمكّن مفوض FTD من التعرّف عليه:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

في مفوّض FTD، ابدأ المفوّض وحدِّد eui64 للجهاز الذي يمكنه الانضمام، بالإضافة إلى بيانات اعتماد المُدرِج، على سبيل المثال J01NME. شهادة اعتماد المشارِك هي سلسلة خاصة بالجهاز تتألف من جميع الأحرف الأبجدية الرقمية الكبيرة (من 0 إلى 9 ومن A إلى Y، باستثناء I وO وQ وZ لسهولة القراءة)، ويبلغ طولها بين 6 و32 حرفًا.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

انتقِل إلى FTD Joiner. ابدأ دور "المُشارِك" باستخدام بيانات اعتماد "المُشارِك" التي تم إعدادها للتو في "مفوّض FTD":

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

في غضون دقيقة أو نحو ذلك، ستتلقّى رسالة تأكيد على نجاح عملية المصادقة:

## FTD Joiner ##
----------------

>
Join success

افتح Thread لكي ينضمّ "مُنشئ الجلسة" إلى شبكة "codelab"، وتحقّق على الفور من الحالة وRLOC16:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

تحقَّق من عناوين IPv6 للجهاز. يُرجى العلم أنّه لا يتوفّر رقم ALOC. ويعود السبب في ذلك إلى أنّ هذا الجهاز ليس هو الجهاز الرئيسي، ولا يشغل دورًا خاصًا بتقنية Anycast يتطلّب الحصول على عنوان ALOC.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

انتقِل فورًا إلى مفوّض FTD وتحقّق من جداول جهاز التوجيه والأجهزة الفرعية للتأكّد من توفّر ثلاثة أجهزة في شبكة "codelab":

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

استنادًا إلى RLOC16، تم ربط أداة ربط FTD بالشبكة كجهاز طرفي (جهاز تابع). في ما يلي البنية المحدَّثة:

otcodelab_top01C_ed01.png

10. مثال على سلسلة محادثات

أجهزة Thread في هذا الدليل التعليمي هي نوع محدّد من أجهزة Thread الكاملة (FTD) تُعرف باسم "الأجهزة الطرفية المؤهَّلة للاتصال بالراوتر" (REED). وهذا يعني أنّه يمكن أن يعمل كجهاز توجيه أو جهاز طرفي، ويمكنه ترقية نفسه من جهاز طرفي إلى جهاز توجيه.

يمكن أن يتضمّن الخيط ما يصل إلى 32 جهاز توجيه، ولكنّه يحاول إبقاء عدد أجهزة التوجيه بين 16 و23. إذا تم ربط جهاز REED كجهاز نهائي (فرعي) وكان عدد أجهزة التوجيه أقل من 16 جهازًا، يتم ترقيته تلقائيًا إلى جهاز توجيه بعد فترة زمنية عشوائية في غضون دقيقتين.

إذا كان لديك جهازان فرعيان في شبكة Thread بعد إضافة "جهاز ربط FTD"، انتظِر لمدة دقيقتين على الأقل، ثم أعِد التحقّق من جداول جهاز التوجيه والأجهزة الفرعية في مفوّض FTD:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

تم ترقية أداة ربط FTD (عنوان MAC الموسّع = e6cdd2d93249a243) إلى جهاز توجيه. يُرجى العِلم أنّ RLOC16 مختلف (b800 بدلاً من 0c02). ويرجع ذلك إلى أنّ RLOC16 يستند إلى رقم تعريف جهاز التوجيه ورقم تعريف الجهاز الفرعي. عند الانتقال من "الجهاز الطرفي" إلى "الراوتر"، تتغيّر قيم "رقم تعريف جهاز التوجيه" و"رقم تعريف الجهاز الفرعي"، وكذلك "عنوان RLOC16".

otcodelab_top01C.png

تأكَّد من الحالة الجديدة وRLOC16 على FTD Joiner:

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

الرجوع إلى إصدار سابق من أداة ربط FTD

يمكنك اختبار هذا السلوك عن طريق الرجوع يدويًا إلى إصدار أقدم من موصّل FTD من جهاز توجيه إلى جهاز طرفي. غيِّر الحالة إلى "فرع" وتحقّق من RLOC16:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

في صفحة مفوّض FTD، من المفترض أن يظهر الآن "مُدرِج FTD" في الجدول الفرعي (رقم التعريف = 3). وقد يكون الجهاز في كلا الجهازَين أثناء عملية النقل:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

وبعد مرور بعض الوقت، سيعود إلى جهاز توجيه يتضمّن عنوان RLOC‏ b800.

otcodelab_top01C.png

إزالة القائد

يتم اختيار "القائد" ذاتيًا من بين جميع "أجهزة توجيه المواضيع". وهذا يعني أنّه في حال إزالة الجهاز الرئيسي الحالي من شبكة Thread، سيصبح أحد أجهزة التوجيه الأخرى هو الجهاز الرئيسي الجديد.

في مفوّض FTD، أوقِف Thread لإزالته من شبكة Thread:

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

خلال دقيقتين، يصبح مشارِك FTD قائد السلسلة الجديدة. تحقَّق من حالة عناوين IPv6 و"أداة الربط في FTD" للتأكّد مما يلي:

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

راجِع الجدول الفرعي. يُرجى ملاحظة أنّ هناك RLOC16 جديدًا. هذا هو جهاز "موصّل RCP"، كما هو موضّح بمعرّفه وعنوان MAC الموسّع. وللحفاظ على شبكة Thread معًا، تم تبديل أجهزة التوجيه الرئيسية، من "مفوّض FTD" إلى "موصّل FTD". يؤدي ذلك إلى إنشاء عنوان RLOC16 جديد لوحدة "ربط RCP" (لأنّ رقم تعريف جهاز التوجيه تغيّر من 3 إلى 46).

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

قد تحتاج إلى الانتظار لبضع دقائق حتى يتم إرفاق مُجمِّع RCP بـ "مُجمِّع FTD" كعنصر تابع. تحقَّق من الحالة وRLOC16 لتأكيد ما يلي:

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

إعادة إرفاق مفوض FTD

لا تُعدّ شبكة Thread التي تتضمّن عقدتَين مفيدةً كثيرًا. لنعيد اتصال "مفوّض FTD" بالإنترنت.

في مفوّض FTD، أعِد تشغيل سلسلة المحادثات:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

خلال دقيقتين، تتم إعادة ربطه تلقائيًا بشبكة "codelab" كجهاز طرفي، ثم يرقي نفسه إلى جهاز توجيه.

## FTD Commissioner ##
----------------------

> state
router
Done

تحقَّق من جداول جهاز التوجيه والجداول الفرعية في FTD Joiner للتأكّد مما يلي:

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

تتألف شبكة Thread من ثلاث عقد مرة أخرى.

11. تحديد المشاكل وحلّها

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

الشاشة

إذا واجهت مشكلة في الإعدادات (مثل ظهور عدد كبير جدًا من نوافذ Screen أو Screens ضمن Screen)، يُرجى مواصلة إغلاق نوافذ Screen باستخدام Ctrl ‏+ a → k إلى أن لا تتبقّى أي نوافذ، وظهور screen -ls على سطر الأوامر.No Sockets found بعد ذلك، أعِد إنشاء نوافذ "الشاشة" لكل جهاز. يتم الاحتفاظ بحالات الجهاز حتى عند إغلاق الشاشة.

عقد سلاسل المحادثات

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

لإعادة ضبط وحدات FTD:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

يمكن إعادة ضبط RCP بالطريقة نفسها من خلال ot-ctl:

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. استخدام البث المتعدد

يُستخدَم البث المتعدد لإرسال المعلومات إلى مجموعة من الأجهزة في آنٍ واحد. في شبكة Thread، يتم حجز عناوين معيّنة لاستخدام البث المتعدد مع مجموعات مختلفة من الأجهزة، وذلك استنادًا إلى النطاق.

عنوان IPv6

المستوى

تم التسليم إلى

ff02::1

رابط محلي

جميع FTDs وMEDs

ff02::2

رابط محلي

جميع وحدات FTD وأجهزة توجيه الحدود

ff03::1

Mesh-Local

جميع FTDs وMEDs

ff03::2

Mesh-Local

جميع وحدات FTD وأجهزة توجيه الحدود

بما أنّنا لا نستخدم جهاز توجيه حدوديًا في هذا الدليل التعليمي، لنركّز على عنوانَي البث المتعدد FTD وMED.

يتألف النطاق المحلي للربط من جميع واجهات Thread التي يمكن الوصول إليها من خلال إرسال بث لاسلكي واحد أو "قفزة" واحدة. تحدِّد بنية الشبكة الأجهزة التي تستجيب لطلب فحص الاتصال بعنوان البث المتعدد ff02::1.

تلقّيت رسالة من ff02::1 من مفوّض FTD:

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

هناك جهازان آخران في الشبكة (FTD Joiner وRCP Joiner)، ولكن لم يتلقّ "مفوّض FTD" سوى استجابة واحدة من عنوان Link-Local Address (LLA) الخاص بـ FTD Joiner. وهذا يعني أنّ "جهاز الربط في FTD" هو الجهاز الوحيد الذي يمكن لـ "مفوّض FTD" الوصول إليه من خلال قفزة واحدة.

otcodelab_top02C_02_LL.png

الآن، أرسِل طلبًا للتواصل مع ff02::1 من FTD Joiner:

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

هناك إجابتان. عند التحقّق من عناوين IPv6 للأجهزة الأخرى، يمكننا أن نرى أنّ العنوان الأول (الذي ينتهي بـ 4b1d) هو عنوان LLA الخاص بمسؤول FTD، والعنوان الثاني (الذي ينتهي بـ 943b) هو عنوان LLA الخاص بمسؤول RCP.

otcodelab_top02C_02_LL02.png

وهذا يعني أنّ أداة ربط FTD متصلة مباشرةً بكلّ من أداة ربط FTD و"أداة ربط RCP"، ما يؤكّد التخطيط.

Mesh-Local

يتألف النطاق "الشبكة المحلية" من جميع واجهات Thread التي يمكن الوصول إليها ضمن شبكة Thread نفسها. لنطّلِع على الردود على طلب فحص الاتصال بعنوان البث المتعدد ff03::1.

تلقّيت رسالة من ff03::1 من مفوّض FTD:

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

هذه المرة، تلقّى مفوّض FTD ردّين، أحدهما من أداة تحديد المسار الخاصة بجهاز ربط FTD (RLOC، تنتهي بالرقم b800) والآخر من معرّف الجلسة على مستوى الشبكة المحلية لجهاز ربط RCP (ML-EID، ينتهي بالرقم d55f). ويعود السبب في ذلك إلى أنّ النطاق على مستوى الشبكة المحلية يتضمّن شبكة Thread بأكملها. بغض النظر عن مكان الجهاز في الشبكة، سيتم اشتراكه في عنوان ff03::1.

otcodelab_top02C_02_ML.png

يمكنك فحص اتصال ff03::1 من مُجمِّع FTD لتأكيد السلوك نفسه:

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

لاحِظ وقت استجابة أداة ربط RCP في كلّ من مخرجتَي طلب فحص الاتصال. استغرقت عملية الدمج في RCP وقتًا أطول بكثير للوصول إلى "مفوّض FTD" (68 ملي ثانية) مقارنةً بالوصول إلى "مُدمِج FTD" (23 ملي ثانية). ويعود السبب في ذلك إلى أنّه يجب إجراء قفزتَين للوصول إلى "مفوّض FTD"، مقارنةً بقفزة واحدة لـ "مُدرِج FTD".

ربما لاحظت أيضًا أنّ طلب البث المتعدد على مستوى الشبكة المحلية قد استجاب باستخدام عنوان RLOC لوحدتي FTD فقط، وليس لوحدة "موصّل RCP". ويرجع ذلك إلى أنّ وحدات FTD هي أجهزة توجيه ضمن الشبكة، في حين أنّ RCP هو جهاز طرفي.

تحقَّق من حالة مُنشئ مجموعات RCP للتأكّد مما يلي:

## RCP Joiner ##
----------------

> state
child

13. إرسال الرسائل باستخدام بروتوكول UDP

من خدمات التطبيقات التي يوفّرها OpenThread هو بروتوكول مخطّط بيانات المستخدم (UDP)، وهو بروتوكول طبقة النقل. يمكن للتطبيق المبني على OpenThread استخدام واجهة برمجة التطبيقات UDP لتمرير الرسائل بين العقد في شبكة Thread أو إلى الأجهزة الأخرى في شبكة خارجية (مثل الإنترنت، إذا كانت شبكة Thread تتضمّن جهاز توجيه حدوديًا).

يتم عرض مقابس UDP من خلال واجهة سطر الأوامر OpenThread. لنستخدمه لنقل الرسائل بين جهازَي FTD.

احصل على عنوان معرّف الجلسة المحلية للشبكة لـ FTD Joiner. نستخدم هذا العنوان لأنّه يمكن الوصول إليه من أي مكان ضمن شبكة Thread.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

ابدأ بروتوكول UDP واربطه بمقبس لأي عنوان IPv6:

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

انتقِل إلى مفوّض FTD، وابدأ بروتوكول UDP، واتصل بمقبس الشبكة الذي أعددته على "موصِّل FTD" باستخدام معرّف ML-EID:

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

يجب أن يكون اتصال بروتوكول حزم بيانات المستخدم (UDP) نشطًا بين النقطتَين. إرسال رسالة من مفوض FTD:

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

في FTD Joiner، تم استلام رسالة UDP.

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. تهانينا!

لقد أنشأت شبكة Thread حقيقية.

b915c433e7027cc7.png

أنت الآن تعرف:

  • الفرق بين أنواع الأجهزة والأدوار والنطاقات في Thread
  • كيفية إدارة أجهزة Thread لأوضاعها ضمن الشبكة
  • كيفية تمرير رسائل بسيطة بين العقد باستخدام بروتوكول UDP

الخطوات التالية

استنادًا إلى هذا الدرس التطبيقي حول الترميز، جرِّب التمارين التالية:

  • أعِد فلاش لوحة FTD Joiner كجهاز MTD باستخدام الثنائي ot-cli-mtd، ولاحظ أنّه لا يتم ترقيته أبدًا إلى جهاز توجيه أو يحاول أن يصبح الجهاز الرئيسي.
  • أضِف المزيد من الأجهزة (جرِّب منصة مختلفة) إلى الشبكة وارسم المخطط باستخدام جداول أجهزة التوجيه والأجهزة الفرعية، بالإضافة إلى عمليات فحص الاتصال بعنوان البث المتعدد.
  • استخدِم pyspinel للتحكّم في وحدة التحكّم في الشبكة
  • حوِّل وحدة التحكّم في الطاقة إلى جهاز توجيه حدودي باستخدام جهاز توجيه حدودي OpenThread ووصِّل شبكة Thread بالإنترنت.

مراجع إضافية

يمكنك الانتقال إلى openthread.io وGitHub للاطّلاع على مجموعة متنوعة من موارد OpenThread، بما في ذلك:

مرجع: