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

‫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 CLI
  • إعداد الأجهزة بشكل آمن على شبكة Thread
  • طريقة عمل البث المتعدد باستخدام بروتوكول IPv6
  • تمرير الرسائل بين عُقد Thread باستخدام UDP

المتطلبات

الأجهزة:

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

البرامج:

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

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

محاكاة OpenThread

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

أجهزة طرفية ذات منفذ تسلسلي

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

جهاز Linux

تم تصميم هذا الدرس التطبيقي حول الترميز لاستخدام جهاز Linux يستند إلى i386 أو x86 ليكون بمثابة المضيف لجهاز Radio Co-Processor (RCP) Thread، ولتثبيت ذاكرة ROM لجميع لوحات تطوير 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 تثبيت ذاكرة ROM لبرنامج OpenThread الثنائي على لوحات nRF52840. ثبِّت الإصدار المناسب من nRF5x-Command-Line-Tools-<OS> على جهاز Linux.

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

تثبيت مجموعة أدوات ARM GNU

يتم استخدام 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. إعداد أداة RCP Joiner

إنشاء وتثبيت ذاكرة ROM

أنشئ مثال OpenThread nRF52840 باستخدام Joiner ووظيفة USB الأصلية. يستخدم الجهاز دور Joiner للمصادقة عليه وتفعيله بأمان على شبكة 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 بمنفذ تصحيح الأخطاء Micro-USB بجانب دبوس الطاقة الخارجي على لوحة nRF52840، ثم وصِّله بجهاز Linux. اضبط مفتاح مصدر طاقة nRF على لوحة nRF52840 على VDD. عند توصيل الشاحن بشكل صحيح، يضيء LED5.

20a3b4b480356447.png

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

$ ls /dev/ttyACM*
/dev/ttyACM0

سجِّل الرقم التسلسلي للوحة nRF52840 المستخدَمة في RCP:

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.

أضِف التصنيف "برنامج العملاء المحتملين" إلى اللوحة حتى لا تخلط بين أدوار اللوحة لاحقًا.

الاتصال بمنفذ USB الأصلي

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

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

46e7b670d2464842.png

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

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

$ 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 الأخريان المستخدَمتان في هذا الدرس التطبيقي حول الترميز هما جهازان كاملان من أجهزة Thread (FTD) بتصميم معياري لمنظومة على رقاقة (SoC). يعمل أحد الأجهزة كمفوّض للمصادقة على الأجهزة وتفويضها على تلك الشبكة بشكل آمن. يعمل الجهاز الآخر كجهاز Joiner يمكن لجهاز Commissioner المصادقة عليه للوصول إلى شبكة Thread.

إنشاء وتثبيت ذاكرة ROM

أنشئ مثالاً على جهاز FTD في OpenThread لمنصّة 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 بمنفذ Micro-USB بجانب دبوس الطاقة الخارجي على لوحة nRF52840، ثم وصِّله بجهاز Linux. إذا كان جهاز RCP لا يزال متصلاً بجهاز Linux، من المفترض أن يظهر هذا اللوح الجديد كمنفذ تسلسلي /dev/ttyACM1 (تستخدم جميع لوحات nRF52840 ttyACM كمعرّف للمنفذ التسلسلي).

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

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

c00d519ebec7e5f0.jpeg

انتقِل إلى موقع "أدوات سطر الأوامر" nRFx، ومرِّر ملف hex الخاص بأداة سطر الأوامر OpenThread 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 يتيح استخدام USB CDC ACM الأصلي كنقل تسلسلي، يجب استخدام منفذ nRF USB على لوحة nRF52840 للتواصل مع مضيف RCP (جهاز Linux).

افصل طرف Micro-USB من كابل USB عن منفذ تصحيح الأخطاء في لوحة nRF52840 التي تم تحديثها، ثم أعِد توصيله بمنفذ nRF USB Micro-USB بجانب زر RESET. اضبط مفتاح مصدر طاقة 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 لإلغاء الربط بشاشة FTD Commissioner CLI والرجوع إلى وحدة Linux الطرفية حتى يمكن تثبيت البرنامج على اللوحة التالية. لإعادة إدخال واجهة سطر الأوامر في أي وقت، استخدِم screen -r من سطر الأوامر. للاطّلاع على قائمة بالشاشات المتاحة، استخدِم screen -ls:

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

إعداد أداة FTD Joiner

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

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

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

أطلِق على اللوحة اسم "الدمج".

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

$ screen -r

أنشئ النافذة الجديدة في Screen باستخدام 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 Joiner في مثيل Screen نفسه الذي تستخدمه أداة FTD Commissioner، يمكنك التبديل بينهما باستخدام Ctrl+a → n.

استخدام Ctrl+a →

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

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

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

يُفضَّل أن تتوفّر لديك أربع نوافذ جاهزة:

  1. خدمة / سجلات ot-daemon
  2. أداة RCP Joiner من خلال ot-ctl
  3. FTD Commissioner من خلال واجهة سطر الأوامر (CLI) في OpenThread
  4. FTD Joiner من خلال واجهة سطر الأوامر OpenThread

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

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

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

تبدأ جميع الأوامر في Screen بـ 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 Commissioner وFTD Joiner) على مثيل الشاشة نفسه. لتقسيم الشاشة بين الجهازين، عليك أولاً إدخال جلسة "مشاركة الشاشة" الحالية:

$ 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 وot-ctl RCP Joiner، يجب بدء تشغيل هاتين الخدمتين ضمن مثيل الشاشة نفسه. لإجراء ذلك، أوقِف ot-daemon واخرج من ot-ctl، ثم أعِد تشغيلهما في نوافذ Screen جديدة (Ctrl+a → c).

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

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

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

Ctrl+a → c

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

Ctrl+a →

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

Ctrl+a → S

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

Ctrl+a → Tab

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

‫Ctrl+a → n أو p

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

Ctrl+a → A

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

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

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

بعد الانتهاء من ضبط جميع نوافذ وشاشات الجهاز، لننشئ شبكة Thread. في FTD Commissioner، أنشئ مجموعة بيانات تشغيلية جديدة واعتمدها كمجموعة البيانات النشطة. مجموعة البيانات التشغيلية هي إعدادات شبكة 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 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 ##
----------------

> 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 Joiner

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

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

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

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

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

راجِع مجموعة البيانات للتأكّد من إعدادها بشكل صحيح.

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

افتح Thread لكي ينضم جهاز RCP Joiner إلى شبكة "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 Commissioner، تحقَّق من جداول جهاز التوجيه والجهاز التابع للتأكّد من أنّ كلا الجهازين جزء من الشبكة نفسها. استخدِم RLOC16 لتحديد RCP Joiner.

## 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 Joiner (عنوان الشبكة المحلية الذي تم الحصول عليه من ناتج ipaddr لجهاز RCP Joiner) للتحقّق من الاتصال:

## 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 Joiner بالانضمام.

في FTD Joiner، احصل على eui64 ليتمكّن مفوّض FTD من التعرّف عليه:

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

> eui64
2f57d222545271f1
Done

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

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

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

انتقِل إلى أداة ربط أجهزة FTD. ابدأ دور "المشارك" باستخدام بيانات اعتماد "المشارك" التي أعددتها للتو على جهاز FTD Commissioner:

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

> ifconfig up
Done
> joiner start J01NME
Done

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

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

>
Join success

افتح Thread حتى ينضم FTD Joiner إلى شبكة "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 Commissioner وتحقّق من جدولَي جهاز التوجيه وجهاز الطفل للتأكّد من توفّر ثلاثة أجهزة في شبكة "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 Joiner بالشبكة كجهاز نهائي (جهاز تابع). في ما يلي مخطط الشبكة المعدَّل:

otcodelab_top01C_ed01.png

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

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

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

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

## 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 Joiner (عنوان MAC الموسّع = e6cdd2d93249a243) إلى جهاز توجيه. يُرجى العِلم أنّ RLOC16 يختلف (b800 بدلاً من 0c02)، وذلك لأنّ RLOC16 يستند إلى رقم تعريف جهاز التوجيه ورقم تعريف الجهاز الفرعي. عندما ينتقل الجهاز من "جهاز نهائي" إلى "جهاز توجيه"، تتغيّر قيمتا "معرّف جهاز التوجيه" و"معرّف الجهاز الفرعي"، وكذلك RLOC16.

otcodelab_top01C.png

أكِّد الحالة الجديدة وRLOC16 على FTD Joiner:

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

> state
router
Done
> rloc16
b800
Done

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

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

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

بالعودة إلى مفوض FTD، من المفترض أن يظهر FTD Joiner الآن في الجدول الفرعي (المعرّف = 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. وهذا يعني أنّه في حال تمت إزالة جهاز التوجيه الرئيسي الحالي من شبكة Thread، سيصبح أحد أجهزة التوجيه الأخرى هو الجهاز الرئيسي الجديد.

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

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

> thread stop
Done
> ifconfig down
Done

في غضون دقيقتَين، يصبح FTD Joiner قائد سلسلة المحادثات الجديد. تحقَّق من حالة عناوين IPv6 الخاصة بجهاز FTD Joiner للتأكّد مما يلي:

## 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 Joiner، كما هو موضّح من خلال معرّفه وعنوان MAC الموسّع. وللحفاظ على شبكة Thread متماسكة، تم تبديل أجهزة التوجيه الرئيسية، من جهاز FTD Commissioner إلى جهاز FTD Joiner. يؤدي ذلك إلى إنشاء RLOC16 جديد لجهاز RCP Joiner (لأنّ معرّف جهاز التوجيه قد تغيّر من 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 Joiner بـ FTD Joiner كعنصر تابع. تحقَّق من الولاية وRLOC16 للتأكّد مما يلي:

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

> state
child
> rloc16
b801

إعادة ربط FTD Commissioner

لن تكون شبكة Thread التي تتضمّن عقدتَين ممتعة. لنعد إلى FTD Commissioner على الإنترنت.

على FTD Commissioner، أعِد تشغيل Thread:

## 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 أو شاشات داخل شاشة)، استمر في إغلاق نوافذ Screen باستخدام Ctrl+a → k إلى أن لا يتبقى أي منها، وسيظهر No Sockets found عند تنفيذ الأمر screen -ls في سطر الأوامر. بعد ذلك، أعِد إنشاء نوافذ "الشاشة" لكل جهاز. يتم الاحتفاظ بحالات الجهاز حتى عند إيقاف الشاشة.

عُقد Thread

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

لإعادة ضبط أجهزة التتبُّع:

## 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

Link-Local

جميع أجهزة FTD وMED

ff02::2

Link-Local

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

ff03::1

Mesh-Local

جميع أجهزة FTD وMED

ff03::2

Mesh-Local

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

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

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

إشعار ping 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 Commissioner سوى رد واحد من عنوان Link-Local Address (LLA) الخاص بجهاز FTD Joiner. وهذا يعني أنّ جهاز FTD Joiner هو الجهاز الوحيد الذي يمكن لجهاز FTD Commissioner الوصول إليه بخطوة واحدة.

otcodelab_top02C_02_LL.png

أرسِل الآن إشارة ff02::1 من أداة الانضمام إلى "العثور على الأجهزة القريبة":

## 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 Commissioner، وأنّ العنوان الثاني (الذي ينتهي بـ 943b) هو عنوان LLA الخاص بجهاز RCP Joiner.

otcodelab_top02C_02_LL02.png

هذا يعني أنّ جهاز FTD Joiner متصل مباشرةً بجهاز FTD Commissioner وجهاز RCP Joiner، ما يؤكّد صحة تصميمنا.

Mesh-Local

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

إشعار ff03::1 من مفوض لجنة التجارة الفيدرالية:

## 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 Commissioner استجابتَين، إحداهما من أداة تحديد مسار جهاز FTD Joiner (RLOC، تنتهي بـ b800) والأخرى من معرّف EID المحلي على شبكة RCP لجهاز FTD Joiner (ML-EID، ينتهي بـ d55f)، وذلك لأنّ نطاق الشبكة المتداخلة المحلية يتضمّن شبكة Thread بأكملها. وبغض النظر عن مكان الجهاز في الشبكة، سيتم الاشتراك في عنوان ff03::1.

otcodelab_top02C_02_ML.png

أرسِل طلب ping إلى ff03::1 من FTD Joiner لتأكيد السلوك نفسه:

## 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 Joiner في كلّ من نواتج اختبار الاتصال. استغرق RCP Joiner وقتًا أطول بكثير للوصول إلى FTD Commissioner (68 ملي ثانية) مقارنةً بالوقت الذي استغرقه للوصول إلى FTD Joiner (23 ملي ثانية). ويرجع ذلك إلى أنّ الجهاز يجب أن يجري عمليتَي نقل للوصول إلى "مفوض FTD"، مقارنةً بعملية نقل واحدة لجهاز "مُنشئ شبكة FTD".

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

تحقَّق من حالة RCP Joiner للتأكّد مما يلي:

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

> state
child

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

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

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

احصل على عنوان Mesh-Local EID الخاص بجهاز 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 Commissioner، وابدأ UDP، واربطه بالمقبس الذي أعددته على FTD Joiner، باستخدام 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 للتحكّم في NCP
  • حوِّل NCP إلى جهاز توجيه حدودي باستخدام OpenThread Border Router ووصِّل شبكة Thread بالإنترنت

محتوى إضافي للقراءة

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

مرجع: