1. مقدمة

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

أهداف الدورة التعليمية
- إنشاء وتثبيت ثنائيات 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.

تثبيت SEGGER J-Link
نستخدم 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.

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

انتقِل إلى موقع "أدوات سطر الأوامر" 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.

بدء برنامج 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:

انتقِل إلى موقع "أدوات سطر الأوامر" 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.

التحقّق من صحة الإصدار
تحقَّق من نجاح عملية الإنشاء من خلال الوصول إلى واجهة سطر الأوامر 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، وتتيح هذه الأداة أيضًا تقسيم الشاشة في نافذة الجهاز نفسها. استخدِم هذا الخيار لمعرفة كيفية استجابة إحدى العُقد للأوامر الصادرة على عقدة أخرى.
يُفضَّل أن تتوفّر لديك أربع نوافذ جاهزة:
- خدمة / سجلات
ot-daemon - أداة RCP Joiner من خلال
ot-ctl - FTD Commissioner من خلال واجهة سطر الأوامر (CLI) في OpenThread
- FTD Joiner من خلال واجهة سطر الأوامر OpenThread
إذا كنت تريد استخدام إعدادات أو أداة خاصة بك للمنافذ التسلسلية أو الطرفية، يمكنك الانتقال إلى الخطوة التالية. اضبط نوافذ الجهاز الطرفي لجميع الأجهزة بالطريقة التي تناسبك.
استخدام الشاشة
لتسهيل الاستخدام، ابدأ جلسة "مشاركة الشاشة" واحدة فقط. من المفترض أن يكون لديك رمز من عملية إعداد المصادقة الثنائية.
تبدأ جميع الأوامر في Screen بـ Ctrl+a.
أوامر الشاشة الأساسية:
إعادة الاتصال بجلسة Screen (من سطر الأوامر) |
|
مغادرة جلسة "المشاركة مع الآخرين" | Ctrl+a → |
إنشاء نافذة جديدة ضمن جلسة "مشاركة الشاشة" | Ctrl+a → |
التبديل بين النوافذ في جلسة "الشاشة الذكية" نفسها | Ctrl+a → |
إنهاء النافذة الحالية في جلسة Screen | Ctrl+a → |
تقسيم الشاشة
باستخدام Screen، يمكنك تقسيم نافذة الوحدة الطرفية إلى نوافذ متعددة:

يمكن الوصول إلى الأوامر في screen باستخدام Ctrl+a. يجب أن يبدأ كل أمر بمجموعة مفاتيح الوصول هذه.
إذا كنت قد اتّبعت الخطوات الواردة في Codelab بدقة، من المفترض أن يكون لديك نافذتان (FTD Commissioner وFTD Joiner) على مثيل الشاشة نفسه. لتقسيم الشاشة بين الجهازين، عليك أولاً إدخال جلسة "مشاركة الشاشة" الحالية:
$ screen -r
يجب أن تكون على أحد أجهزة FTD. اتّبِع الخطوات التالية في تطبيق "الشاشة":
- Ctrl+a →
Sلتقسيم النافذة أفقيًا - Ctrl+a →
Tabلنقل المؤشر إلى النافذة الفارغة الجديدة - Ctrl+a →
nللتبديل من تلك النافذة الجديدة إلى النافذة التالية - إذا كان هو نفسه النافذة العلوية، اضغط على 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 → |
تقسيم النافذة عموديًا | Ctrl+a → |
تقسيم النافذة أفقيًا | Ctrl+a → |
الانتقال إلى النافذة المعروضة التالية | Ctrl+a → |
التبديل بين النوافذ المعروضة إلى الأمام أو الخلف | Ctrl+a → |
إعادة تسمية النافذة الحالية | Ctrl+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 تتألف من عقدتَين، كما هو موضّح في مخطط طوبولوجيا الشبكة التالي:

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

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

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.

أكِّد الحالة الجديدة وRLOC16 على FTD Joiner:
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
الرجوع إلى إصدار سابق من FTD Joiner
يمكنك اختبار هذا السلوك عن طريق الرجوع يدويًا بإصدار FTD Joiner من جهاز توجيه إلى جهاز طرفي. غيِّر الحالة إلى "طفل" وتحقّق من RLOC16:
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done

بالعودة إلى مفوض 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.

إزالة القائد
يتم اختيار "القائد" ذاتيًا من بين جميع أجهزة توجيه 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

تحقَّق من الجدول الفرعي. لاحظ أنّ هناك 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

تتألف شبكة 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 | المستوى | تم التسليم إلى |
| Link-Local | جميع أجهزة FTD وMED |
| Link-Local | جميع أجهزة FTD وأجهزة توجيه الحدود |
| Mesh-Local | جميع أجهزة FTD وMED |
| Mesh-Local | جميع أجهزة FTD وأجهزة توجيه الحدود |
بما أنّنا لن نستخدم جهاز توجيه حدوديًا في هذا الدرس التطبيقي حول الترميز، لنركّز على عنوانَي البث متعدّد الوجهات FTD وMED.
Link-Local
يشمل نطاق 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 الوصول إليه بخطوة واحدة.

أرسِل الآن إشارة 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.

هذا يعني أنّ جهاز 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.

أرسِل طلب 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

لاحظ وقت الاستجابة لـ 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 فعلية.

أنت تعرف الآن:
- الفرق بين أنواع أجهزة Thread وأدوارها ونطاقاتها
- كيفية إدارة أجهزة Thread لحالاتها داخل الشبكة
- كيفية تمرير رسائل بسيطة بين العُقد باستخدام بروتوكول UDP
الخطوات التالية
استنادًا إلى هذا الدرس التطبيقي حول الترميز، جرِّب التمارين التالية:
- أعِد برمجة لوحة FTD Joiner كجهاز MTD باستخدام ملف
ot-cli-mtdالثنائي، ولاحظ أنّها لا تُرقّي نفسها أبدًا إلى جهاز توجيه أو تحاول أن تصبح الجهاز الرئيسي. - أضِف المزيد من الأجهزة (جرِّب منصة مختلفة!) إلى الشبكة واعرض المخطط الطوبولوجي باستخدام جداول جهاز التوجيه والأجهزة الفرعية، بالإضافة إلى طلبات اختبار الاتصال لعناوين البث المتعدد
- استخدام pyspinel للتحكّم في NCP
- حوِّل NCP إلى جهاز توجيه حدودي باستخدام OpenThread Border Router ووصِّل شبكة Thread بالإنترنت
محتوى إضافي للقراءة
يمكنك الاطّلاع على openthread.io وGitHub للحصول على مجموعة متنوعة من مراجع OpenThread، بما في ذلك:
- المنصّات المتوافقة: يمكنك الاطّلاع على جميع المنصّات المتوافقة مع OpenThread
- إنشاء OpenThread: مزيد من التفاصيل حول إنشاء OpenThread وإعداده
- مقدمة عن Thread: تغطي جميع مفاهيم Thread الواردة في هذا الدرس التطبيقي حول الترميز
مرجع: