OpenThread الذي أصدرته Google هو تطبيق مفتوح المصدر لبروتوكول شبكة Thread . أصدر Google Nest OpenThread لإتاحة التكنولوجيا المستخدمة في منتجات Nest على نطاق واسع للمطورين لتسريع تطوير المنتجات للمنزل المتصل.
تحدد مواصفات الخيط بروتوكول اتصال لاسلكي من جهاز إلى جهاز يعتمد على IPv6 موثوق وآمن ومنخفض الطاقة للتطبيقات المنزلية. ينفذ OpenThread جميع طبقات شبكة الخيط بما في ذلك IPv6 و 6LoWPAN و IEEE 802.15.4 مع أمان MAC وإنشاء ارتباط الشبكة وتوجيه الشبكة.
يرشدك Codelab هذا خلال محاكاة شبكة Thread على أجهزة محاكاة.
ماذا ستتعلم
- كيفية إعداد سلسلة أدوات إنشاء OpenThread
- كيفية محاكاة شبكة الخيط
- كيفية مصادقة عقد الموضوع
- كيفية إدارة شبكة Thread مع OpenThread Daemon
ماذا ستحتاج
- شخص سخيف
- المعرفة الأساسية لينكس ، توجيه الشبكة
شخص سخيف
مطلوب Git لإكمال Codelab هذا. قم بتنزيله وتثبيته قبل المتابعة.
بمجرد التثبيت ، اتبع الإرشادات الخاصة بنظام التشغيل المحدد لتنزيل OpenThread وإنشائه.
XCode لنظام التشغيل Mac OS X
مطلوب XCode لتثبيت OpenThread وإنشائه على نظام التشغيل Mac OS X.
بعد تثبيت 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. في برنامج 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 مع اتصال واحد بينهما.
بينغ عقدة
1. ابدأ العقدة 1
انتقل إلى دليل openthread
عملية CLI لجهاز خيط تمت محاكاته باستخدام ثنائي ot-cli-ftd
.
$ cd ~/src/openthread $ ./output/simulation/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/simulation/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
الشبكة:
> state router Done ... > state leader Done
بمجرد التأكيد ، أوقف Thread وأعد ضبط Node 2 على إعدادات المصنع قبل الخروج. تتم إعادة ضبط المصنع للتأكد من أن بيانات اعتماد شبكة مؤشر الترابط التي استخدمناها في هذا التمرين لا يتم نقلها إلى التمرين التالي.
> thread stop Done > factoryreset > > exit
أيضًا إعادة ضبط المصنع والخروج من العقدة 1:
> factoryreset > > exit
راجع مرجع OpenThread CLI لاستكشاف جميع أوامر CLI المتاحة.
في التمرين السابق ، قمت بإعداد شبكة سلاسل رسائل بجهازين تمت محاكاتهما واتصال تم التحقق منه. ومع ذلك ، فإن هذا يسمح فقط لحركة مرور بيانات الارتباط المحلية IPv6 غير المصادق عليها بالمرور بين الأجهزة. لتوجيه حركة مرور IPv6 العالمية بينها (والإنترنت عبر موجه حدود مؤشر الترابط) ، يجب مصادقة العقد.
من أجل المصادقة ، يجب أن يعمل جهاز واحد كمفوض. المفوض هو خادم المصادقة المختار حاليًا لأجهزة الخيط الجديدة ، والمفوض لتوفير بيانات اعتماد الشبكة المطلوبة للأجهزة للانضمام إلى الشبكة.
في هذا التمرين ، سوف نستخدم نفس الهيكل ثنائي العقد كما في السابق. للمصادقة ، سيعمل قائد سلسلة المحادثات كمفوض ، وجهاز التوجيه الخيطي بصفته نجارًا.
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 Master 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
(باستخدام *
حرف البدل) مع بيانات اعتماد J01NME
Joiner بالتكليف على الشبكة. النجار هو جهاز تمت إضافته بواسطة مسؤول بشري إلى شبكة سلاسل رسائل مفوضة.
> commissioner joiner add * J01NME Done
3. ابدأ دور النجار
في نافذة طرفية ثانية ، قم بإنشاء عملية CLI جديدة. هذه هي العقدة 2.
$ cd ~/src/openthread $ ./output/simulation/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
سيستخدم هذا التمرين ثلاث نوافذ طرفية ، تتوافق مع ما يلي:
- مثيل CLI لجهاز الخيط المحاكي (العقدة 1)
- عملية
ot-daemon
- مثيل
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 Master 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
) وثلاثة عناوين محلية 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/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 للانضمام إلى الشبكة
لم نقم بتكليف Node 2 ( ot-daemon
RCP) لأي شبكة خيط حتى الآن. هذا هو المكان ot-ctl
يأتي فيه ot-ctl
. يستخدم ot-ctl
نفس CLI مثل تطبيق OpenThread CLI. لذلك ، يمكنك التحكم ot-daemon
عُقد ot-daemon
بنفس طريقة أجهزة Thread المحاكاة الأخرى.
في نافذة طرفية ثالثة ، ابدأ ot-ctl
:
$ ./output/posix/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
إذا كنت تريد معرفة المزيد ، فاستكشف هذه المراجع: