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

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

حدِّد معرّف شريحة SIM المضمّنة (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 start
Done

سيتم إعداد الجهاز تلقائيًا كجهاز طفل. يُعادل جهاز Thread Child جهاز End Device، وهو جهاز Thread يرسل ويستقبل حركة المرور أحادية البث فقط مع جهاز Parent.

> state
child
Done

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

> state
router
Done

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

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

‫1. التحقّق من إمكانية الاتصال

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

> rloc16
5800
Done

على العقدة 1، تحقَّق من جدول جهاز التوجيه الخاص بالعقدة 2 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 |

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

‫2. إرسال طلب Ping من العقدة 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 وتحقَّق من الحالة. في غضون دقيقتَين، يرصد الجهاز Node 2 أنّ الجهاز الرئيسي (Node 1) غير متصل بالإنترنت، ومن المفترض أن تلاحظ أنّ الجهاز Node 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)، يجب مصادقة العُقد.

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

في هذا التمرين، سنستخدم بنية الشبكة نفسها التي تتضمّن عقدتَين كما في السابق. للمصادقة، سيعمل جهاز Thread Leader كجهاز Commissioner، وسيعمل جهاز Thread Router كجهاز 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 start
Done

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

> state
leader
Done

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

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

> commissioner start
Done

السماح لأي جهاز 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.

بعد إكمال مصادقة الجهاز 2، ابدأ شبكة Thread:

> thread start
Done

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

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

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

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

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

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

في نافذة الوحدة الطرفية الثالثة، اخرج من ot-ctl باستخدام الأمر Ctrl+D أو الأمر exit، وارجع إلى وحدة تحكّم bash للحاوية. من وحدة التحكّم هذه، أرسِل طلب اختبار الاتصال إلى العقدة 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.