محاكاة شبكة سلسلة محادثات باستخدام OpenThread في Docker

1- مقدمة

26b7f4f6b3ea0700.png

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

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

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

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

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

المتطلبات

  • رصيف بحري
  • دراية أساسية بنظام التشغيل Linux وتوجيه الشبكة

2- إعداد Docker

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

تثبيت Docker

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

سحب صورة Docker

بعد تثبيت Docker، افتح نافذة طرفية واسحب صورة openthread/environment Docker. تتضمّن هذه الصورة مسلسلاً مفتوحًا ومفتوحًا ومتوافقًا مع الدرس التطبيقي من Openدرس.

$ docker pull openthread/environment:latest

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

في نافذة محطة طرفية، ابدأ حاوية Docker من الصورة واربطها بحافظة 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 هو رقم تعريف الحاوية. سيختلف رقم تعريف الحاوية الخاص بحاوية Docker عن القيمة المعروضة في رسائل المطالبة لهذا الدرس التطبيقي حول الترميز.

استخدام Docker

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

3. محاكاة شبكة سلاسل محادثات

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

ينقلك هذا التمرين إلى الخطوات اللازمة لإجراء فحص اتصال لجهاز سلسلة محادثات واحد من جهاز سلسلة محادثات آخر في وضع المحاكاة.

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

6e3aa07675f902dc.png

إنشاء الشبكة

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

أعِد تشغيل حاوية Docker في نافذة طرفية إذا لم تفعل ذلك من قبل واربطها بغلاف واجهة bash:

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

في حاوية Docker، نفِّذ عملية سطر الأوامر (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 هي واصف ملف يمثل أقل وحدات البت الأكثر أهمية في IEEE EU-64 "المحدّدة من خلال المصنع" للجهاز الذي تمت محاكاته. يتم استخدام هذه القيمة أيضًا عند الربط بمنفذ UDP لمحاكاة IEEE 802.15.4 (المنفذ = 9000 + واصف الملف). سيستخدِم كل مثيل من جهاز محاكاة سلسلة محادثات في هذا الدرس التطبيقي وصفًا مختلفًا للملفات.

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

إنشاء مجموعة بيانات تشغيلية جديدة واستخدامها كمجموعة نشطة. مجموعة البيانات التشغيلية هي إعداد شبكة سلاسل المحادثات التي تنشئها.

> 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 start
Done

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

> state
leader
Done

اعرض عناوين IPv6 التي تم تخصيصها إلى واجهة سلاسل المحادثات للعقدة 1 (ستكون المخرجات مختلفة):

> 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 = متداخلة
  • يبدأ بـ fe80 = link-local

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

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

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

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

2- بداية العقدة 2

افتح وحدة طرفية جديدة ونفِّذ وحدة هيكل bash في حاوية Docker قيد التشغيل حاليًا لاستخدامها في العقدة 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 start
Done

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

> state
child
Done

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

> state
router
Done

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

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

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

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

> rloc16
5800
Done

في العقدة 1، تحقق من جدول جهاز التوجيه في RLOC16 للعقدة 2. تأكد من تبديل العقدة 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 |

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

2- عقدة Ping 1 من العقدة 2

تحقَّق من الاتصال بين جهازَي سلسلة المحادثات الذين تمت محاكاتهما. في العقدة 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

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

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

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

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

> factoryreset
>
> exit
root@c0f3912a74ff:/#

الاطّلاع علىمرجع سطر الأوامر OpenThread للاطّلاع على جميع أوامر سطر الأوامر المتاحة.

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

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

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

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

d6a67e8a0d0b5dcb.png

رصيف بحري

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

1- إنشاء شبكة

في العقدة 1، شغِّل عملية سطر الأوامر:

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 start
Done

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

> state
leader
Done

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

أثناء وجودك في العقدة 1، ابدأ دور المفوض:

> commissioner start
Done

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

> commissioner joiner add * J01NME
Done

3. بدء دور المشارك

في نافذة محطة طرفية أخرى، في حاوية Docker، شغِّل عملية CLI جديدة. هذه عُقدة 2.

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

في العُقدة 2، فعِّل دور المشارك باستخدام بيانات اعتماد المشارك J01NME.

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

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

الآن بعد مصادقة العقدة 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 Daemon

في هذا التمرين، سنحاكي محاكاة واجهة سطر الأوامر (CLI) (جهاز واحد على سلسلة منظومة على رقاقة (SoC)) ومثيل واحد من معالجات الراديو (RCP).

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

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

رصيف بحري

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

استخدام برنامج ot-daemon

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

  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 start
Done

عرض عناوين IPv6 التي تم تخصيصها إلى واجهة سلسلة محادثات 1:

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

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

حدِّد رقم EID المحدّد من مخرجات ipaddr التي سيتم استخدامها للتواصل مع العقدة.

2- بدء تشغيل ot-daemon

في نافذة الوحدة الطرفية الثانية، أنشِئ عُقدة جهاز 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 للانضمام إلى الشبكة

لم نُكلِّف العقدة 2ot-daemon RCP) إلى أي شبكة سلاسل محادثات بعد. هَا هِيَ جِهَازْ ot-ctl. يستخدم ot-ctl واجهة سطر الأوامر (CLI) نفسها مثل تطبيق 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 لتقييد الانضمام إلى المشارك المحدد:

> 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) وتلقّت بيانات اعتماد "سلسلة المحادثات".

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

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

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

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

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. تحديد المشاكل وحلّها في Docker

في حال الخروج من حاوية Docker

bash رسائل المطالبة قد تحتاج إلى التحقق من تشغيله وإعادة تشغيله / إعادة إدخاله حسب الحاجة.

لعرض حاويات Docker قيد التشغيل:

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

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

$ 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 قيد التشغيل (مدرجة في docker ps)، عليك إعادة الاتصال بالحاوية في كل وحدة طرفية:

$ docker exec -it codelab_otsim_ctnr bash

أخطاء "غير مسموح بالعملية"

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

7- تهانينا.

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

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

  • بدء حاوية حاوية Dockمحاكاة المحاكاة وإدارتها
  • محاكاة شبكة سلاسل محادثات
  • مصادقة عُقد سلسلة المحادثات
  • إدارة شبكة سلاسل محادثات باستخدام Openthread Daemon

للاطّلاع على مزيد من المعلومات عن سلسلة المحادثات وسلسلة المحادثات المفتوحة، راجِع المراجع التالية:

أو جرِّب استخدام جهاز توجيه حدود OpenOpen في حاوية Docker.