Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

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

26b7f4f6b3ea0700.png

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

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

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

ماذا ستتعلم

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

ماذا ستحتاج

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

شخص سخيف

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

تنزيل Git

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

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

مطلوب XCode لتثبيت 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

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

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

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

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

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

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

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

6e3aa07675f902dc.png

بينغ عقدة

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

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

$ cd ~/src/openthread
$ ./output/x86_64-unknown-linux-gnu/bin/ot-cli-ftd 1

يقوم هذا الثنائي بتطبيق جهاز 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 محجوز لاستخدامات أخرى.

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

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

> 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
Master 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 = mesh-local
  • يبدأ بـ fe80 = link-local

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

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

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

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

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

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

$ cd ~/src/openthread
$ ./output/x86_64-unknown-linux-gnu/bin/ot-cli-ftd 2

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

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

> dataset masterkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

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

> dataset commit active
Done

أظهر واجهة IPv6:

> ifconfig up
Done

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

> thread start
Done

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

> state
child
Done

في غضون دقيقتين سترى تبديل الحالة من 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 |

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

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

تحقق من الاتصال بين جهازي مؤشر الترابط المحاكين. في Node 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 الشبكة:

0161 اس 114 ف 110

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

> thread stop
Done
> factoryreset
>
> exit

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

> factoryreset
>
> exit

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

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

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

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

d6a67e8a0d0b5dcb.png

1. إنشاء شبكة

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

في العقدة 1 ، تفرخ عملية CLI:

$ cd ~/src/openthread
$ ./output/x86_64-unknown-linux-gnu/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
Master Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

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

> dataset commit active
Done

أظهر واجهة IPv6:

014- عبدالمجيد

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

> thread start
Done

انتظر بضع ثوانٍ وتحقق من أن الجهاز أصبح قائد سلسلة الرسائل:

> state
leader
Done

2. ابدأ دور المفوض

أثناء وجودك في العقدة 1 ، ابدأ دور المفوض:

> commissioner start
Done

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

> commissioner joiner add * J01NME
Done

3. ابدأ دور النجار

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

$ cd ~/src/openthread
$ ./output/x86_64-unknown-linux-gnu/bin/ot-cli-ftd 2

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

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

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

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

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

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

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

> thread stop
Done
> factoryreset
>
> exit

قد تضطر إلى الضغط على enter عدة مرات لإعادة الأمر > بعد أمر إعادة factoryreset .

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

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

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

استخدم ot-daemon

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

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

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

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

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

$ cd ~/src/openthread
$ ./output/x86_64-unknown-linux-gnu/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
Master Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

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

016c11956 definitely10

أظهر واجهة 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 ) وثلاثة fe80 محلية ( fd ). EID هو عنوان الشبكة المحلية الذي لا يحتوي على ff:fe00 في العنوان. في هذه العينة ، يكون EID هو fd55:cf34:dea5:7994:460:872c:e807:c4ab .

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

2. ابدأ ot-daemon

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

$ cd ~/src/openthread
$ ./output/posix/x86_64-unknown-linux-gnu/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/x86_64-unknown-linux-gnu/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 للانضمام إلى الشبكة

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

في نافذة طرفية ثالثة ، ابدأ ot-ctl :

$ ./output/posix/x86_64-unknown-linux-gnu/bin/ot-ctl
>

تحقق من state العقدة 2 (عقدة RCP) التي بدأتها مع ot-daemon :

> state
disabled
Done

احصل على eui64 Node 2 ، لتقييد الانضمام إلى eui64 المحدد:

> eui64
18b4300000000001
Done

في العقدة 1 ، ابدأ المفوض وقصر الانضمام إلى eui64 فقط:

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

في Node 2 ، اعرض واجهة الشبكة وانضم إلى الشبكة:

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

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

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

> thread start
Done

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

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

> state
child
Done
...
> state
router
Done

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

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

$ 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

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

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

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

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