OpenThread الذي أصدرته Google هو تطبيق مفتوح المصدر لبروتوكول شبكة Thread® . أصدر Google Nest OpenThread لإتاحة التكنولوجيا المستخدمة في منتجات Nest على نطاق واسع للمطورين لتسريع تطوير المنتجات للمنزل المتصل.
تحدد مواصفات الخيط بروتوكول اتصال لاسلكي من جهاز إلى جهاز يعتمد على IPv6 موثوق وآمن ومنخفض الطاقة للتطبيقات المنزلية. ينفذ OpenThread جميع طبقات شبكة الخيط بما في ذلك IPv6 و 6LoWPAN و IEEE 802.15.4 مع أمان MAC وإنشاء ارتباط الشبكة وتوجيه الشبكة.
في Codelab هذا ، ستقوم ببرمجة OpenThread على أجهزة حقيقية ، وإنشاء شبكة خيط وإدارتها ، وتمرير الرسائل بين العقد.
ماذا ستتعلم
- إنشاء ثنائيات OpenThread CLI وامضها إلى لوحات التطوير
- بناء RCP يتكون من جهاز Linux ولوحة تطوير
- التواصل مع RCP باستخدام OpenThread Daemon و
ot-ctl
- إدارة عقد الموضوع يدويًا باستخدام Screen و OpenThread CLI
- تأمين تشغيل الأجهزة على شبكة خيط
- كيف يعمل البث المتعدد IPv6
- تمرير الرسائل بين عقد الموضوع مع UDP
ماذا ستحتاج
المعدات:
- 3 لوحات ديف نورديك لأشباه الموصلات nRF52840
- 3 كبلات USB إلى Micro-USB لتوصيل اللوحات
- جهاز Linux به 3 منافذ USB على الأقل
برمجة:
- سلسلة أدوات جنو
- أدوات سطر الأوامر nRF5x الاسكندنافية
- برنامج Segger J-Link
- OpenThread
- شخص سخيف
باستثناء ما هو مذكور خلافًا لذلك ، يتم ترخيص محتوى Codelab هذا بموجب ترخيص Creative Commons Attribution 3.0 ، ويتم ترخيص نماذج التعليمات البرمجية بموجب ترخيص Apache 2.0 .
محاكاة OpenThread
قبل البدء ، قد ترغب في المرور عبر OpenThread Simulation Codelab ، للتعرف على مفاهيم Thread الأساسية و OpenThread CLI.
محطات المنفذ التسلسلي
يجب أن تكون على دراية بكيفية الاتصال بمنفذ تسلسلي من خلال محطة طرفية. يستخدم Codelab هذا Screen ويقدم نظرة عامة على الاستخدام ، ولكن يمكن استخدام أي برنامج طرفي آخر.
آلة لينكس
تم تصميم Codelab هذا لاستخدام جهاز Linux يستند إلى i386 أو x86 ليكون بمثابة مضيف لجهاز Radio Co-Processor (RCP) Thread ، ولإصدار وميض جميع لوحات تطوير Thread. تم اختبار جميع الخطوات على Ubuntu 14.04.5 LTS (Trusty Tahr).
لوحات الشمال أشباه الموصلات nRF52840
يستخدم Codelab هذا ثلاث لوحات nRF52840 PDK .
قم بتثبيت SEGGER J-Link
نستخدم SEGGER J-Link لبرمجة لوحات nRF52840 ، التي تحتوي على وحدات JTAG المدمجة. قم بتثبيت هذا على جهاز Linux الخاص بك.
قم بتنزيل الحزمة المناسبة لجهازك ، وقم بتثبيتها في المكان المناسب. في Linux ، هذا هو /opt/SEGGER/JLink
.
قم بتثبيت nRF5x Command Line Tools
تتيح لك أدوات سطر الأوامر nRF5x إمكانية وميض ثنائيات OpenThread إلى لوحات nRF52840. قم بتثبيت nRF5x-Command-Line-Tools- المناسب <OS> المبني على جهاز Linux الخاص بك.
ضع الحزمة المستخرجة في المجلد الجذر ~/
قم بتثبيت ARM GNU Toolchain
يتم استخدام ARM GNU Toolchain للبناء.
نوصي بوضع الأرشيف المستخرج في /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
على جهاز Linux الخاص بك. اتبع التعليمات الموجودة في ملف readme.txt
الخاص بالأرشيف للحصول على إرشادات التثبيت.
شاشة التثبيت (اختياري)
الشاشة هي أداة بسيطة للوصول إلى الأجهزة المتصلة بواسطة منفذ تسلسلي. يستخدم Codelab هذا Screen ، ولكن يمكنك استخدام أي تطبيق طرفي منفذ تسلسلي تريده.
$ sudo apt-get install screen
OpenThread
استنساخ وتثبيت OpenThread. تتأكد أوامر script/bootstrap
من تثبيت toolchain وتهيئة البيئة بشكل صحيح:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
بناء OpenThread Daemon:
$ script/cmake-build posix -DOT_DAEMON=ON
أنت الآن جاهز لإنشاء OpenThread وفلاشها على لوحات nRF52840.
بناء وفلاش
قم ببناء مثال OpenThread nRF52840 باستخدام وظائف Joiner ووظيفة USB الأصلية. يستخدم الجهاز دور "النجار" ليتم مصادقته وتكليفه بشكل آمن في شبكة سلاسل رسائل. يتيح USB الأصلي استخدام USB CDC ACM كوسيلة نقل تسلسلية بين nRF52840 والمضيف.
قم دائمًا بتنظيف الريبو للبنيات السابقة أولاً عن طريق تشغيل make clean
.
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 UART_trans
انتقل إلى الدليل باستخدام ملف OpenThread RCP الثنائي ، وقم بتحويله إلى تنسيق سداسي عشري:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex
قم بتوصيل كبل USB بمنفذ تصحيح أخطاء Micro-USB بجوار دبوس الطاقة الخارجي على لوحة nRF52840 ، ثم قم بتوصيله بجهاز Linux. اضبط مفتاح مصدر الطاقة nRF على لوحة nRF52840 على VDD . عند التوصيل بشكل صحيح ، يكون مؤشر LED5 قيد التشغيل.
إذا كانت هذه هي اللوحة الأولى المرفقة بجهاز Linux ، فإنها تظهر /dev/ttyACM0
تسلسلي /dev/ttyACM0
(تستخدم جميع لوحات ttyACM
المنفذ التسلسلي).
$ ls /dev/ttyACM* /dev/ttyACM0
لاحظ الرقم التسلسلي للوحة nRF52840 المستخدمة في RCP:
انتقل إلى موقع أدوات سطر أوامر nRFx ، وقم بوميض الملف السداسي لـ OpenThread RCP على لوحة nRF52840 ، باستخدام الرقم التسلسلي للوحة:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset
يتم إنشاء المخرجات التالية عند النجاح:
Parsing hex file. Erasing user available code and UICR flash areas. Applying system reset. Checking that the area to write is not protected. Programing device. Applying system reset. Run.
قم بتسمية اللوحة "RCP" بحيث لا تخلط بين أدوار اللوحة لاحقًا.
قم بتوصيله بمنفذ USB الأصلي
نظرًا لأن إنشاء OpenThread RCP يتيح استخدام USB CDC ACM الأصلي كوسيلة نقل تسلسلية ، يجب عليك استخدام منفذ nRF USB على لوحة nRF52840 للتواصل مع مضيف RCP (جهاز Linux).
افصل طرف Micro-USB لكابل USB من منفذ التصحيح الخاص بلوحة nRF52840 الوامضة ، ثم أعد توصيله بمنفذ Micro-USB nRF USB بجوار زر إعادة الضبط . اضبط مفتاح مصدر الطاقة nRF على USB .
ابدأ برنامج OpenThread Daemon
في تصميم RCP ، استخدم OpenThread Daemon للتواصل مع جهاز Thread وإدارته. ابدأ ot-daemon
بعلامة -v
مطول حتى تتمكن من رؤية إخراج السجل والتأكد من أنه يعمل:
$ cd ~/src/openthread $ ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'
عند النجاح ، يقوم برنامج 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
اترك نافذة Terminal هذه مفتوحة بحيث يمكن عرض السجلات من ot-daemon
.
استخدم ot-ctl
للتواصل مع عقدة RCP. يستخدم 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
العقدتان الأخريان المستخدمتان في Codelab هذا هما Full Thread Devices (FTDs) في تصميم System-on-Chip (SoC) القياسي. إنهم لا يستخدمون wpantund
، ويقوم المستخدم بإدارتها يدويًا باستخدام OpenThread CLI.
يعمل جهاز واحد كمفوض ، للمصادقة بشكل آمن على الأجهزة وتشغيلها على تلك الشبكة. يعمل الجهاز الآخر كمنضم يمكن للمفوض المصادقة عليه لشبكة الموضوع.
بناء وفلاش
قم ببناء مثال OpenThread FTD لمنصة nRF52840 ، مع تمكين أدوار المفوض والنجار:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 UART_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
انتقل إلى الدليل باستخدام برنامج OpenThread Full Thread Device (FTD) الثنائي CLI ، وقم بتحويله إلى تنسيق سداسي عشري:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
قم بتوصيل كبل USB بمنفذ Micro-USB بجوار دبوس الطاقة الخارجي على لوحة nRF52840 ، ثم قم بتوصيله بجهاز Linux. إذا كان RCP لا يزال متصلًا بجهاز Linux ، فيجب أن تظهر هذه اللوحة الجديدة /dev/ttyACM1
تسلسلي /dev/ttyACM1
(تستخدم جميع لوحات ttyACM
المنفذ التسلسلي).
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
كما في السابق ، لاحظ الرقم التسلسلي للوحة nRF52840 المستخدمة في FTD:
انتقل إلى موقع أدوات سطر أوامر nRFx ، وقم بوميض ملف OpenThread CLI FTD السداسي على لوحة nRF52840 ، باستخدام الرقم التسلسلي للوحة:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset
تسمية المجلس "المفوض".
تحقق من البناء
تحقق من بناء ناجح عن طريق الوصول إلى OpenThread CLI باستخدام شاشة GNU من نافذة طرفية. تستخدم لوحات nRF52840 معدل الباود 115200.
$ screen /dev/ttyACM1 115200
في النافذة الجديدة ، اضغط على "رجوع" على لوحة المفاتيح عدة مرات لإظهار موجه OpenThread CLI >
. أظهر واجهة IPv6 وتحقق من العناوين:
> ifconfig up Done > ipaddr fe80:0:0:0:1cd6:87a9:cb9d:4b1d Done
استخدم Ctrl + a →
d
للفصل من شاشة CLI الخاصة بمفوض FTD والعودة إلى محطة Linux بحيث يمكن وميض اللوحة التالية. لإعادة إدخال CLI في أي وقت ، استخدم screen -r
من سطر الأوامر. للاطلاع على قائمة الشاشات المتاحة ، استخدم screen -ls
:
$ screen -ls There is a screen on: 74182.ttys000.mylinuxmachine (Detached) 1 Socket in /tmp/uscreens/S-username.
قم بإعداد FTD Joiner
كرر العملية المذكورة أعلاه لفلاش لوحة nRF52840 الثالثة ، باستخدام بنية ot-cli-ftd.hex
.
إذا تم توصيل العقدتين الأخريين بجهاز Linux عند توصيل هذه اللوحة الثالثة ، فيجب أن تظهر /dev/ttyACM2
تسلسلي /dev/ttyACM2
:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
تسمية اللوحة "نجار".
عند التحقق باستخدام Screen ، بدلاً من إنشاء مثيل جديد للشاشة من سطر الأوامر ، أعد التوصيل بالمثيل الحالي وأنشئ نافذة جديدة بداخله (استخدمتها لمفوض FTD):
$ screen -r
قم بإنشاء نافذة جديدة داخل الشاشة باستخدام Ctrl + a →
c
**. ** يظهر موجه سطر أوامر جديد. قم بالوصول إلى OpenThread CLI الخاص بـ FTD Joiner:
$ screen /dev/ttyACM2 115200
في هذه النافذة الجديدة ، اضغط على "رجوع" على لوحة المفاتيح عدة مرات لإظهار موجه OpenThread CLI >
. أظهر واجهة IPv6 وتحقق من العناوين:
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
الآن بعد أن أصبح FTD Joiner CLI في نفس مثيل Screen مثل مفوض FTD ، يمكنك التبديل بينهما باستخدام Ctrl + a → n
.
استخدم Ctrl + a →
d
في أي وقت للخروج من الشاشة.
من الآن فصاعدًا ، ستقوم بالتبديل بين أجهزة Thread بشكل متكرر ، لذا تأكد من أنها جميعًا مباشرة ويمكن الوصول إليها بسهولة. حتى الآن ، كنا نستخدم Screen للوصول إلى اثنين من FTDs ، وتسمح هذه الأداة أيضًا بتقسيم الشاشة على نفس النافذة الطرفية. استخدم هذا لمعرفة كيف تتفاعل عقدة مع الأوامر الصادرة على عقدة أخرى.
من الناحية المثالية ، يجب أن يكون لديك أربعة نوافذ متاحة بسهولة:
- خدمة / سجلات
ot-daemon
- RCP Joiner عبر
ot-ctl
- مفوض FTD عبر OpenThread CLI
- FTD Joiner عبر OpenThread CLI
إذا كنت ترغب في استخدام تكوين أو أداة المنفذ الطرفي / التسلسلي الخاص بك ، فلا تتردد في التخطي إلى الخطوة التالية. قم بتكوين النوافذ الطرفية لجميع الأجهزة بالطريقة التي تناسبك بشكل أفضل.
باستخدام الشاشة
لسهولة الاستخدام ، ابدأ جلسة شاشة واحدة فقط. يجب أن يكون لديك بالفعل واحد من عند إعداد كلا FTDs.
تبدأ جميع الأوامر داخل الشاشة بـ Ctrl + a.
أوامر الشاشة الأساسية:
أعد الاتصال بجلسة الشاشة (من سطر الأوامر) | |
اترك جلسة الشاشة | Ctrl + a → |
إنشاء نافذة جديدة في جلسة الشاشة | Ctrl + a → |
التبديل بين النوافذ في نفس جلسة الشاشة | Ctrl + a → |
اقتل النافذة الحالية في جلسة الشاشة | Ctrl + a → |
تقسيم الشاشة
باستخدام Screen ، يمكنك تقسيم الجهاز إلى نوافذ متعددة:
يتم الوصول إلى الأوامر الموجودة على screen
باستخدام Ctrl + a. يجب أن يبدأ كل أمر بمفتاح الوصول هذا.
إذا كنت تتابع Codelab بالضبط ، فيجب أن يكون لديك نافذتان (مفوض FTD ، FTD Joiner) على نفس مثيل الشاشة. لتقسيم الشاشة بين الاثنين ، أدخل أولاً جلسة الشاشة الحالية:
$ screen -r
يجب أن تكون على أحد أجهزة FTD. اتبع هذه الخطوات في الشاشة:
- Ctrl + a →
S
لتقسيم النافذة أفقيًا - Ctrl + a →
Tab
لتحريك المؤشر إلى النافذة الفارغة الجديدة - Ctrl + a →
n
لتبديل تلك النافذة الجديدة إلى النافذة التالية - إذا كانت مماثلة للنافذة العلوية ، اضغط على Ctrl + a →
n
مرة أخرى لعرض جهاز FTD الآخر
كلاهما مرئي الآن. قم بالتبديل بينهما باستخدام Ctrl + a → Tab
. يوصى بإعادة ترجمة كل نافذة باستخدام Ctrl + a → A
لتجنب الالتباس.
الاستخدام المتقدم
لمزيد من تقسيم الشاشة إلى أرباع وعرض سجلات ot-daemon
و RCP Joiner ot-ctl
، يجب بدء هذه الخدمات ضمن نفس مثيل الشاشة. للقيام بذلك ، أوقف ot-daemon
ot-ctl
، وأعد ot-ctl
داخل نوافذ شاشة جديدة (Ctrl + a → c
).
هذا الإعداد غير مطلوب ويتم تركه كتدريب للمستخدم.
قم بتقسيم النوافذ والتنقل بينها باستخدام الأوامر التالية:
إنشاء نافذة جديدة | Ctrl + a → |
انقسام النافذة عموديا | Ctrl + a → |
انقسام النافذة أفقيا | Ctrl + a → |
القفز إلى النافذة المعروضة التالية | Ctrl + a → |
قم بتبديل النافذة المعروضة للأمام أو للخلف | Ctrl + a → |
إعادة تسمية النافذة الحالية | Ctrl + a → |
اترك الشاشة في أي وقت باستخدام Ctrl + a → d
وأعد التوصيل مع screen -r
من سطر الأوامر.
لمزيد من المعلومات حول الشاشة ، راجع المرجع السريع لشاشة GNU .
الآن بعد أن تم تكوين جميع النوافذ والشاشات الطرفية ، فلنقم بإنشاء شبكة Thread الخاصة بنا. على مفوض FTD ، قم بإنشاء مجموعة بيانات تشغيلية جديدة والتزم بها كمجموعة نشطة. مجموعة البيانات التشغيلية هي تكوين شبكة سلسلة الرسائل التي تقوم بإنشائها.
## FTD Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 11 Channel Mask: 07fff800 Ext PAN ID: c0de7ab5c0de7ab5 Mesh Local Prefix: fdc0:de7a:b5c0/64 Master Key: 1234c0de7ab51234c0de7ab51234c0de Network Name: OpenThread-c0de PAN ID: 0xc0de PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
قم بتدوين المفتاح الرئيسي 1234c0de7ab51234c0de7ab51234c0de
والذي سيتم استخدامه لاحقًا.
قم بتنفيذ مجموعة البيانات هذه باعتبارها المجموعة النشطة:
> dataset commit active Done
أظهر واجهة IPv6:
> ifconfig up Done
بدء تشغيل بروتوكول الموضوع:
> thread start Done
بعد لحظة ، تحقق من حالة الجهاز. يجب أن يكون القائد. احصل أيضًا على RLOC16 للرجوع إليه في المستقبل.
## FTD Commissioner ## ---------------------- > state leader Done > rloc16 0c00 Done
تحقق من عناوين IPv6 الخاصة بالجهاز:
## FTD Commissioner ## ---------------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:c00 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a # Mesh-Local EID (ML-EID) fe80:0:0:0:1cd6:87a9:cb9d:4b1d # Link-Local Address (LLA)
أصبحت شبكة "codelab" مرئية الآن عند مسحها ضوئيًا من أجهزة سلسلة الرسائل الأخرى.
من ot-ctl
على RCP Joiner :
## RCP Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
من OpenThread CLI على FTD Joiner :
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
إذا لم تظهر شبكة "codelab" في القائمة ، فحاول المسح مرة أخرى.
قد تلاحظ أنه في كلا المسحين ، يبدو أن الشبكة غير قابلة للانضمام (العمود J في RCP Joiner و FTD Joiner). هذا يعني فقط أن موضوع التكليف غير نشط على الشبكة. لا يزال من الممكن ضمها خارج النطاق ، عن طريق إدخال مفتاح الشبكة الرئيسي في جهاز النجار يدويًا.
دعنا نضيف RCP Joiner إلى شبكة Thread التي أنشأناها للتو ، باستخدام عملية خارج النطاق. البحث عن شبكات على RCP Joiner :
## RCP Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
للانضمام ، قم بتعيين المفتاح الرئيسي للشبكة (حصلنا عليه للتو من مفوض FTD) على RCP Joiner في مجموعة البيانات النشطة الخاصة به.
## RCP Joiner ## ---------------- > dataset masterkey 1234c0de7ab51234c0de7ab51234c0de Done > dataset commit active Done
تحقق من مجموعة البيانات للتأكد من أنها مضبوطة بشكل صحيح.
## RCP Joiner ## ---------------- > dataset Master Key: 1234c0de7ab51234c0de7ab51234c0de
قم بإحضار Thread حتى ينضم RCP Joiner إلى شبكة "codelab". انتظر بضع ثوانٍ ، تحقق من الحالة ، RLOC16 وعناوين IPv6 الخاصة بها:
## RCP Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c01 Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:0c01 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f # Mesh-Local EID (ML-EID) fe80:0:0:0:18e5:29b3:a638:943b # Link-Local Address (LLA) Done
قم بتدوين عنوان Mesh-Local IPv6 ( fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
هنا) ، ستستخدمه لاحقًا.
مرة أخرى على مفوض FTD ، تحقق من جهاز التوجيه والجداول الفرعية للتأكد من أن كلا الجهازين جزء من نفس الشبكة. استخدم RLOC16 لتعريف RCP Joiner.
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 35 | 1ed687a9cb9d4b1d | Done > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|VER| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+---+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1| 2| 1ae529b3a638943b | Done
قم باختبار اتصال عنوان الشبكة المحلية الخاص بـ RCP Joiner (عنوان Mesh-Local الذي تم الحصول عليه من إخراج ipaddr
الخاص بـ RCP Joiner) للتحقق من الاتصال:
## FTD Commissioner ## ---------------------- > ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f > 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms
لدينا الآن شبكة ترابط تتكون من عقدتين ، موضحة في مخطط الهيكل هذا:
مخططات طوبولوجيا
أثناء عملك في بقية Codelab ، سنعرض مخططًا جديدًا لطوبولوجيا الخيط كلما تغيرت حالة الشبكة. يشار إلى أدوار العقدة على النحو التالي:
تكون أجهزة التوجيه دائمًا عبارة عن خماسيات ، وتكون أجهزة النهاية دائمًا عبارة عن دوائر. تمثل الأرقام الموجودة في كل عقدة معرف جهاز التوجيه أو معرف الطفل الموضح في إخراج CLI ، اعتمادًا على الدور والحالة الحاليين لكل عقدة في ذلك الوقت.
الآن دعنا نضيف جهاز Thread الثالث إلى شبكة "codelab". هذه المرة سنستخدم عملية التكليف داخل النطاق الأكثر أمانًا. على FTD Joiner ، ابحث عن الشبكة:
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 | 57 |
يشير الرقم 0
في العمود J إلى أن تشغيل مؤشر الترابط غير نشط على الجهاز.
لنكن محددين عند تشغيل هذا الجهاز التالي ، والسماح فقط لـ FTD Joiner بالانضمام. لا يزال على FTD Joiner ، احصل على eui64
، حتى يتمكن مفوض FTD من التعرف عليه:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
على مفوض FTD ، ابدأ المفوض وحدد eui64
للجهاز الذي يمكنه الانضمام ، إلى جانب بيانات اعتماد Joiner. إن بيانات الاعتماد Joiner Credential عبارة عن عبارة مرور خاصة بالجهاز.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
قم بالتبديل إلى FTD Joiner ، وأعد المسح الضوئي:
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 1 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -45 | 196 |
كما هو مشار إليه في 1
في العمود J ، فإن "تشغيل الخيط" نشط الآن على الشبكة. ابدأ دور النجار مع اعتماد النجار الذي قمت بإعداده للتو على مفوض FTD:
## FTD Joiner ## ---------------- > ifconfig up Done > joiner start J01NME Done
في غضون دقيقة أو نحو ذلك ، تحصل على تأكيد للمصادقة الناجحة:
## FTD Joiner ## ---------------- > Join success
قم بإحضار Thread حتى ينضم FTD Joiner إلى شبكة "codelab" ، وتحقق فورًا من الحالة و RLOC16:
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
تحقق من عناوين IPv6 الخاصة بالجهاز. لاحظ عدم وجود ALOC. هذا لأن هذا الجهاز ليس القائد ، ولا يشغل دورًا خاصًا بـ Anycast يتطلب ALOC.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:c02 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA)
قم بالتبديل على الفور إلى مفوض FTD وتحقق من جهاز التوجيه والجداول الفرعية للتأكد من وجود ثلاثة أجهزة في شبكة "codelab":
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 2 | 0x0c02 | 240 | 15 | 3 | 44 |1|1|1|1| e6cdd2d93249a243 | Done
استنادًا إلى RLOC16 ، تم توصيل FTD Joiner بالشبكة كجهاز نهائي (تابع). هنا طوبولوجيا لدينا المحدثة:
تعد أجهزة الخيط في Codelab هذا نوعًا محددًا من أجهزة الخيط الكامل (FTD) تسمى الجهاز النهائي المؤهل لجهاز التوجيه (REED). هذا يعني أنه يمكنهم العمل إما كموجه أو جهاز نهائي ، ويمكنهم الترويج لأنفسهم من جهاز طرفي إلى جهاز توجيه.
يمكن أن يدعم الخيط ما يصل إلى 32 جهاز توجيه ، ولكنه يحاول الاحتفاظ بعدد أجهزة التوجيه بين 16 و 23. إذا تم إرفاق REED كجهاز نهائي (طفل) وكان عدد أجهزة التوجيه أقل من 16 ، بعد فترة زمنية عشوائية في غضون دقيقتين يقوم تلقائيًا بترقية نفسه إلى جهاز توجيه.
إذا كان لديك طفلان في شبكة Thread الخاصة بك بعد إضافة FTD Joiner ، فانتظر دقيقتين على الأقل ، ثم أعد فحص جهاز التوجيه والجداول الفرعية على مفوض FTD :
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | Done
قام FTD Joiner (Extended MAC = e6cdd2d93249a243
) بترقية نفسه إلى جهاز توجيه. لاحظ أن RLOC16 مختلف ( b800
بدلاً من 0c02
). ذلك لأن RLOC16 يعتمد على معرف الموجه ومعرف الطفل الخاص بالجهاز. عندما ينتقل من الجهاز النهائي إلى جهاز التوجيه ، تتغير قيم معرف جهاز التوجيه ومعرف الطفل ، وكذلك تتغير قيم RLOC16.
قم بتأكيد الحالة الجديدة و RLOC16 على FTD Joiner :
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
الرجوع إلى إصدار سابق من FTD Joiner
يمكنك اختبار هذا السلوك عن طريق الرجوع يدويًا إلى إصدار سابق لـ FTD Joiner من جهاز التوجيه إلى جهاز إنهاء. قم بتغيير الحالة إلى الطفل وتحقق من RLOC16:
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
مرة أخرى على مفوض FTD ، يجب أن يظهر FTD Joiner الآن في الجدول الفرعي (المعرف = 3). قد يكون في كليهما أثناء انتقاله:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 3 | 0x0c03 | 240 | 16 | 3 | 94 |1|1|1|1| e6cdd2d93249a243 | Done
بعد مرور بعض الوقت ، سيعود إلى جهاز التوجيه باستخدام b800
من b800
.
أزل القائد
يتم انتخاب القائد ذاتيًا بين جميع أجهزة التوجيه ذات الصلة. هذا يعني أنه إذا تمت إزالة القائد الحالي من شبكة الموضوع ، فسيصبح أحد أجهزة التوجيه الأخرى هو القائد الجديد.
على مفوض FTD ، أغلق Thread لإزالته من شبكة Thread:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
في غضون دقيقتين ، يصبح FTD Joiner قائد سلسلة المحادثات الجديد. تحقق من حالة وعناوين IPv6 الخاصة بـ FTD Joiner للتحقق من:
## FTD Joiner ## ---------------- > state leader Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Now it has the Leader ALOC! fdc0:de7a:b5c0:0:0:ff:fe00:b800 fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd fe80:0:0:0:e4cd:d2d9:3249:a243 Done
تحقق من طاولة الطفل. لاحظ أن هناك RLOC16 جديد. هذا هو RCP Joiner ، كما هو مشار إليه بواسطة معرفه و MAC الموسع. من أجل الحفاظ على شبكة Thread معًا ، قامت بتحويل أجهزة التوجيه الأصلية ، من مفوض FTD إلى FTD Joiner. ينتج عن هذا RLOC16 جديد لـ RCP Joiner (بسبب تغيير معرف جهاز التوجيه الخاص به ، من 3 إلى 46).
## FTD Joiner ## ---------------- > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 27 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
قد تضطر إلى الانتظار بضع دقائق حتى يتم إرفاق RCP Joiner بجهاز FTD Joiner كطفل. تحقق من الحالة و RLOC16 لتأكيد ما يلي:
## RCP Joiner ## -------------- > state child > rloc16 b801
أعد إلحاق مفوض FTD
شبكة الخيط ذات العقدتين ليست ممتعة كثيرًا. دعنا نعيد مفوض FTD إلى الإنترنت.
على مفوض FTD ، أعد تشغيل Thread:
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
في غضون دقيقتين ، يتم إعادة توصيله تلقائيًا بشبكة "codelab" كجهاز نهاية ، ثم يقوم بترقية نفسه إلى جهاز توجيه.
## FTD Commissioner ## ---------------------- > state router Done
تحقق من جهاز التوجيه والجداول الفرعية على FTD Joiner للتحقق من:
## FTD Joiner ## ---------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 63 | 0 | 3 | 3 | 0 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 46 | 0 | 0 | 0 | 15 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 184 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
تتكون شبكة الخيوط الخاصة بنا من ثلاث عقد مرة أخرى.
يمكن أن تكون إدارة شبكة مؤشر ترابط بأجهزة متعددة على طرفي مختلف أو نوافذ شاشة أمرًا معقدًا. استخدم هذه النصائح "لإعادة تعيين" حالة الشبكة أو مساحة العمل الخاصة بك إذا واجهت مشاكل.
شاشة
إذا فقدت في أي وقت من الأوقات في التكوين الخاص بك (عدد كبير جدًا من نوافذ الشاشة ، أو الشاشات داخل الشاشة) ، فاستمر في قتل نوافذ الشاشة باستخدام Ctrl + a → k حتى لا يوجد أي شيء screen -ls
في سطر الأوامر No Sockets found
. ثم أعد إنشاء نوافذ الشاشة لكل جهاز. يتم الاحتفاظ بحالة الجهاز حتى عند قتل الشاشة.
عقد الخيط
إذا لم يكن هيكل شبكة مؤشر الترابط كما هو موضح في Codelab هذا ، أو تم فصل العقد لسبب ما (ربما لأن جهاز Linux الذي يعمل على تشغيلها في وضع السكون) ، فمن الأفضل إيقاف تشغيل Thread ومسح بيانات اعتماد الشبكة والبدء مرة أخرى من إنشاء خطوة شبكة الموضوع .
لإعادة ضبط FTDs:
03 دابا 270 يمكن إعادة تعيين RCP بنفس الطريقة عبر ot-ctl
:
## RCP Joiner ## ---------------- > thread stop Done > ifconfig down Done > factoryreset Done
يستخدم البث المتعدد لتوصيل المعلومات إلى مجموعة من الأجهزة في وقت واحد. في شبكة الخيط ، عناوين محددة محجوزة للاستخدام المتعدد مع مجموعات مختلفة من الأجهزة ، اعتمادًا على النطاق.
عنوان IPv6 | مجال | سلمت ل |
| ارتباط محلي | جميع FTDs و MEDs |
| ارتباط محلي | جميع FTDs والموجهات الحدودية |
| شبكة محلية | جميع FTDs و MEDs |
| شبكة محلية | جميع FTDs والموجهات الحدودية |
نظرًا لأننا لا نستخدم موجه الحدود في Codelab هذا ، فلنركز على عنواني الإرسال المتعدد FTD و MED.
ارتباط محلي
يشتمل نطاق الارتباط المحلي على جميع واجهات الخيط التي يمكن الوصول إليها عن طريق إرسال راديو واحد ، أو "قفزة" واحدة. يحدد هيكل الشبكة الأجهزة التي تستجيب ff02::1
ping ff02::1
الإرسال المتعدد ff02::1
.
Ping ff02::1
من مفوض FTD :
## FTD Commissioner ## ---------------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms
هناك جهازان آخران في الشبكة (FTD Joiner و RCP Joiner) ، لكن مفوض FTD تلقى استجابة واحدة فقط ، من عنوان الرابط المحلي (LLA) الخاص بـ FTD Joiner. هذا يعني أن FTD Joiner هو الجهاز الوحيد الذي يمكن لمفوض FTD الوصول إليه بقفزة واحدة.
الآن ping ff02::1
من FTD Joiner :
## FTD Joiner ## ---------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms 8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms
ردان! عند التحقق من عناوين IPv6 للأجهزة الأخرى ، يمكننا أن نرى الأول (المنتهي بـ 4b1d
) هو LLA التابع لمفوض FTD ، والثاني (المنتهي في 943b
) هو RCP Joiner's LLA.
هذا يعني أن FTD Joiner متصل مباشرة بكل من مفوض FTD و RCP Joiner ، مما يؤكد طوبولوجيتنا.
شبكة محلية
يشتمل نطاق Mesh-Local على جميع واجهات Thread التي يمكن الوصول إليها داخل نفس شبكة Thread. دعنا نرى الردود على ping ff03::1
الإرسال المتعدد ff03::1
.
Ping ff03::1
من مفوض FTD :
## FTD Commissioner ## ---------------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms
هذه المرة تلقى مفوض FTD b800
، أحدهما من محدد مواقع التوجيه الخاص بـ FTD Joiner ( b800
، b800
) والآخر من RCP Joiner Mesh-Local EID (ML-EID ، المنتهي بـ d55f
). ذلك لأن نطاق الشبكة المحلية يشتمل على شبكة خيوط المعالجة بأكملها. بغض النظر عن مكان وجود الجهاز في الشبكة ، سيتم ff03::1
العنوان ff03::1
.
Ping ff03::1
من FTD Joiner لتأكيد نفس السلوك:
## FTD Joiner ## ---------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms
لاحظ وقت استجابة RCP Joiner في كلا مخرجي اختبار الاتصال. استغرق RCP Joiner وقتًا أطول للوصول إلى مفوض FTD (68 مللي ثانية) مقارنة بالوصول إلى FTD Joiner (23 مللي ثانية). هذا لأنه يجب أن يقوم بقفلتين للوصول إلى مفوض FTD ، مقارنة بقفزة واحدة لـ FTD Joiner.
ربما لاحظت أيضًا أن ping متعدد البث المحلي المتشابك استجاب مع RLOC فقط من أجل FTDs - وليس RCP Joiner. وذلك لأن FTDs هي أجهزة توجيه داخل الشبكة ، بينما RCP هي جهاز نهاية.
تحقق من حالة RCP Joiner للتأكيد:
## RCP Joiner ## ---------------- > state child
إحدى خدمات التطبيقات التي يوفرها OpenThread هي بروتوكول مخطط بيانات المستخدم (UDP) ، وهو بروتوكول طبقة النقل. يمكن للتطبيق المبني على OpenThread استخدام UDP API لتمرير الرسائل بين العقد في شبكة Thread ، أو إلى أجهزة أخرى في شبكة خارجية (مثل الإنترنت ، إذا كانت شبكة Thread تحتوي على جهاز توجيه حدود).
يتم كشف مآخذ UDP من خلال OpenThread CLI. دعنا نستخدمها لتمرير الرسائل بين اثنين من FTDs.
احصل على عنوان Mesh-Local EID الخاص بـ FTD Joiner . نحن نستخدم هذا العنوان لأنه يمكن الوصول إليه من أي مكان داخل شبكة الموضوع.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:b800 # Routing Locator (RLOC) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) Done
ابدأ UDP واربطه بمقبس لأي عنوان IPv6:
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
قم بالتبديل إلى مفوض FTD ، وابدأ UDP ، وقم بالاتصال بالمقبس الذي قمت بإعداده على FTD Joiner ، باستخدام ML-EID الخاص به:
## FTD Commissioner ## ---------------------- > udp open Done > udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212 Done
يجب أن يكون اتصال UDP مباشرًا بين العقدتين. إرسال رسالة من مفوض FTD:
## FTD Commissioner ## ---------------------- > udp send hellothere Done
في FTD Joiner ، تم استلام رسالة UDP!
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
لقد قمت بإنشاء شبكة ترابط فعلية!
أنت تعرف الآن:
- الفرق بين أنواع أجهزة الخيط والأدوار والنطاقات
- كيف تدير أجهزة الخيط حالاتها داخل الشبكة
- كيفية تمرير رسائل بسيطة بين العقد باستخدام UDP
الخطوات التالية
بناء على Codelab هذا ، جرب التمارين التالية:
- قم بإعادة تحميل لوحة FTD Joiner باعتبارها MTD باستخدام ثنائي
ot-cli-mtd
، ولاحظ أنها لا تقوم أبدًا بترقية نفسها إلى جهاز توجيه أو تحاول أن تصبح القائد - أضف المزيد من الأجهزة (جرب نظامًا أساسيًا مختلفًا!) إلى الشبكة وقم برسم الهيكل باستخدام جهاز التوجيه والجداول الفرعية ، جنبًا إلى جنب مع الأصوات إلى عناوين الإرسال المتعدد
- استخدم pyspinel للتحكم في NCP
- قم بتحويل NCP إلى موجه حدود باستخدام OpenThread Border Router وقم بتوصيل شبكة Thread الخاصة بك بالإنترنت
قراءة متعمقة
تحقق من openthread.io و GitHub للحصول على مجموعة متنوعة من موارد OpenThread ، بما في ذلك:
- المنصات المدعومة - اكتشف جميع المنصات التي تدعم OpenThread
- إنشاء OpenThread - مزيد من التفاصيل حول إنشاء OpenThread وتكوينه
- الموضوع التمهيدي - يغطي جميع مفاهيم سلسلة الرسائل الواردة في هذا Codelab
المرجعي: