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

1- المقدمة

26b7f4f6b3ea0700.png

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

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

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

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

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

المتطلبات

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

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

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

تثبيت Docker

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

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

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

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

ينقلك هذا التمرين إلى الحد الأدنى من الخطوات المطلوبة ليتم فحص اتصال جهاز 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

في حاوية إرساء، يمكنك بدء عملية واجهة سطر الأوامر (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-EI-64 "المُخصص من قِبل المصنع" للجهاز الذي يحاكي الجهاز. وتُستخدم هذه القيمة أيضًا عند الربط بمنفذ UDP لمحاكاة IEEE 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 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 = mesh-local
  • يبدأ بـ fe80 = link-local

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

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

عليك تحديد معرّف بطاقة SIM المضمنة (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. هذا هو الجهاز الثاني الذي يحاكي محاكاة سلسلة المحادثات:

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

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

> 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 للعقدة الثانية في 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 (>).

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

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

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

> thread stop
Done

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

> state
router
Done
...
> state
leader
Done

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

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

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

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

> factoryreset
>
> exit
root@c0f3912a74ff:/#

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

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

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

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

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

d6a67e8a0d0b5dcb.png

قاعدة إرساء

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

بصفتك جهاز انضمام، تمت بنجاح مصادقة الجهاز (العقدة الثانية) باستخدام المفوض (العقدة 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. إدارة الشبكة باستخدام Open يقبل البرنامج الخفي

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

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

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

قاعدة إرساء

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

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

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

  1. مثيل واجهة سطر الأوامر (CLI) لجهاز محاكاة سلاسل المحادثات (عقدة 1)
  2. عملية واحدة (ot-daemon)
  3. مثيل CLI 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 المخصّصة لواجهة 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. بدء البرنامج الخفي

في النافذة الطرفية الثانية، أنشِئ عقدة جهاز 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) لأي شبكة سلسلة محادثات حتى الآن. هنا يأتي دور ot-ctl. يستخدم ot-ctl واجهة سطر الأوامر نفسها التي يستخدمها تطبيق OpenLI 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

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

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

بصفتك انضمامًا، تمت مصادقة RCP (العقدة الثانية) بنجاح باستخدام المفوَّض (العقدة 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. إذا تم دمج مثيل 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

bash الإشعارات، قد تحتاج إلى التحقُّق مما إذا كان قيد التشغيل وإعادة التشغيل / الإعادة حسب الحاجة. يجب أن تظل أي حاويات إرساء أنشأتها في حال لم تستخدم خيار --rm متاحة.

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

$ 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)، تأكَّد من تشغيل PowerShell بصفتك المستخدم الجذر وفقًا للأوامر المقدَّمة في هذا الدرس التطبيقي حول الترميز. لا يتوافق الدرس التطبيقي حول الترميز هذا مع وضع Docker في وضع الجذر.

7- تهانينا.

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

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

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

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

أو جرّب استخدام جهاز توجيه الحدود في سلسلة محادثات في حاوية إرساء.