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

1. مقدمة

26b7f4f6b3ea0700.png

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

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

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

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

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

المتطلبات

  • Docker
  • معرفة أساسية بنظام التشغيل Linux، توجيه الشبكة

2. إعداد Docker

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

تثبيت Docker

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

سحب صورة Docker

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

$ 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

يحذف الخيار --rm الحاوية عند الخروج من الحاوية. لا تستخدِم هذا الخيار إذا لم تكن تريد حذف الحاوية.

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

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

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

root@c0f3912a74ff:/#

في المثال أعلاه، تمثّل السمة c0f3912a74ff رقم تعريف الحاوية. سيختلف رقم تعريف الحاوية لمثيل حاوية Docker عن المعرّف الذي يظهر في الطلبات لهذا الدرس التطبيقي حول الترميز.

استخدام Docker

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

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

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

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

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

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

ملاحظة: عند بدء العملية لجهاز تمت محاكاته، يجب فقط استخدام واصفات الملفات بقيمة 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 المخصصة لواجهة Thread للعقدة 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 في وحدة التحكّم ودوِّنه لاستخدامه لاحقًا. في النموذج الناتج أعلاه، يكون معرّف شريحة SIM المضمّنة (EID) هو:

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

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

افتح وحدة طرفية جديدة ونفِّذ واجهة bash في حاوية Docker قيد التشغيل حاليًا لاستخدامها مع العقدة 2.

$ docker exec -it codelab_otsim_ctnr bash

في طلب bash الجديد هذا، يؤدي إلى إنشاء عملية CLI مع الوسيطة 2. هذا هو جهاز Thread الثاني الذي تتم محاكاته:

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

ملاحظة: إذا لم يظهر لك موجّه > بعد تنفيذ هذا الأمر، اضغط على enter.

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

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

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

> dataset commit active
Done

اعرِض واجهة IPv6:

> ifconfig up
Done

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

> thread start
Done

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

> state
child
Done

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

> state
router
Done

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

من الطرق السهلة للتحقق من الشبكة المتداخلة (mesh) إلقاء نظرة على جدول جهاز التوجيه.

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

تحقَّق من الاتصال بين جهازَي Thread اللذَين تمت محاكاته. في العقدة 2، ping، تم تخصيص معرّف شريحة SIM المضمّنة (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 للرجوع إلى طلب واجهة سطر الأوامر >.

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

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

الرجوع إلى العقدة 1 وإيقاف Thread:

> thread stop
Done

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

> state
router
Done
...
> state
leader
Done

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

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

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

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

> factoryreset
>
> exit
root@c0f3912a74ff:/#

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

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

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

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

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

d6a67e8a0d0b5dcb.png

Docker

بالنسبة إلى كل عقدة (نافذة طرفية) في التمارين المتبقية، تأكَّد من تشغيل حاوية Docker باستخدام إصدار OpenThread. في حال المتابعة من التمرين السابق، من المفترض أن يظل لديك طلبَان من bash داخل حاوية Docker نفسها. وإذا لم يكن الأمر كذلك، يُرجى الاطّلاع على خطوة تحديد مشاكل Docker وحلّها أو إعادة تمرين محاكاة شبكة 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 Network معتمَدة.

> 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) وتلقى بيانات اعتماد شبكة Thread.

الآن بعد أن تمت مصادقة العقدة 2، ابدأ Thread:

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

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

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

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

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

5- إدارة الشبكة باستخدام OpenThread Daemon

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

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

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

Docker

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

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

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

  1. مثيل CLI لجهاز Thread الذي تمت محاكاته (العقدة 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 المخصصة لواجهة Thread للعقدة 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
>

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

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

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

$ 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) وتلقى بيانات اعتماد Thread Network.

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

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

5- التحقّق من إمكانية الاتصال

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

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 أنشأتها بدون استخدام الخيار --rm متوفّرة.

لعرض حاويات 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

لا تستخدِم الخيار --rm إلا إذا كنت تريد حذف الحاوية عند الخروج من الحاوية.

إذا كانت الحاوية متوقفة (مُدرَجة في 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. رائع!

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

  • بدء وإدارة حاوية Docker لمحاكاة OpenThread
  • محاكاة شبكة Thread
  • مصادقة عُقد سلسلة التعليمات
  • إدارة شبكة Thread باستخدام OpenThread Daemon

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

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