محاكاة شبكة خيط باستخدام OpenThread

1 المقدمة

26b7f4f6b3ea0700.png

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

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

يرشدك Codelab هذا خلال محاكاة شبكة Thread على أجهزة محاكاة.

ماذا ستتعلم

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

ماذا ستحتاج

  • شخص سخيف
  • المعرفة الأساسية لينكس ، توجيه الشبكة

2. قم بإعداد نظام البناء

شخص سخيف

مطلوب Git لإكمال Codelab هذا. قم بتنزيله وتثبيته قبل المتابعة.

تنزيل Git

بمجرد التثبيت ، اتبع الإرشادات الخاصة بنظام التشغيل المحدد لتنزيل OpenThread وإنشائه.

XCode لنظام التشغيل Mac OS X

مطلوب كسكودي لتركيب وبناء OpenThread على نظام التشغيل Mac OS X.

تنزيل XCode

بعد تثبيت XCode ، قم بتثبيت أدوات سطر أوامر XCode:

$ xcode-select --install

بناء على Linux / Mac OS X

تم اختبار إرشادات التثبيت هذه على Ubuntu Server 14.04 LTS و Mac OS X Sierra 10.12.6.

قم بتثبيت OpenThread. في bootstrap الأوامر تأكد من تثبيت toolchain ويتم تكوين البيئة بشكل صحيح:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap
$ ./bootstrap

باستخدام Windows

إذا كنت تفضل Windows ، فإننا نوصي بتجربة إصدار Docker من Codelab هذا.

محاكاة OpenThread على Docker

3. بناء تطبيقات OpenThread

بمجرد اكتمال التثبيت ، قم ببناء مثال تطبيق OpenThread. في برنامج Codelab هذا ، نستخدم مثال المحاكاة.

$ cd ~/src/openthread
$ make -f examples/Makefile-simulation

الآن قم ببناء OpenThread Daemon:

$ cd ~/src/openthread
$ make -f src/posix/Makefile-posix DAEMON=1

4. محاكاة شبكة الموضوع

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

يأخذك هذا التمرين خلال الحد الأدنى من الخطوات المطلوبة لإجراء اختبار ping لجهاز سلسلة خيطي مُحاكى من جهاز خيط آخر مُحاكى.

يوضح الشكل أدناه الهيكل الأساسي لشبكة سلسلة الرسائل. في هذا التمرين ، سنقوم بمحاكاة العقدتين داخل الدائرة الخضراء: Thread Leader و Thread Router مع اتصال واحد بينهما.

6e3aa07675f902dc.png

بينغ عقدة

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

انتقل إلى openthread الدليل وتفرخ عملية CLI لجهاز محاكاة الموضوع باستخدام ot-cli-ftd ثنائي.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

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

يقوم هذا الثنائي بتطبيق جهاز OpenThread تمت محاكاته أعلى POSIX. يتم تنفيذ برنامج تشغيل الراديو IEEE 802.15.4 أعلى UDP (يتم تمرير إطارات IEEE 802.15.4 داخل حمولات UDP).

حجة 1 هو اصف الملف الذي يمثل بت الأقل كبيرة من "مصنع المعين" IEEE EUI-64 للجهاز محاكاة. تُستخدم هذه القيمة أيضًا عند الربط بمنفذ UDP لمحاكاة الراديو IEEE 802.15.4 (المنفذ = 9000 + واصف الملف). سيستخدم كل مثيل لجهاز خيط محاكاة في Codelab هذا واصف ملف مختلف.

ملاحظة: واصف ملف استخدام فقط من 1 أو أكبر كما هو موضح في هذا Codelab عندما وضع البيض عملية لجهاز محاكاة. واصف ملف 0 محجوز لاستخدام آخر.

قم بإنشاء مجموعة بيانات تشغيلية جديدة والتزم بها كمجموعة نشطة. مجموعة البيانات التشغيلية هي التكوين لشبكة الموضوع التي تقوم بإنشائها.

> 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 المخصصة لواجهة Node 1's 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 = شبكة-المحلية
  • يبدأ fe80 = الارتباط المحلي

يتم تصنيف أنواع العناوين المحلية المعشقة بشكل أكبر:

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

حدد EID في إخراج وحدة التحكم الخاصة بك وقم بتدوينه لاستخدامه لاحقًا. في نموذج الإخراج أعلاه ، يكون EID هو:

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

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

فتح محطة جديدة وانتقل إلى openthread الدليل وتفرخ عملية CLI. هذا هو جهاز الخيط الثاني المحاكى لك:

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

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

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

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

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

> dataset commit active
Done

أظهر واجهة IPv6:

> ifconfig up
Done

بدء تشغيل بروتوكول الموضوع:

> thread start
Done

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

> state
child
Done

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

> state
router
Done

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

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

1. تحقق من الاتصال

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

> rloc16
5800
Done

في Node 1 ، تحقق من جدول جهاز التوجيه الخاص بـ Node 2's RLOC16. تأكد من تحول العقدة 2 إلى حالة جهاز التوجيه أولاً.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC  |
+----+--------+----------+----------+-------+---------+-----+------------------+
| 20 | 0x5000 |       63 |         0 |     0 |      0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |     3 |      3 |  23 | 5a4eb647eb6bc66c |

RLOC عقدة 1 من 0xa800 وجدت في الجدول، مؤكدا أنها متصلة شبكة.

2. عقدة بينغ 1 من العقدة 2

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

العودة إلى العقدة 1 وإيقاف الموضوع:

> thread stop
Done

قم بالتبديل إلى Node 2 وتحقق من الحالة. في غضون دقيقتين، عقدة 2 يكتشف أن زعيم (عقدة 1) غير متواجد حاليا، ويجب أن نرى عقدة 2 انتقالية ليكون leader الشبكة:

> state
router
Done
...
> state
leader
Done

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

> thread stop
Done
> factoryreset
>
> exit

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

> factoryreset
>
> exit

رؤية OpenThread CLI المرجعي لاستكشاف جميع الأوامر CLI المتاحة.

5. مصادقة العقد مع التكليف

في التمرين السابق ، قمت بإعداد شبكة سلاسل رسائل بجهازين تمت محاكاتهما واتصال تم التحقق منه. ومع ذلك ، فإن هذا يسمح فقط لحركة مرور بيانات الارتباط المحلية IPv6 غير المصادق عليها بالمرور بين الأجهزة. لتوجيه حركة مرور IPv6 العالمية بينها (والإنترنت عبر موجه حدود مؤشر الترابط) ، يجب مصادقة العقد.

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

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

d6a67e8a0d0b5dcb.png

1. إنشاء شبكة

في حالة المتابعة من التمرين السابق ، يجب أن يكون لديك بالفعل نافذتان طرفية مفتوحتان. إذا لم يكن الأمر كذلك ، فتأكد من فتح اثنين وجاهزين للاستخدام. سيكون أحدهما بمثابة العقدة 1 ، والآخر كعقدة 2.

في العقدة 1 ، ولّد عملية CLI:

$ cd ~/src/openthread
$ ./output/simulation/bin/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. ابدأ دور النجار

في نافذة طرفية ثانية ، قم بإنشاء عملية CLI جديدة. هذه هي العقدة 2.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

على عقدة 2، تمكين دور النجار باستخدام J01NME النجار الاعتماد.

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

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

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

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

5. إعادة التكوين

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

> thread stop
Done
> factoryreset
>
> exit

قد تضطر إلى الصحافة enter عدة مرات لجلب > العودة السريعة بعد factoryreset الأوامر.

6. إدارة الشبكة مع OpenThread Daemon

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

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

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

استخدم ot-daemon

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

  1. مثيل CLI لجهاز الخيط الذي تمت محاكاته (العقدة 1)
  2. ot-daemon عملية
  3. ot-ctl المثال CLI

في حالة المتابعة من التمرين السابق ، يجب أن يكون لديك بالفعل نافذتان طرفيتان مفتوحتان. افتح نافذة ثالثة للتأكد من أن لديك ثلاث نوافذ طرفية متاحة لهذا التمرين.

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

في النافذة الطرفية الأولى ، قم بإنشاء عملية CLI لجهاز Thread المحاكى الخاص بك:

$ cd ~/src/openthread
$ ./output/simulation/bin/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 المعينة لواجهة Node 1's Thread:

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

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

تحديد EID محددة من هاتفك ipaddr الإخراج، والتي سيتم استخدامها للتواصل مع العقدة.

2. ابدأ ot-daemon

في إطار المحطة الطرفية الثاني، انتقل إلى openthread الدليل، والبدء ot-daemon لعقدة الحزب الشيوعي الثوري، الذي سوف ندعو عقدة 2. استخدام -v مطول العلم حتى تستطيع أن ترى إخراج سجل وتأكيد أنه يشغل:

$ cd ~/src/openthread
$ ./output/posix/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'

عندما ناجحة، ot-daemon في مطول الوضع يولد إخراج مشابه لما يلي:

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08

اترك هذا الجهاز مفتوحًا ويعمل في الخلفية. لن تدخل أي أوامر أخرى فيه.

3. استخدم ot-ctl للانضمام إلى الشبكة

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

في إطار المحطة الثالثة، تبدأ ot-ctl :

$ ./output/posix/bin/ot-ctl
>

عليك استخدام ot-ctl في هذا الإطار المحطة الثالثة لإدارة عقدة 2 (عقدة الحزب الشيوعي الثوري) التي بدأت في إطار المحطة الطرفية الثاني مع ot-daemon . تحقق من state من عقدة 2:

> state
disabled
Done

الحصول على عقدة 2 في eui64 ، للحد من الانضمام إلى الخاص النجار:

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

انضم الآن إلى Node 2 إلى شبكة Thread:

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

5. التحقق من صحة الاتصال

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

$ 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

7. مبروك!

لقد نجحت في محاكاة أول شبكة سلاسل رسائل باستخدام OpenThread. مذهل!

تعلمت في Codelab هذا كيفية:

  • قم بإعداد OpenThread build toolchain
  • محاكاة شبكة الموضوع
  • مصادقة عقد الموضوع
  • إدارة شبكة الموضوع مع OpenThread Daemon

إذا كنت تريد معرفة المزيد ، فاستكشف هذه المراجع: