محاكاة شبكات Thread باستخدام OTNS

لمحة عن هذا الدرس التطبيقي حول الترميز
schedule30 دقيقة
subjectتاريخ التعديل الأخير: 15 مايو 2025
account_circleتأليف: Simon Lin, Colin Tan, Esko Dijk

1. مقدمة

صورة توضيحية لبنية شبكة Thread المتداخلة

ما هو بروتوكول Thread وOTNS؟

‫Thread هو بروتوكول شبكة شبكة لاسلكية منخفضة الطاقة يستند إلى بروتوكول الإنترنت (IP) ويتيح اتصالات آمنة بين الأجهزة والأجهزة السحابية. يمكن لشبكات المواضيع التكيّف مع تغييرات البنية لتجنُّب حدوث نقطة تعطُّل واحدة.

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

يمكن استخدام محاكي شبكة OpenThread (OTNS) لمحاكاة شبكات Thread من خلال تشغيل عقد OpenThread محاكية على منصات posix. توفّر أداة OTNS واجهة ويب سهلة الاستخدام (OTNS-Web) لعرض شبكات Thread المحاكية وتشغيلها. من الممكن أيضًا إجراء عمليات المحاكاة النصية (باستخدام لغة Python).

المُعطيات

  • تثبيت OTNS والموارد التابعة له
  • التعرّف على أساسيات OTNS-CLI
  • كيفية إضافة/نقل/حذف عقد OpenThread في OTNS-Web
  • استخدام الميزات المفيدة الأخرى في OTNS-Web للتحكّم في محاكاة الشبكة
  • التأكّد من عدم توفّر نقطة فشل واحدة في OpenThread
  • الاطّلاع على حركة البيانات بين عقد OpenThread في Wireshark

تركّز ورشة رموز البرامج هذه على OTNS-CLI وOTNS-Web للاستخدام التفاعلي. ولا يشمل ذلك الميزات الأخرى في OTNS، مثل النصوص البرمجية بلغة Python.

المتطلبات

  • يُفضَّل استخدام Linux x86_64 أو نظام التشغيل Mac مع Homebrew. من المفترض أن يعمل أيضًا الإصدار 22 أو 24 من Ubuntu في WSL2 من Windows، ولكن قد يتطلّب ذلك إجراء بعض التعديلات اليدوية على الإعدادات.
  • Git:
  • متصفح ويب يستخدم OTNS-Web متصفح ويب لعرض المحاكاات.
  • مقدّمة عن سلاسل المحادثات ستحتاج إلى معرفة المفاهيم الأساسية لـ Thread لفهم ما يتم تدريسه في هذا الدرس التعليمي.

المصطلحات

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

2. تثبيت

الحصول على رمز OTNS

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

يتم تنفيذ جميع أوامر وحدة التحكّم اللاحقة في هذا الدليل التعليمي من دليل otns.

بدء التشغيل والتثبيت

سيثبِّت النص البرمجي bootstrap الملحقات (بما في ذلك Python3 وGo/Golang، إذا لزم الأمر) ويثبِّت OTNS. وينشئ أيضًا أنواع عقد OT المختلفة التي يمكن استخدامها مباشرةً في المحاكاة، ويُجري بعض الاختبارات الأساسية. قد يستغرق ذلك عدة دقائق بسبب عمليات إنشاء العقد.

$ ./script/bootstrap
....
....
OTNS installed - use 'otns' to start it.
$

قد يُطلب منك إدخال كلمة مرور لـ sudo.

إذا لم يتم تثبيت otns بشكل صحيح

قد يُبلغ النص البرمجي عن خطأ مثل:

....
OTNS installed - please add ~/go/bin to your PATH variable first, to use it.
$

في هذه الحالة، عليك إضافة $(go env GOPATH)/bin إلى $PATH..

في حال حدوث أخطاء أخرى، يمكن إنشاء مشكلة على GitHub.

3- تشغيل OTNS للمرة الأولى

الإجراء otns:

$ otns
>_ ← OTNS-CLI prompt

عند بدء OTNS بنجاح، سيدخل إلى وحدة تحكّم في واجهة سطر الأوامر (OTNS-CLI) وسيشغّل متصفّح ويب لعرض الشبكة وإدارتها (OTNS-Web):

نافذة OTNS-Web عند البدء

إذا كنت لا ترى سوى صفحة فارغة لتطبيق OTNS-Web، من المحتمل أنّ WebGL غير مفعّل في المتصفّح. يُرجى الرجوع إلى https://superuser.com/a/836833 لمعرفة كيفية تفعيل WebGL.

في الأقسام التالية، ستتعرّف على كيفية إدارة عمليات محاكاة OTNS من خلال OTNS-CLI وOTNS-Web.

4. التعرّف على OTNS-CLI وOTNS-Web

OTNS-CLI

OTNS-CLI هي واجهة سطر الأوامر (CLI) لإدارة عمليات محاكاة OTNS.

$ otns
>_ ← OTNS-CLI prompt

يمكنك كتابة الأوامر من خلال OTNS-CLI. راجِع مرجع واجهة سطر أوامر OTNS للحصول على قائمة كاملة بالطلبات. لا داعي للقلق، فأنت لن تستخدم سوى بعض هذه الأوامر في هذا الدليل التعليمي.

اكتب الأمر help للحصول على نظرة عامة على أوامر واجهة سطر الأوامر. هذه القائمة مطابقة لقائمة مراجع سطر الأوامر.

> help
add             Add a node to the simulation and get the node ID.
....
....
Done
> 

للحصول على مزيد من المساعدة بشأن طلب معيّن، استخدِم اسم الطلب، على سبيل المثال:

> help add
add
  Add a node to the simulation and get the node ID.
  
Definition:
....
....
> 

OTNS-Web

OTNS-Web هي أداة إدارة وعرض الشبكات في OTNS. ويقدّم هذا التقرير تمثيلاً مرئيًا للعقد والرسائل والروابط في شبكة Thread المحاكية. لاحِظ العناصر المختلفة في OTNS-Web:

OTNS-Web elements explained

5- إضافة عقد

إضافة العقد من خلال OTNS-CLI

أضِف "جهاز توجيه رسائل المواضيع" إلى المحاكاة:

> add router
1
Done

من المفترض أن تظهر لك عقدة تم إنشاؤها في OTNS-Web. تبدأ العقدة كجهاز توجيه وتصبح قائدة في بضع ثوانٍ:

عقدة واحدة في دور "القائد"

لتسهيل بدء عمليات المحاكاة بشكل تفاعلي، يتم تفعيل كل عقدة OpenThread جديدة تلقائيًا باستخدام مجموعة عادية من مَعلمات الشبكة.

إضافة المزيد من العقد من خلال OTNS-CLI

سنضيف الآن بعض العقد من أنواع مختلفة.

> add fed
2
Done
> add med
3
Done
> add sed
4
Done

انتظِر بضع ثوانٍ حتى تتمّ دمج العقد في قسم واحد. من المفترض أن تظهر لك العقد في OTNS-Web:

شبكة Thread تتضمّن 4 عقد

في OTNS-Web أيضًا، من الممكن اختيار أيّ من العقد للحصول على لوحة تتضمّن مزيدًا من المعلومات عن العقدة. على سبيل المثال، في الشكل أدناه، تم اختيار العقدة 1. يؤكد إدخال "الدور" في اللوحة أنّه قائد.

شبكة سلاسل المحادثات تتضمّن 4 عقد، وتم اختيار العقدة 1

إضافة العقد حسب OTNS-Web

يمكنك أيضًا إضافة عقد من خلال OTNS-Web. انقر على الزر New Router في Action Bar. من المفترض أن تظهر لك عقدة يتم إنشاؤها على يسار العقدة المحدّدة. يجب أن ينضم جهاز التوجيه الجديد إلى قسم Thread الحالي:

تمت إضافة جهاز توجيه، وأصبح لدينا 5 عقد في المجموع.

انقر أيضًا على أزرار FED وMED وSSED وBR في شريط الإجراءات لإنشاء هذه الأنواع الأخرى من العقد. من المفترض أن يكون لديك الآن 9 عقد في المجموع. يمكنك سحب بعض العقد إلى مواضع أخرى لإنشاء طوبولوجيا شبكة فعلية مختلفة.

تمت إضافة عدة عقد جديدة، بإجمالي 9 عقد

لقد أنشأت الآن شبكة Thread من قسم واحد يحتوي على العديد من العقد. في القسم التالي، سنضبط سرعة المحاكاة لتشغيل المحاكاة بشكل أسرع.

6. ضبط السرعة

من المفترض أن يتم حاليًا تنفيذ المحاكاة بسرعة 1X، ما يعني أنّ وقت المحاكاة الذي مضى حتى الآن هو نفسه الوقت الفعلي منذ إنشاء العقدة الأولى.

ضبط السرعة من خلال OTNS-CLI

يمكنك ضبط سرعة المحاكاة من خلال OTNS-CLI.

ضبط سرعة المحاكاة على 100X

> speed 100
Done

من المفترض أن تلاحظ أنّ العقد ترسل الرسائل بشكلٍ أكثر تكرارًا من ذي قبل.

ضبط سرعة المحاكاة على MAX

> speed max
Done

الآن، يبذل OTNS قصارى جهده لمحاكاة الشبكة بأسرع ما يمكن، لذا من المفترض أن ترى العقد ترسل عددًا كبيرًا من الرسائل.

إيقاف المحاكاة

> speed 0
Done

يؤدي ضبط سرعة المحاكاة على 0 إلى إيقاف المحاكاة مؤقتًا.

استعادة المحاكاة بالسرعة العادية

> speed 1
Done

يؤدي ضبط سرعة المحاكاة على قيمة أكبر من 0 إلى استئناف المحاكاة.

ضبط السرعة من خلال OTNS-Web

أزرار التحكّم في السرعة

ابحث عن أزرار التحكّم في السرعة أزرار التحكّم في السرعة على Action Bar. تعرِض الأزرار سرعة المحاكاة الحالية ويمكن استخدامها لضبط سرعة المحاكاة وإيقاف المحاكاة مؤقتًا أو استئنافها.

تسريع المحاكاة

يمكنك تسريع المحاكاة من خلال النقر على الزر زر زيادة السرعة إلى أن تصل السرعة إلى MAX: مؤشر سرعة المحاكاة القصوى.

إبطاء المحاكاة

يمكنك إبطاء المحاكاة من خلال النقر على الزر زر خفض السرعة.

إيقاف المحاكاة

انقر على الزر زر الإيقاف المؤقت لإيقاف المحاكاة مؤقتًا أثناء تشغيلها. سيتم تغيير الزر إلى زر التشغيل.

استئناف المحاكاة

انقر على الزر زر التشغيل لاستئناف المحاكاة عندما تكون متوقفة مؤقتًا. سيتم تغيير الزر مرة أخرى إلى زر الإيقاف المؤقت.

ضبط سرعة المحاكاة على 10X

لتوفير الوقت، استخدِم

OTNS-CLI لضبط سرعة المحاكاة على

10X لكي نتمكّن من رصد التغييرات في البنية في الشبكة بشكلٍ أسرع بكثير.

> speed 10
Done

7. تفعيل الراديو أو إيقافه

من المفترض أن تحتوي المحاكاة الآن على جهازَي توجيه على الأقل (شكل سداسي)، وربما جهاز توجيه حدودي (شكل مربّع) والعديد من العناصر الفرعية، وأن يتم تشغيلها بسرعة 10 أضعاف.

ابحث عن جهاز التوجيه الحالي (الحدّ الأحمر) للجهازَين، وانقر عليه مرة واحدة لاختياره:

شبكة سلاسل المحادثات مع اختيار العقدة الرئيسية 1

إيقاف اللاسلكي

انقر على الزر زر إيقاف اللاسلكي في شريط الإجراءات لإيقاف زر الاختيار الخاص بعقدة "القائد". لن يتمكّن "القائد" من إرسال الرسائل أو تلقّيها عندما يكون جهاز الراديو غير مفعّل.

انتظِر لمدة 12 ثانية تقريبًا (120 ثانية في وقت المحاكاة) لكي يصبح جهاز التوجيه أو جهاز توجيه الحدود الآخران هو جهاز التوجيه الرئيسي الجديد:

يتم إنشاء قسم جديد باستخدام العقدة 9 بصفتها العقدة الرئيسية الجديدة

تستعيد شبكة Thread من تعذُّر عمل "القائد" تلقائيًا من خلال إنشاء قسم جديد يتضمّن "قائدًا" جديدًا. يتميز القسم الجديد أيضًا بلون جديد.

تشغيل اللاسلكي

اختَر جهاز "القائد" الذي تم إيقاف الراديو فيه. انقر على الزر زر تشغيل الراديو على Action Bar لاستعادة اتصال الراديو:

انضمام العقدة 1 إلى التقسيم بعد تشغيل جهاز الراديو مرة أخرى

من المفترض أن يعيد جهاز "القائد" الاتصال بالشبكة بعد استعادة الاتصال بالراديو.

8. نقل العقد

تتيح تقنية OTNS للمستخدمين نقل العقد بسهولة من خلال OTNS-CLI أو OTNS-Web.

نقل العقدة من خلال OTNS-CLI

انقل عقدة "جهاز التوجيه الحدودي" 9 إلى موقع جديد:

> move 9 50 50
Done

نقل العقدة من خلال OTNS-Web

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

تم نقل العقدة 5 بعيدًا عن العقد الأخرى وتشكيل قسم جديد

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

9- حذف العقد

حذف العقد من خلال OTNS-CLI

لحذف العقدة 5:

> del 5
Done

من المفترض أن تختفي العقدة 5 من المحاكاة:

تم حذف العقدة 5 من المحاكاة

حذف العقد من خلال OTNS-Web

اختَر عقدة "جهاز التوجيه الحدودي" 9 وانقر على الزر زر الحذف في Action Bar لحذف العقدة 9:

تم حذف عقدة جهاز التوجيه الحدودي 9

من المفترض أن تصبح العقدة Node 1 قائدة لقسم جديد، وسيتم ربط جميع العقد المتبقية كعقدة فرعية بالعقدة 1.

10. سياق عقدة OTNS-CLI

يوفّر OTNS-CLI وضع سياق العقدة للتفاعل بسهولة مع العقد لمساعدة المطوّرين في تشخيص حالة العقدة. يمكن أيضًا بدء إجراءات العقد من هذا الوضع.

الدخول إلى وضع سياق العقدة

أدخِل سياق العقدة للعقدة 1:

> node 1
Done
node 1>

تغيّر طلب سطر الأوامر إلى node 1>، ما يشير إلى سياق العقدة الحالي. يمكنك كتابة أوامر OpenThread CLI لتنفيذها على العقدة كما لو كنت تتفاعل مع العقدة مباشرةً.

تنفيذ الأوامر في سياق العقدة

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
otns
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:b400
fd00:f00d:cafe:0:2505:8719:3685:ebfb
fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb
fe80:0:0:0:e86a:e07:ec97:777
Done

التبديل إلى سياق عقدة آخر

node 1> node 2
Done
node 2> 

الخروج من سياق العقدة

node 1> exit
Done
>

هناك طريقة بديلة للخروج من سياق العقدة وهي الأمر node 0.

11. عرض سجلات العقد وعمليات التقاط الحِزم

سجلات عقدة OpenThread

ينشئ OTNS تلقائيًا ملفات سجلّ تفصيلية لجميع عقد OpenThread المحاكية. ويمكن الاطّلاع عليها في دليل ./tmp. اسم الملف هو 0_.log. على سبيل المثال، يظهر أدناه مقتطف من ملف السجلّ:

7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-:     src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6    | ..&..!.eSZCN.Y.  |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-:     src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---:     12 0x3000 - me - leader

يظهر وقت المحاكاة المطلق بالميكروسكوند على يمين الصفحة. يعرض الطابع الزمني hh:mm:ss الطابع الزمني لسجلّ عقدة OpenThread، والذي قد يختلف عن وقت المحاكاة المطلق.

عمليات التقاط حزم البيانات باستخدام Wireshark

يتم تلقائيًا تسجيل جميع إطارات IEEE 802.15.4 المُرسَلة في ملف PCAP current.pcap. يمكن قراءة هذا الملف باستخدام Wireshark أثناء المحاكاة أو بعدها. بسبب التشفير على مستوى رابط Thread، يجب إجراء عملية ضبط لمرة واحدة في Wireshark لضبط مفتاح فك التشفير لبروتوكول OTNS بشكلٍ صحيح. يتم تلقائيًا استخدام مفتاح شبكة معروف لتسهيل فك تشفير الإطارات باستخدام Wireshark.

اطّلِع على لقطة الشاشة أدناه للحصول على مثال على فحص حزم OpenThread في Wireshark.

لقطة شاشة لتحليل حِزم OpenThread في Wireshark

لضبط مفتاح فك التشفير، اختَر تعديل -> الإعدادات المفضّلة في القائمة. بعد ذلك، في نافذة الإعدادات المفضّلة، اختَر بروتوكولات -> IEEE 802.15.4. انقر على الزر تعديل... بجانب "مفاتيح فك التشفير". انقر على + لإنشاء إدخال جديد وأدخِل المفتاح 00112233445566778899aabbccddeeff (32 حرفًا) واختَر "تجزئة سلسلة المحادثات" في حقل "تجزئة المفتاح". يمكن ترك "فهرس مفتاح فك التشفير" على 0. بعد ذلك، انقر على حسنًا، ثم على حسنًا مرة أخرى. من المفترض أن يتم الآن فك تشفير ملف PCAP الخاص بنظام OTNS بشكل صحيح عند تحميله.

تتطابق الطوابع الزمنية المعروضة في عمود "الوقت" (بالثواني) مع قيم وقت المحاكاة المطلق المعروضة في سجلات عقدة OpenThread. يسهّل ذلك ربط رسائل السجلّ بإطارات الراديو المُرسَلة أو المُستلَمة. ومع ذلك، لا تكون القيم عادةً متطابقة بدقة تصل إلى ميكرو ثانية واحدة: قد تضيف أجهزة الراديو المحاكية IEEE 802.15.4 بعض التأخير الإضافي، بعد أن تطلب حزمة OpenThread إرسال إطار راديو.

12. تهانينا

تهانينا، لقد نجحت في تنفيذ أوّل محاكاة لميزة "الإعلانات على شبكة البحث".

لقد تعرّفت على كيفية تثبيت OTNS والبرامج التي يعتمد عليها. لقد بدأت محاكاة OTNS باستخدام عقد OpenThread المحاكية. لقد تعلمت كيفية التلاعب بالمحاكاة بطرق مختلفة من خلال كلّ من OTNS-CLI وOTNS-Web.

لقد تعرّفت الآن على OTNS وكيفية استخدام OTNS لمحاكاة شبكات OpenThread.

ما هي الخطوات التالية؟

اطّلِع على بعض هذه الدروس التطبيقية حول الترميز...

المستندات المرجعية