محاكاة شبكة Thread باستخدام بروتوكول OpenThread في الإرساء

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

1- المقدمة

26b7f4f6b3ea0700.png

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

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

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

ما ستتعرَّف عليه

  • كيفية إعداد سلسلة أدوات إصدار OpenThread
  • كيفية محاكاة شبكة Thread
  • كيفية مصادقة عُقد سلاسل المحادثات
  • كيفية إدارة شبكة Thread باستخدام بروتوكول OpenThread الخفي

المتطلبات

  • قاعدة الإرساء
  • المعرفة الأساسية بنظام التشغيل Linux وتوجيه الشبكة

2. إعداد الإرساء

تم تصميم هذا الدرس التطبيقي حول الترميز لاستخدام الإرساء على جهاز يعمل بنظام التشغيل Linux أو Mac OS X أو Windows. نظام التشغيل Linux هو البيئة المُوصى بها.

تثبيت الإرساء

ثبِّت الإرساء على نظام التشغيل الذي تختاره.

سحب صورة الإرساء

بعد تثبيت الإرساء، افتح نافذة طرفية واسحب صورة شريط الإرساء openthread/environment. تعرض هذه الصورة OpenThread وOpenThread Daemon معادَين مسبقًا وجاهزة للاستخدام في هذا الدرس التطبيقي حول الترميز.

$ docker pull openthread/environment:latest

يُرجى العِلم أنّ التنزيل قد يستغرق بضع دقائق.

في نافذة طرفية، ابدأ تشغيل حاوية الإرساء من الصورة واربطها بصدفة bash:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

يُرجى ملاحظة العلامات المطلوبة في هذا الدرس التطبيقي حول الترميز:

  • --sysctl net.ipv6.conf.all.disable_ipv6=0: يؤدي هذا إلى تفعيل IPv6 ضمن الحاوية
  • --cap-add=net_admin — يتيح تفعيل NET_ADMIN، الذي يسمح لك بتنفيذ العمليات المتعلقة بالشبكة، مثل إضافة مسارات IP.

بعد الوصول إلى الحاوية، من المفترض أن تظهر لك رسالة مطالبة مشابهة لما يلي:

root@c0f3912a74ff:/#

في المثال أعلاه، c0f3912a74ff هو رقم تعريف الحاوية. يختلف رقم تعريف الحاوية لمثيل حاوية الإرساء عن الرقم التعريفي المعروض في رسائل المطالبة لهذا الدرس التطبيقي حول الترميز.

استخدام الإرساء

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

3- محاكاة شبكة Thread

يوضّح مثال التطبيق الذي ستستخدمه لهذا الدرس التطبيقي المُطبَّق الدرس التطبيقي على الأقل لـ OpenThread الذي يعرِض إعدادات OpenThread وواجهات الإدارة من خلال واجهة سطر الأوامر الأساسية (CLI).

ينقلك هذا التمارين إلى الحد الأدنى من الخطوات المطلوبة ليتم فحص جهاز Thread ذي محاكاة واحدة من جهاز Thread آخر في محاكاة.

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

6e3aa07675f902dc.png

إنشاء الشبكة

1- بدء العقدة 1

إذا لم يسبق لك تنفيذ هذه الخطوة، ابدأ تشغيل حاوية الإرساء في نافذة طرفية ثم وصِّل واجهة أوامرها bash.

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

في حاوية الإرساء، عليك بدء عملية سطر الأوامر (CLI) لجهاز سلاسل محادثات الذي تمت محاكاهته باستخدام البرنامج الثنائي ot-cli-ftd.

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

ملاحظة: إذا لم تظهر لك رسالة المطالبة > بعد تشغيل هذا الأمر، اضغط على enter.

ينفِّذ هذا البرنامج الثنائي جهاز OpenThread. يتم تنفيذ برنامج تشغيل الراديو IEEE 802.15.4 فوق بروتوكول UDP (يتم تمرير إطارات IEEE 802.15.4 داخل أحمال UDP).

وسيطة 1 هي واصِف ملف يمثّل وحدات البت الأقل أهمية من &" الواقع، إلى أن يكون مُحدّدًا&quot؛ IEEE الاتحاد الأوروبي-64 للجهاز محاكاة. وتُستخدم هذه القيمة أيضًا عند الربط بمنفذ UDP لمحاكاة الراديو 802.15.4 (المنفذ = 9000 + وصف الملف). سيستخدِم كل مثيل من سلسلة محادثات ضمن محاكاة في هذا الدرس التطبيقي وصفًا مختلفًا للملف.

ملاحظة: استخدِم فقط كلمات وصفية لملف 1 أو أكثر كما هو موضّح في هذا الدرس التطبيقي حول الترميز عند بدء تشغيل الجهاز في محاكاة محاكاة. هناك وصف لملف 0 محجوز للاستخدام الآخر.

أنشِئ مجموعة بيانات تشغيلية جديدة والتزم بها كمجموعة نشطة. مجموعة بيانات التشغيل هي إعدادات شبكة Thread التي تنشئها.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Network Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

التزم بمجموعة البيانات هذه كمجموعة نشطة:

> dataset commit active
Done

اعرض واجهة IPv6:

> ifconfig up
Done

بدء عملية بروتوكول Thread:

> thread start
Done

انتظِر بضع ثوانٍ وتحقّق من أن الجهاز أصبح قائد سلسلة المحادثات. القائد هو الجهاز المسؤول عن إدارة تخصيص معرّف جهاز التوجيه.

> state
leader
Done

الاطّلاع على عناوين IPv6 المخصّصة لواجهة سلسلة محادثات العقدة 1&39; (ستختلف المخرجات):

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

لاحظ أنواع عناوين IPv6 المحدّدة:

  • يبدأ بـ fd = Mesh-local
  • يبدأ بـ fe80 = link-local

يتم تصنيف أنواع العناوين المحلية المتداخلة:

  • تحتوي على ff:fe00 = جهاز توجيه جهاز التوجيه (RLOC)
  • لا يحتوي على ff:fe00 = معرّف نقطة النهاية (EID)

حدِّد المعرّف EID في الإخراج في وحدة التحكّم وسجِّله في قائمة لاستخدامه لاحقًا. في نموذج الناتج أعلاه، EID هو:

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. بدء العقدة 2

افتح نافذة طرفية جديدة ونفِّذ واجهة أوامر bash في حاوية الإرساء الحالية لاستخدامها في العقدة 2.

$ docker exec -it codelab_otsim_ctnr bash

في رسالة المطالبة الجديدة bash هذه، عليك بدء عملية سطر الأوامر (CLI) باستخدام الوسيطة 2. هذا هو الجهاز الثاني الذي يحاكي سلسلة المحادثات:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

ملاحظة: إذا لم تظهر لك رسالة المطالبة > بعد تشغيل هذا الأمر، اضغط على enter.

اضبط مفتاح شبكة سلسلة المحادثات ورقم تعريف رقم PAN، باستخدام القيم نفسها كمجموعة البيانات التشغيلية للعقدة 1':

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

التزم بمجموعة البيانات هذه كمجموعة نشطة:

> dataset commit active
Done

اعرض واجهة IPv6:

> ifconfig up
Done

بدء عملية بروتوكول Thread:

> thread start
Done

سيتم إعداد الجهاز نفسه على أنّه وحدة فرعية. يعادل جهاز Child Thread جهازًا نهائيًا، وهو جهاز سلسلة محادثات يُرسِل زيارات واردة من خلال unicast ويستلمها فقط باستخدام جهاز رئيسي.

> state
child
Done

في غضون دقيقتين، من المفترض أن يظهر لك تبديل الحالة من child إلى router. يمكن لجهاز توجيه سلاسل المحادثات توجيه الزيارات بين أجهزة Thread. ويُشار إليها أيضًا باسم "الوالد".

> state
router
Done

التحقق من الشبكة

هناك طريقة سهلة للتحقق من الشبكة المتداخلة وهي من خلال الاطّلاع على جدول أجهزة التوجيه.

1- التحقّق من الاتصال بالإنترنت

في العقدة 2، احصل على RLOC16. RLOC16 هو آخر 16 بت من عنوان RLOC IPv6 على الجهاز.

> rloc16
5800
Done

في العقدة 1، تحقق من جدول جهاز التوجيه بحثًا عن العقدة 2's RLOC16. تأكد من تبديل العقدة 2 إلى حالة جهاز التوجيه أولاً.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In  | LQ Out  | Age | Extended MAC   |
+----+--------+----------+-----------+--------+-------+---+--------------------+
| 20 | 0x5000 |       63 |         0 |      0 |     0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |      3 |     3 |  23 | 5a4eb647eb6bc66c |

تم العثور على العقدة 2's RLOC من 0x5800 في الجدول، مع تأكيد أنها متصلة بالشبكة المتداخلة.

2. أداة فحص الاتصال بالعقدة 1 من العقدة 2

تحقَّق من إمكانية الربط بين جهازَي Thread المحاكيين. في العقدة 2، ping تم تحديد EID للعقدة 1:

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms

يمكنك الضغط على enter للعودة إلى إشعار واجهة سطر الأوامر (CLI) في >.

اختبار الشبكة

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

الرجوع إلى العقدة 1 وإيقاف سلسلة المحادثات:

> thread stop
Done

بدِّل إلى العقدة 2 وتحقّق من الحالة. خلال دقيقتين، تكتشف العقدة 2 أن القائد (العقدة 1) بلا اتصال بالإنترنت، ومن المفترض أن ترى انتقال العقدة 2 لتكون leader من الشبكة:

> state
router
Done
...
> state
leader
Done

بعد التأكيد، أوقِف سلسلة المحادثات والعقدة الثانية لإعادة الضبط على الإعدادات الأصلية قبل الخروج مرة أخرى إلى رسالة الإرساء bash. تتم إعادة الضبط على الإعدادات الأصلية لضمان عدم نقل بيانات اعتماد شبكة Thread التي استخدمتها في هذه العملية إلى التمارين التالية.

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

قد تضطر إلى الضغط على enter عدة مرات لإعادة رسالة المطالبة > بعد أمر factoryreset. لا تخرج من حاوية الإرساء.

إعادة الضبط على الإعدادات الأصلية والخروج من العقدة 1 أيضًا:

> factoryreset
>
> exit
root@c0f3912a74ff:/#

يمكنك الاطّلاع على مرجع واجهة سطر الأوامر في OpenThread لاستكشاف جميع أوامر سطر الأوامر (CLI) المتاحة.

4. مصادقة العُقد باستخدام التفويض

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

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

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

d6a67e8a0d0b5dcb.png

قاعدة الإرساء

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

1- إنشاء شبكة

في العقدة 1، ابدأ عملية واجهة سطر الأوامر (CLI):

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

ملاحظة: إذا لم تظهر لك رسالة المطالبة > بعد تشغيل هذا الأمر، اضغط على enter.

أنشِئ مجموعة بيانات تشغيلية جديدة والتزم بها كمجموعة نشطة وابدأ سلسلة المحادثات:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Network Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

التزم بمجموعة البيانات هذه كمجموعة نشطة:

> dataset commit active
Done

اعرض واجهة IPv6:

> ifconfig up
Done

بدء عملية بروتوكول Thread:

> thread start
Done

انتظِر بضع ثوانٍ وتحقّق من أن الجهاز أصبح قائد سلسلة المحادثات:

> state
leader
Done

2. بدء دور المفوَّض

أثناء استخدام العقدة 1، ابدأ دور المفوّض:

> commissioner start
Done

السماح لأي انضمام (باستخدام حرف البدل *) باستخدام بيانات اعتماد المشترك J01NME بالعمولة على الشبكة. الانضمام هو جهاز تمت إضافته بواسطة مشرف بُني إلى شبكة Thread تم تفويضها.

> commissioner joiner add * J01NME
Done

3- بدء دور "المُنجِر"

في نافذة الوحدة الطرفية الثانية، أدرِج عملية سطر سطر جديد في حاوية حاوية الإرساء. هذه هي العقدة 2.

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 2

في العقدة 2، يُرجى تفعيل دور"الانضمام"باستخدام بيانات اعتماد المشترك J01NME.

> ifconfig up
Done
> joiner start J01NME
Done

... انتظر بضع ثوانٍ للتأكيد ...

Join success

بصفته انضمامًا، تمت بنجاح مصادقة الجهاز (العقدة الثانية) مع المفوّض (العقدة 1) وتلقّى بيانات اعتماد شبكة Thread.

الآن وبعد أن تمت مصادقة العقدة 2، يمكنك بدء سلسلة محادثات:

> thread start
Done

4. التحقّق من مصادقة الشبكة

تحقّق من state على العقدة 2 للتأكد من أنّه تم الانضمام إلى الشبكة الآن. في غضون دقيقتين، يتم نقل العقدة 2 من child إلى router:

> state
child
Done
...
> state
router
Done

5. إعادة ضبط الإعدادات

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

> thread stop
Done
> factoryreset
>
> exit
root@c0f3912a74ff:/#

قد تضطر إلى الضغط على enter عدة مرات لإعادة رسالة المطالبة > بعد أمر factoryreset.

5. إدارة الشبكة باستخدام OpenThread الخفي

بالنسبة إلى هذه العملية، سنحاكي مثيل واجهة سطر الأوامر (CLI) واحدًا (جهاز SoC واحد مضمّن في جهاز واحد) ومثيل واحد لمعالج الراديو اللاسلكي (RCP).

ot-daemon هو وضع في التطبيق OpenThread Posix يستخدم مقبس UNIX كإدخال وإخراج، حتى يمكن تشغيل OpenThread بشكل أساسي كخدمة. يمكن للعميل التواصل مع هذه الخدمة عن طريق الاتصال بالمقبس باستخدام واجهة سطر الأوامر (OpenCLI) كبروتوكول.

ot-ctl هو واجهة سطر الأوامر (CLI) مقدَّمة من ot-daemon لإدارة RCP وإعدادها. وباستخدام هذه الطريقة، سنربط RCP بالشبكة التي أنشأها جهاز Thread.

قاعدة الإرساء

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

استخدام البرنامج الخفي

ستستخدم هذه التمارين ثلاث نوافذ طرفية وفقًا لما يلي:

  1. مثيل CLI لجهاز محاكاة سلسلة المحادثات (العقدة 1)
  2. عملية ot-daemon
  3. مثيل واجهة سطر أوامر ot-ctl

1- بدء العقدة 1

في النافذة الطرفية الأولى، ابدأ عملية واجهة سطر الأوامر (CLI) لجهاز Thread المحاكي:

root@c0f3912a74ff:/# /openthread/build/examples/apps/cli/ot-cli-ftd 1

ملاحظة: إذا لم تظهر لك رسالة المطالبة > بعد تشغيل هذا الأمر، اضغط على enter.

أنشِئ مجموعة بيانات تشغيلية جديدة والتزم بها كمجموعة نشطة وابدأ سلسلة المحادثات:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Network Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

التزم بمجموعة البيانات هذه كمجموعة نشطة:

> dataset commit active
Done

اعرض واجهة IPv6:

> ifconfig up
Done

بدء عملية بروتوكول Thread:

> thread start
Done

عرض عناوين IPv6 التي تم تعيينها لواجهة سلسلة محادثات العقدة 1&39; :

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

كما هو موضّح في خطوة محاكاة شبكة Thread، يكون العنوان الأول هو link-local (fe80) والثلاثة عناوين هي Mesh-local (fd). معرّف EID هو عنوان الشبكة المتداخلة الذي لا يحتوي على ff:fe00 في العنوان. في هذا الإخراج النموذجي، EID هو fd55:cf34:dea5:7994:460:872c:e807:c4ab.

حدِّد رقم تعريف EID المحدّد من مُخرج ipaddr، الذي سيتم استخدامه للاتصال بالعقدة.

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

في نافذة الوحدة الطرفية الثانية، يمكنك إنشاء عقدة جهاز tun وضبط أذونات القراءة/الكتابة:

root@c0f3912a74ff:/# mkdir -p /dev/net && mknod /dev/net/tun c 10 200
root@c0f3912a74ff:/# chmod 600 /dev/net/tun

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

ابدأ ot-daemon لعقدة RCP، والتي سنطلقها على العُقدة 2. استخدِم علامة النتائج التفصيلية -v للاطّلاع على مخرجات السجلّ والتأكّد من تشغيله:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty:///openthread/build/examples/apps/ncp/ot-rcp?forkpty-arg=2'

عند النجاح في ذلك، يؤدي ot-daemon في وضع التشغيل المطوَّل إلى إنشاء نتائج مشابهة لما يلي:

ot-daemon[31]: Running OPENTHREAD/297a880; POSIX; Feb  1 2022 04:43:39
ot-daemon[31]: Thread version: 3
ot-daemon[31]: Thread interface: wpan0
ot-daemon[31]: RCP version: OPENTHREAD/297a880; SIMULATION; Feb  1 2022 04:42:50

اترك محطة الدفع هذه مفتوحة وتعمل في الخلفية. لن تُدخِل أي أوامر أخرى فيه.

3- يمكنك استخدام ot-ctl للانضمام إلى الشبكة

لم نتولى أي عُقدة رقم 2 (2 RCP) ot-daemon إلى أي شبكة Thread حتى الآن. هنا يأتي دور ot-ctl. يستخدم ot-ctl واجهة سطر الأوامر نفسها الموجودة في تطبيق OpenThread CLI. ولذلك، يمكنك التحكّم في عُقَد ot-daemon بالطريقة نفسها التي تتحكّم بها أجهزة سلاسل المحادثات الأخرى.

افتح نافذة طرفية ثالثة ونفِّذ الحاوية الحالية:

$ docker exec -it codelab_otsim_ctnr bash

بعد الوصول إلى الحاوية، ابدأ ot-ctl:

root@c0f3912a74ff:/# /openthread/build/posix/src/posix/ot-ctl
>

يمكنك استخدام ot-ctl في نافذة الوحدة الطرفية الثالثة لإدارة العقدة 2 (عقدة RCP) التي بدأتها في نافذة الوحدة الطرفية الثانية باستخدام ot-daemon. يُرجى التحقّق من state الخاصة بالعقدة 2:

> state
disabled
Done

يمكنك الحصول على eui64 العُقدة 2&#39؛ لحظر الانضمام إلى انضمام محدد:

> eui64
18b4300000000001
Done

في العقدة 1 (النافذة الأولى)، ابدأ المفوَّض وحصر الانضمام على eui64 فقط:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

في نافذة الوحدة الطرفية الثالثة، يمكنك فتح واجهة الشبكة للعقدة 2 والانضمام إلى الشبكة:

> ifconfig up
Done
> joiner start J01NME
Done

... انتظر بضع ثوانٍ للتأكيد ...

Join success

بصفتك انضمامًا، تمت بنجاح مصادقة RCP (العقدة 2) مع المفوَّض (العقدة 1) وتلقّى بيانات اعتماد شبكة Thread.

انضم الآن إلى العقدة 2 إلى شبكة Thread (مرة أخرى، في نافذة الوحدة الطرفية الثالثة):

> thread start
Done

4. التحقّق من مصادقة الشبكة

في الوحدة الطرفية الثالثة، يُرجى التحقّق من state على العقدة 2 للتأكد من أنّ الجهاز انضمّ إلى الشبكة. في غضون دقيقتين، يتم نقل العقدة 2 من child إلى router:

> state
child
Done
...
> state
router
Done

5. التحقق من الاتصال

في نافذة المحطة الثالثة، يمكنك إيقاف ot-ctl باستخدام الأمرَين Ctrl+D أو exit، والعودة إلى وحدة تحكّم bashالحاوية. من وحدة التحكّم هذه، يمكن فحص اتصال العقدة 1 باستخدام EID مع الأمر ping6. في حال انضمام مثيل ot-daemon RCP إلى شبكة Thread والاتصال بها بنجاح، يُنجح برنامج ping:

root@c0f3912a74ff:/# ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

6. تحديد وحلّ الإرساء

في حال خرجت من حاوية الإرساء

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

لعرض حاويات الإرساء التي تعمل:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

لعرض جميع حاويات الإرساء (سواء قيد التشغيل أو الإيقاف):

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
505fc57ffc72        environment       "bash"              10 minutes ago      Up 10 minutes                           codelab_otsim_ctnr

إذا لم تظهر لك الحاوية codelab_otsim_ctnr في إخراج الأمر docker ps، يمكنك تشغيلها مرة أخرى:

$ docker run --name codelab_otsim_ctnr -it --rm \
   --sysctl net.ipv6.conf.all.disable_ipv6=0 \
   --cap-add=net_admin openthread/environment bash

في حال إيقاف الحاوية (مُدرَجة في docker ps -a وليس docker ps)، يجب إعادة تشغيلها:

$ docker start -i codelab_otsim_ctnr

إذا كانت حاوية الإرساء تعمل حاليًا (مُدرَجة في docker ps)، يُرجى إعادة الاتصال بالحاوية في كل محطة دفع:

$ docker exec -it codelab_otsim_ctnr bash

"غير مسموح بالتشغيل"الأخطاء

إذا حدثت أخطاء في Operation not permitted عند إنشاء عُقد OpenThread جديدة (باستخدام الأمر mknod)، تأكَّد من تشغيل الإرساء بصفتك المستخدم الجذر وفقًا للأوامر المقدَّمة في هذا الدرس التطبيقي حول الترميز. لا يسمح هذا الدرس التطبيقي حول الترميز عند تشغيل الإرساء في وضع الجذر.

7. تهانينا

لقد نجحت في محاكاة شبكة Thread الأولى بنجاح باستخدام OpenThread. رائع!

لقد تعلّمت في هذا الدرس التطبيقي كيفية:

  • بدء حاوية حاوية OpenThread Simulator وإدارتها
  • محاكاة شبكة Thread
  • مصادقة عُقد سلاسل المحادثات
  • إدارة شبكة Thread باستخدام البرنامج الخفي لـ OpenThread

لمزيد من المعلومات حول Thread وOpenThread، اطّلِع على هذه المراجع:

ويمكنك أيضًا محاولة استخدام جهاز توجيه حدود OpenThread في حاوية إرساء.