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

1. مقدمة

26b7f4f6b3ea0700.png

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

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

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

أهداف الدورة التعليمية

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

المتطلبات

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

2. إعداد Docker

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

تثبيت Docker

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

سحب صورة Docker

بعد تثبيت Docker، افتح نافذة وحدة طرفية واسحب صورة openthread/environment Docker. تعرض هذه الصورة 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 طوال مدة Codelab.

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

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

يأخذك هذا التمرين في جولة في الحد الأدنى من الخطوات المطلوبة لإرسال طلب اختبار اتصال من جهاز Thread محاكى إلى جهاز 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، شغِّل عملية واجهة سطر الأوامر لجهاز 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

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

> state
leader
Done

اطّلِع على عناوين IPv6 المخصّصة لواجهة Node 1 Thread (ستختلف النتيجة التي ستحصل عليها):

> 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 shell في حاوية Docker قيد التشغيل حاليًا لاستخدامها مع Node 2.

$ docker exec -it codelab_otsim_ctnr bash

في طلب bash الجديد هذا، شغِّل عملية واجهة سطر الأوامر باستخدام الوسيطة 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 جهاز End Device، وهو جهاز Thread يرسل ويستقبل حركة المرور أحادية البث فقط مع جهاز Parent.

> state
child
Done

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

> 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. إرسال طلب اختبار الاتصال من العقدة 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.

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

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

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

> thread stop
Done

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

> state
router
Done
...
> state
leader
Done

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

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

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

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

> factoryreset
>
> exit
root@c0f3912a74ff:/#

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

4. المصادقة على العُقد باستخدام عملية الإعداد

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

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

في هذا التمرين، سنستخدم بنية الشبكة نفسها التي تتضمّن عقدتَين كما في السابق. للمصادقة، سيعمل جهاز Thread Leader كجهاز Commissioner، وسيعمل جهاز Mesh Extender كجهاز Joiner.

d6a67e8a0d0b5dcb.png

Docker

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

1. إنشاء شبكة

في Node 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

انتظِر بضع ثوانٍ وتأكَّد من أنّ الجهاز أصبح جهازًا رئيسيًا لشبكة Thread باتّباع الخطوات التالية:

> state
leader
Done

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

أثناء البقاء على الجهاز Node 1، ابدأ دور "المفوّض" (Commissioner) باتّباع الخطوات التالية:

> commissioner start
Done

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

> commissioner joiner add * J01NME
Done

3- بدء دور "المشارك"

في نافذة طرفية ثانية، في حاوية Docker، أنشئ عملية جديدة لواجهة سطر الأوامر. هذه هي العقدة 2.

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

على الجهاز Node 2، فعِّل دور Joiner باستخدام J01NME Joiner Credential.

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

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

بعد إكمال مصادقة الجهاز Node 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

في هذا التمرين، سنحاكي مثيلاً واحدًا لواجهة سطر الأوامر (جهاز Thread واحد مضمّن في نظام على شريحة) ومثيلاً واحدًا لمعالج الراديو المساعد (RCP).

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

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

Docker

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

استخدام ot-daemon

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

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

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

في نافذة الوحدة الطرفية الأولى، شغِّل عملية واجهة سطر الأوامر لجهاز 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). معرّف EID هو العنوان المحلي على مستوى الشبكة الذي لا يحتوي على ff:fe00 في العنوان. في نموذج الإخراج هذا، يكون معرّف شريحة SIM المضمّنة (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 verbose حتى تتمكّن من الاطّلاع على ناتج السجلّ والتأكّد من أنّه قيد التشغيل:

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 للانضمام إلى الشبكة

لم نكلّف Node 2 (جهاز التوجيه 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 في نافذة الوحدة الطرفية الثالثة هذه لإدارة Node 2 (عقدة RCP) التي بدأتها في نافذة الوحدة الطرفية الثانية باستخدام ot-daemon. تحقَّق من state للعقدة 2:

> state
disabled
Done

احصل على eui64 الخاص بالجهاز Node 2، وذلك لحصر إمكانية الانضمام على الجهاز Joiner المحدّد:

> eui64
18b4300000000001
Done

في Node 1 (نافذة المحطة الطرفية الأولى)، ابدأ تشغيل Commissioner واقتصر على الانضمام إلى eui64 فقط:

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

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

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

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

الآن، انضم إلى Node 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 باستخدام معرّفها الفريد (EID) مع الأمر ping6. إذا تم ربط مثيل ot-daemon RCP بشبكة 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. رائع!

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

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

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

يمكنك أيضًا تجربة استخدام OpenThread Border Router في حاوية Docker.