1. مقدمه
OpenThread منتشر شده توسط Google یک پیاده سازی متن باز از پروتکل شبکه Thread® است. Google Nest برای تسریع در توسعه محصولات برای خانه متصل، OpenThread را منتشر کرده است تا فناوری مورد استفاده در محصولات Nest را به طور گسترده در دسترس توسعه دهندگان قرار دهد.
مشخصات Thread یک پروتکل ارتباطی دستگاه به دستگاه بی سیم قابل اعتماد، ایمن و کم مصرف مبتنی بر IPv6 را برای برنامه های خانگی تعریف می کند. OpenThread تمام لایه های شبکه Thread از جمله IPv6، 6LoWPAN، IEEE 802.15.4 را با امنیت MAC، Mesh Link Establishment و Mesh Routing پیاده سازی می کند.
در این Codelab، OpenThread را روی سخت افزار واقعی برنامه ریزی می کنید، شبکه Thread را ایجاد و مدیریت می کنید و پیام ها را بین گره ها ارسال می کنید.
چیزی که یاد خواهید گرفت
- ساخت و چشمک زدن باینری های OpenThread CLI به بردهای توسعه دهنده
- ساخت یک RCP متشکل از یک ماشین لینوکس و یک برد توسعه دهنده
- برقراری ارتباط با یک RCP با استفاده از OpenThread Daemon و
ot-ctl
- مدیریت دستی گره های Thread با صفحه گنو و OpenThread CLI
- راه اندازی ایمن دستگاه ها در شبکه Thread
- نحوه عملکرد چندپخشی IPv6
- ارسال پیام بین گره های Thread با UDP
آنچه شما نیاز دارید
سخت افزار:
- 3 برد توسعه دهنده Nordic Semiconductor nRF52840
- 3 کابل USB به Micro-USB برای اتصال بردها
- یک دستگاه لینوکس با حداقل 3 پورت USB
نرم افزار:
- زنجیره ابزار گنو
- ابزارهای خط فرمان Nordic nRF5x
- نرم افزار Segger J-Link
- OpenThread
- Git
2. شروع به کار
شبیه سازی OpenThread
قبل از شروع، ممکن است بخواهید از طریق OpenThread Simulation Codelab اجرا کنید تا با مفاهیم اولیه Thread و OpenThread CLI آشنا شوید.
پایانه های پورت سریال
شما باید با نحوه اتصال به پورت سریال از طریق ترمینال آشنا باشید. این Codelab از صفحه گنو استفاده می کند و نمای کلی استفاده را ارائه می دهد، اما هر نرم افزار ترمینال دیگری را می توان استفاده کرد.
ماشین لینوکس
این Codelab برای استفاده از یک ماشین لینوکس مبتنی بر i386 یا x86 طراحی شده است تا به عنوان میزبان یک دستگاه Thread Co-Processor (RCP) رادیویی و فلش کردن همه بردهای توسعه Thread عمل کند. همه مراحل در اوبونتو 14.04.5 LTS (Trusty Tahr) آزمایش شدند.
بردهای Nordic Semiconductor nRF52840
این Codelab از سه برد nRF52840 PDK استفاده می کند.
SEGGER J-Link را نصب کنید
ما از SEGGER J-Link برای برنامه ریزی بردهای nRF52840 که دارای ماژول های JTAG هستند استفاده می کنیم. این را روی دستگاه لینوکس خود نصب کنید.
بسته مناسب برای دستگاه خود را دانلود کرده و در محل مناسب نصب کنید. در لینوکس این /opt/SEGGER/JLink
است.
nRF5x Command Line Tools را نصب کنید
nRF5x Command Line Tools به شما این امکان را می دهد که باینری های OpenThread را روی بردهای nRF52840 فلش کنید. بیلد مناسب nRF5x-Command-Line-Tools-<OS> را روی دستگاه لینوکس خود نصب کنید.
بسته استخراج شده را در پوشه root قرار دهید ~/
ARM GNU Toolchain را نصب کنید
ARM GNU Toolchain برای ساختن استفاده می شود.
توصیه میکنیم آرشیو استخراجشده را در /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
بر روی دستگاه لینوکس خود قرار دهید. دستورالعمل های موجود در فایل readme.txt
بایگانی را برای دستورالعمل های نصب دنبال کنید.
صفحه نصب (اختیاری)
Screen ابزاری ساده برای دسترسی به دستگاه هایی است که توسط پورت سریال متصل شده اند. این Codelab از Screen استفاده می کند، اما می توانید از هر برنامه ترمینال پورت سریالی که می خواهید استفاده کنید.
$ sudo apt-get install screen
3. کلون کردن مخازن
OpenThread
OpenThread را کلون کرده و نصب کنید. دستورات script/bootstrap
مطمئن می شوند که زنجیره ابزار نصب شده و محیط به درستی پیکربندی شده است:
$ 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 هستید.
4. RCP Joiner را راه اندازی کنید
ساخت و فلش
نمونه OpenThread nRF52840 را با Joiner و عملکرد USB بومی بسازید. یک دستگاه از نقش Joiner برای احراز هویت ایمن و راه اندازی در شبکه Thread استفاده می کند. USB بومی استفاده از USB CDC ACM را به عنوان یک انتقال سریال بین nRF52840 و میزبان امکان پذیر می کند.
همیشه ابتدا مخزن ساخت های قبلی را با اجرای rm -rf build
پاک کنید.
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 USB_trans
با باینری OpenThread RCP به دایرکتوری بروید و آن را به فرمت هگز تبدیل کنید:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex
کابل USB را به پورت اشکال زدایی Micro-USB در کنار پین پاور خارجی روی برد nRF52840 وصل کنید و سپس آن را به دستگاه لینوکس وصل کنید. سوئیچ منبع تغذیه nRF را روی برد nRF52840 روی VDD قرار دهید. در صورت اتصال صحیح، LED5 روشن است.
اگر این اولین برد متصل به ماشین لینوکس باشد، به عنوان پورت سریال /dev/ttyACM0
ظاهر می شود (همه بردهای nRF52840 از ttyACM
برای شناسه پورت سریال استفاده می کنند).
$ ls /dev/ttyACM* /dev/ttyACM0
به شماره سریال برد nRF52840 که برای RCP استفاده می شود توجه کنید:
به محل nRFx Command Line Tools بروید و با استفاده از شماره سریال برد، فایل هگز OpenThread RCP را روی برد nRF52840 فلش کنید. توجه داشته باشید که اگر پرچم --verify
کنار بگذارید، یک پیام اخطاری خواهید دید که به شما می گوید فرآیند فلش ممکن است بدون خطا با شکست مواجه شود.
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --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 بومی را به عنوان یک انتقال سریال امکان پذیر می کند، باید از پورت USB nRF روی برد nRF52840 برای برقراری ارتباط با میزبان RCP (ماشین لینوکس) استفاده کنید.
انتهای Micro-USB کابل USB را از درگاه اشکال زدایی برد nRF52840 فلش شده جدا کنید، سپس آن را دوباره به پورت Micro-USB nRF USB در کنار دکمه RESET وصل کنید. سوئیچ منبع تغذیه nRF را روی USB قرار دهید.
OpenThread Daemon را شروع کنید
در طراحی RCP، از OpenThread Daemon برای برقراری ارتباط و مدیریت دستگاه Thread استفاده کنید. ot-daemon
با پرچم پرمخاطب -v
شروع کنید تا بتوانید خروجی log را ببینید و تأیید کنید که در حال اجرا است:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'
در صورت موفقیت آمیز بودن، ot-daemon
در حالت کلامی خروجی مشابه زیر تولید می کند:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
این پنجره ترمینال را باز بگذارید تا لاگ های ot-daemon
قابل مشاهده باشند.
برای برقراری ارتباط با گره RCP از ot-ctl
استفاده کنید. ot-ctl
از همان CLI برنامه OpenThread CLI استفاده می کند. بنابراین، می توانید گره های ot-daemon
را به همان شیوه ای که سایر دستگاه های Thread شبیه سازی شده کنترل کنید.
در پنجره ترمینال دوم، ot-ctl
شروع کنید:
$ sudo ./build/posix/src/posix/ot-ctl >
state
Node 2 (گره RCP) را که با ot-daemon
شروع کرده اید بررسی کنید:
> state disabled Done
5. FTD ها را راه اندازی کنید
دو گره Thread دیگر که در این Codelab استفاده می شود، دستگاه های Full Thread (FTD) در طراحی استاندارد سیستم روی تراشه (SoC) هستند. در تنظیمات تولید، میتوان از wpantund
، یک درایور رابط شبکه درجه تولید، برای کنترل نمونههای OpenThread NCP استفاده کرد، اما در این کد لبه، از ot-ctl
، OpenThread CLI استفاده میکنیم.
یک دستگاه به عنوان کمیسیونر برای احراز هویت ایمن و راه اندازی دستگاه ها در آن شبکه عمل می کند. دستگاه دیگر به عنوان Joiner عمل می کند که کمیسیونر می تواند آن را در شبکه Thread احراز هویت کند.
ساخت و فلش
نمونه OpenThread FTD را برای پلتفرم nRF52840 بسازید، با فعال بودن نقش کمیسیونر و Joiner:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
با باینری CLI OpenThread Full Thread Device (FTD) به دایرکتوری بروید و آن را به فرمت هگز تبدیل کنید:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
کابل USB را به پورت Micro-USB در کنار پین پاور خارجی روی برد nRF52840 وصل کنید و سپس آن را به دستگاه لینوکس وصل کنید. اگر RCP هنوز به ماشین لینوکس متصل است، این برد جدید باید به عنوان پورت سریال /dev/ttyACM1
ظاهر شود (همه بردهای nRF52840 از ttyACM
برای شناسه پورت سریال استفاده می کنند).
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
مانند قبل، به شماره سریال برد nRF52840 که برای FTD استفاده می شود توجه کنید:
به محل nRFx Command Line Tools بروید و با استفاده از شماره سریال برد، فایل هگز OpenThread CLI FTD را روی برد nRF52840 فلش کنید:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset
روی تابلو برچسب «کمیسیون» بزنید.
به USB بومی متصل شوید
از آنجایی که ساخت OpenThread FTD استفاده از USB CDC ACM بومی را به عنوان یک انتقال سریال امکان پذیر می کند، باید از پورت USB nRF روی برد nRF52840 برای ارتباط با میزبان RCP (ماشین لینوکس) استفاده کنید.
انتهای Micro-USB کابل USB را از درگاه اشکال زدایی برد nRF52840 فلش شده جدا کنید، سپس آن را دوباره به پورت Micro-USB nRF USB در کنار دکمه RESET وصل کنید. سوئیچ منبع تغذیه nRF را روی USB قرار دهید.
ساخت را تأیید کنید
با دسترسی به OpenThread CLI با استفاده از صفحه گنو از یک پنجره ترمینال، ساخت موفق را تأیید کنید. بردهای nRF52840 از نرخ باود 115200 استفاده می کنند.
$ screen /dev/ttyACM1 115200
در پنجره جدید، چند بار Return را روی صفحه کلید فشار دهید تا دستور OpenThread CLI >
ظاهر شود. رابط IPv6 را بیاورید و آدرس ها را بررسی کنید:
> ifconfig up Done > ipaddr fe80:0:0:0:1cd6:87a9:cb9d:4b1d Done
از Ctrl+a → استفاده کنید
d
را از صفحه FTD Commissioner CLI جدا کنید و به ترمینال لینوکس برگردید تا برد بعدی فلش شود. برای ورود مجدد به 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 را راه اندازی کنید
با استفاده از ساخت ot-cli-ftd.hex
موجود، فرآیند بالا را برای فلش کردن برد سوم nRF52840 تکرار کنید. پس از اتمام، مطمئن شوید که برد را دوباره با استفاده از درگاه USB nRF به رایانه متصل کرده و سوئیچ منبع تغذیه nRF را روی VDD قرار دهید.
اگر دو گره دیگر به ماشین لینوکس وصل شوند وقتی این برد سوم وصل شد، باید به صورت پورت سریال /dev/ttyACM2
ظاهر شود:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
روی تابلو برچسب "وصال" بزنید.
هنگام تأیید با استفاده از Screen، به جای ایجاد یک نمونه جدید از Screen از خط فرمان، مجدداً به نمونه موجود متصل کنید و یک پنجره جدید در آن ایجاد کنید (که برای کمیسیون FTD استفاده کردید):
$ screen -r
با Ctrl+a → c
پنجره جدید را در داخل صفحه ایجاد کنید .
یک خط فرمان جدید ظاهر می شود. دسترسی به OpenThread CLI برای FTD Joiner:
$ screen /dev/ttyACM2 115200
در این پنجره جدید، چند بار Return را روی صفحه کلید فشار دهید تا دستور OpenThread CLI >
ظاهر شود. رابط IPv6 را بیاورید و آدرس ها را بررسی کنید:
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
اکنون که FTD Joiner CLI در همان نمونه Screen با FTD Commissioner قرار دارد، می توانید با استفاده از Ctrl+a → n
بین آنها جابجا شوید.
از Ctrl+a → استفاده کنید
d
در هر زمان برای خروج از صفحه نمایش.
6. راه اندازی پنجره ترمینال
در آینده، مرتباً بین دستگاههای Thread جابهجا میشوید، بنابراین مطمئن شوید که همه آنها زنده و به راحتی قابل دسترسی هستند. تاکنون از Screen برای دسترسی به دو FTD استفاده کرده ایم و این ابزار همچنین امکان تقسیم صفحه را در همان پنجره ترمینال فراهم می کند. از این برای مشاهده واکنش یک گره به دستورات صادر شده در دیگری استفاده کنید.
در حالت ایده آل، شما باید چهار پنجره به راحتی در دسترس داشته باشید:
- سرویس
ot-daemon
/ سیاهههای مربوط - RCP Joiner از طریق
ot-ctl
- کمیسیونر FTD از طریق OpenThread CLI
- FTD Joiner از طریق OpenThread CLI
اگر می خواهید از پیکربندی یا ابزار ترمینال / پورت سریال خود استفاده کنید، به راحتی به مرحله بعدی بروید. پنجره های ترمینال را برای همه دستگاه ها به گونه ای پیکربندی کنید که بهترین کار را برای شما دارد.
با استفاده از صفحه نمایش
برای سهولت استفاده، فقط یک جلسه Screen را شروع کنید. از قبل باید یکی از زمانی که هر دو FTD را راه اندازی کردید داشته باشید.
تمام دستورات داخل صفحه با Ctrl+a شروع می شوند.
دستورات اصلی صفحه:
مجدداً به جلسه صفحه (از خط فرمان) پیوست کنید | |
جلسه Screen را ترک کنید | Ctrl+a → |
پنجره جدیدی در جلسه Screen ایجاد کنید | Ctrl+a → |
در همان جلسه Screen بین پنجره ها سوئیچ کنید | Ctrl+a → |
پنجره فعلی را در جلسه Screen بکشید | Ctrl+a → |
تقسیم صفحه
با Screen، می توانید ترمینال را به چندین پنجره تقسیم کنید:
دستورات موجود در screen
با استفاده از Ctrl+a قابل دسترسی هستند. هر دستور باید با این ترکیب کلید دسترسی شروع شود.
اگر دقیقاً Codelab را دنبال کردهاید، باید دو پنجره (FTD Commissioner، 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
خارج شوید، و آنها را در پنجره های جدید Screen راه اندازی مجدد کنید (Ctrl+a → c
).
این تنظیمات مورد نیاز نیست و به عنوان تمرین برای کاربر باقی مانده است.
با دستورات زیر بین پنجره ها تقسیم و پیمایش کنید:
پنجره جدید ایجاد کنید | Ctrl+a → |
تقسیم پنجره به صورت عمودی | Ctrl+a → |
پنجره را به صورت افقی تقسیم کنید | Ctrl+a → |
به پنجره نمایش داده شده بعدی بروید | Ctrl+a → |
پنجره نمایش داده شده را به جلو یا عقب تغییر دهید | Ctrl+a → |
نام پنجره فعلی را تغییر دهید | Ctrl+a → |
هر زمان که بخواهید با Ctrl+a → d
از صفحه خارج شده و با screen -r
از خط فرمان دوباره آن را وصل کنید.
برای اطلاعات بیشتر در مورد صفحه، به مرجع سریع صفحه گنو مراجعه کنید.
7. شبکه Thread را ایجاد کنید
اکنون که تمام پنجره ها و صفحه های ترمینال خود را پیکربندی کرده اید، بیایید شبکه Thread خود را ایجاد کنیم. در کمیسیونر FTD ، یک مجموعه داده عملیاتی جدید ایجاد کنید و آن را به عنوان مجموعه فعال متعهد کنید. مجموعه داده عملیاتی پیکربندی شبکه Thread است که در حال ایجاد آن هستید.
## 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 Network 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:
> 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" اکنون هنگام اسکن از سایر دستگاه های Thread قابل مشاهده است.
از ot-ctl
در RCP Joiner :
## RCP Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
از OpenThread CLI در FTD Joiner :
## FTD Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
اگر شبکه "codelab" در لیست ظاهر نشد، دوباره اسکن را امتحان کنید.
8. RCP Joiner را اضافه کنید
Thread Commissioning در شبکه فعال نیست، به این معنی که ما باید RCP Joiner را به شبکه Thread که با استفاده از فرآیند راه اندازی خارج از باند ایجاد کردیم اضافه کنیم.
در کمیسیون FTD ، ما کلید شبکه را یادداشت کردیم، به عنوان مثال 1234c0de7ab51234c0de7ab51234c0de
. اگر نیاز به جستجوی مجدد کلید شبکه دارید، دستور زیر را در FTD Commissioner اجرا کنید:
## FTD Commissioner ## > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done
سپس، در RCP Joiner ، کلید شبکه مجموعه داده فعال آن را روی کلید شبکه کمیسیونر FTD تنظیم کنید:
## RCP Joiner ## ---------------- > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done > dataset commit active Done
مجموعه داده را بررسی کنید تا مطمئن شوید که به درستی تنظیم شده است.
## RCP Joiner ## ---------------- > dataset Network Key: 1234c0de7ab51234c0de7ab51234c0de
Thread را بالا بیاورید تا RCP Joiner به شبکه "codelab" بپیوندد. چند ثانیه صبر کنید، وضعیت، RLOC16 و آدرس های IPv6 آن را بررسی کنید:
## RCP Joiner ## ---------------- > ifconfig up Done > 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
آدرس IPv6 Mesh-Local را یادداشت کنید ( 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
اکنون یک شبکه Thread متشکل از دو گره داریم که با این نمودار توپولوژی نشان داده شده است:
نمودارهای توپولوژی
همانطور که در بقیه قسمت های Codelab کار می کنید، هر زمان که وضعیت شبکه تغییر کند، نمودار توپولوژی Thread جدیدی را نشان خواهیم داد. نقش های گره به صورت زیر مشخص می شوند:
روترها همیشه پنج ضلعی هستند و دستگاه های پایانی همیشه دایره ای هستند. اعداد روی هر گره نشان دهنده شناسه روتر یا شناسه فرزند است که در خروجی CLI نشان داده شده است، بسته به نقش و وضعیت فعلی هر گره در آن زمان.
9. FTD Joiner را راه اندازی کنید
حالا بیایید دستگاه Thread سوم را به شبکه "codelab" اضافه کنیم. این بار از فرآیند راه اندازی درون باند ایمن تر استفاده می کنیم و فقط به FTD Joiner اجازه می دهیم که بپیوندد.
در FTD Joiner ، eui64
دریافت کنید، تا کمیسیونر FTD بتواند آن را شناسایی کند:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
در FTD Commissioner ، کمیسیونر را راهاندازی کنید و eui64
دستگاهی را که میتواند به آن ملحق شود، به همراه اعتبار Joiner، برای مثال J01NME
، مشخص کنید. Joiner Credential یک رشته مخصوص دستگاه از همه نویسههای حروف عددی بزرگ (0-9 و AY، به استثنای I، O، Q و Z برای خوانایی)، با طول بین 6 تا 32 نویسه است.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
به FTD Joiner بروید. نقش وصال را با اعتبار وصال که به تازگی در کمیسیونر 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 به عنوان یک دستگاه پایانی (کودک) به شبکه متصل شده است. در اینجا توپولوژی به روز شده ما است:
10. نخ در عمل
دستگاههای Thread در این Codelab نوع خاصی از دستگاه Full Thread (FTD) به نام دستگاه پایان واجد شرایط روتر (REED) هستند. این بدان معناست که آنها می توانند به عنوان یک روتر یا دستگاه پایان کار کنند و می توانند خود را از یک دستگاه پایانی به یک روتر ارتقا دهند.
Thread می تواند تا 32 روتر را پشتیبانی کند، اما سعی می کند تعداد روترها را بین 16 تا 23 نگه دارد. اگر یک REED به عنوان دستگاه پایانی (فرزند) متصل شود و تعداد روترها کمتر از 16 باشد، پس از یک دوره زمانی تصادفی در عرض دو دقیقه، آن را نگه می دارد. به طور خودکار خود را به یک روتر تبلیغ می کند.
اگر پس از افزودن FTD Joiner دو فرزند در شبکه Thread خود داشتید، حداقل دو دقیقه صبر کنید و سپس جدول روتر و فرزند را در FTD Commissioner دوباره بررسی کنید:
## 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 بر اساس شناسه روتر و شناسه فرزند یک دستگاه است. وقتی از End Device به Router منتقل می شود، مقدار Router ID و Child ID آن تغییر می کند و 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 اکنون باید در جدول فرزند ظاهر شود (ID = 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
پس از مدتی، به روتر با RLOC b800
برمی گردد.
رهبر را حذف کنید
رهبر از بین همه مسیریابهای Thread خود انتخاب میشود. این بدان معناست که اگر رهبر فعلی از شبکه Thread حذف شود، یکی از روترهای دیگر رهبر جدید خواهد شد.
در کمیسیونر FTD ، Thread را خاموش کنید تا از شبکه Thread حذف شود:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
در عرض دو دقیقه، FTD Joiner رهبر جدید Thread می شود. وضعیت و آدرس 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 است که توسط ID و Extended MAC آن مشخص شده است. به منظور حفظ شبکه Thread با هم، روترهای مادر را از FTD Commissioner به 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 را مجدداً وصل کنید
شبکه Thread با دو گره چندان جالب نیست. بیایید کمیسر FTD را دوباره آنلاین کنیم.
در کمیسیونر FTD ، موضوع را دوباره راه اندازی کنید:
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
در عرض دو دقیقه، بهطور خودکار بهعنوان دستگاه پایانی دوباره به شبکه «کدلب» متصل میشود و سپس خود را به یک روتر ارتقا میدهد.
## 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
شبکه Thread ما دوباره از سه گره تشکیل شده است.
11. عیب یابی
مدیریت یک شبکه Thread با چندین دستگاه در ترمینال یا پنجره های مختلف صفحه می تواند پیچیده باشد. اگر با مشکلاتی مواجه شدید، از این نکات برای "تنظیم مجدد" وضعیت شبکه یا فضای کاری خود استفاده کنید.
صفحه نمایش
اگر زمانی در پیکربندی خود گم شدید (پنجره های بیش از حد صفحه یا صفحه نمایش های درون صفحه)، به کشتن پنجره های صفحه با Ctrl+a → k ادامه دهید تا زمانی که هیچ کدام وجود نداشته باشد و screen -ls
در خط فرمان خروجی No Sockets found
. سپس پنجره های صفحه را برای هر دستگاه دوباره ایجاد کنید. وضعیت های دستگاه حتی زمانی که صفحه نمایش خاموش می شود، حفظ می شود.
گره های نخ
اگر توپولوژی شبکه Thread همانطور که در این Codelab توضیح داده شده نیست، یا گره ها به دلایلی قطع می شوند (شاید به این دلیل که دستگاه لینوکس که آنها را تغذیه می کند به خواب رفته است)، بهتر است Thread را پایین بیاورید، اعتبار شبکه را پاک کنید و دوباره از Create شروع کنید. مرحله شبکه Thread .
برای بازنشانی FTD ها:
## FTD Commissioner or FTD Joiner ## ------------------------------------ > thread stop Done > ifconfig down Done > factoryreset Done
RCP را می توان به همان روش از طریق ot-ctl
بازنشانی کرد:
## RCP Joiner ## ---------------- > thread stop Done > ifconfig down Done > factoryreset Done
12. استفاده از چندپخشی
Multicast برای برقراری ارتباط همزمان اطلاعات به گروهی از دستگاه ها استفاده می شود. در شبکه Thread، بسته به محدوده، آدرسهای خاصی برای استفاده چندپخشی با گروههای مختلف دستگاهها رزرو میشوند.
آدرس IPv6 | دامنه | تحویل به |
| پیوند-محلی | همه FTD ها و MED ها |
| پیوند-محلی | همه FTD ها و روترهای مرزی |
| مش-محلی | همه FTD ها و MED ها |
| مش-محلی | همه FTD ها و روترهای مرزی |
از آنجایی که ما از یک مسیریاب مرزی در این Codelab استفاده نمی کنیم، بیایید روی دو آدرس چندپخشی FTD و MED تمرکز کنیم.
پیوند-محلی
محدوده لینک محلی شامل تمام رابط های Thread است که با یک انتقال رادیویی یا یک "hop" قابل دسترسی هستند. توپولوژی شبکه تعیین می کند که کدام دستگاه ها به یک پینگ به آدرس چندپخشی ff02::1
پاسخ دهند.
پینگ 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 فقط یک پاسخ دریافت کرد، از آدرس لینک محلی FTD Joiner (LLA). این بدان معنی است که FTD Joiner تنها وسیله ای است که کمیسیونر FTD می تواند با یک پرش به آن دست یابد.
اکنون 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
ختم میشود) LLA RCP Joiner است.
این بدان معنی است که FTD Joiner مستقیماً به FTD Commissioner و RCP Joiner متصل است که توپولوژی ما را تأیید می کند.
مش-محلی
Mesh-Local scope شامل تمام رابط های Thread قابل دسترسی در یک شبکه Thread می شود. بیایید پاسخ های پینگ به آدرس چندپخشی ff03::1
را ببینیم.
پینگ 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 دو پاسخ دریافت کرد، یکی از FTD Joiner's Routing Locator (RLOC که به b800
ختم می شود) و دیگری از RCP Joiner's Mesh-Local EID (ML-EID، با پایان d55f
). این به این دلیل است که محدوده شبکه محلی کل شبکه Thread را در بر می گیرد. مهم نیست که یک دستگاه در کجای شبکه باشد، در آدرس ff03::1
مشترک خواهد شد.
پینگ 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 Commissioner (68 میلیثانیه) بیشتر از رسیدن به FTD Joiner (23 میلیثانیه) طول کشید. به این دلیل که برای رسیدن به کمیسیونر FTD باید دو پرش انجام دهد، در مقایسه با یک پرش برای FTD Joiner.
همچنین ممکن است متوجه شده باشید که پینگ چندپخشی محلی مش با RLOC فقط برای دو FTD پاسخ میدهد - نه RCP Joiner. این به این دلیل است که FTD ها روترهای درون شبکه هستند، در حالی که RCP یک دستگاه پایانی است.
برای تأیید وضعیت RCP Joiner را بررسی کنید:
## RCP Joiner ## ---------------- > state child
13. با UDP پیام ارسال کنید
یکی از سرویسهای کاربردی که OpenThread ارائه میکند، پروتکل دادهگرام کاربر (UDP)، یک پروتکل لایه انتقال است. برنامهای که بر روی OpenThread ساخته شده است میتواند از UDP API برای ارسال پیامها بین گرهها در یک شبکه Thread یا به دستگاههای دیگر در یک شبکه خارجی (مثل اینترنت، اگر شبکه Thread دارای یک مسیریاب مرزی باشد) استفاده کند.
سوکت های UDP از طریق OpenThread CLI در معرض دید قرار می گیرند. بیایید از آن برای ارسال پیام بین دو FTD استفاده کنیم.
آدرس EID Mesh-Local را برای FTD Joiner دریافت کنید. ما از این آدرس استفاده می کنیم زیرا از هر نقطه ای در شبکه Thread قابل دسترسی است.
## 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 Commissioner بروید، UDP را راه اندازی کنید و با استفاده از ML-EID آن به سوکتی که در FTD Joiner راه اندازی کرده اید وصل شوید:
## 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
14. تبریک می گویم!
شما یک شبکه Thread فیزیکی ایجاد کرده اید!
اکنون می دانید:
- تفاوت بین انواع دستگاه Thread، نقشها و محدوده
- چگونه دستگاه های Thread حالت های خود را در شبکه مدیریت می کنند
- نحوه ارسال پیام های ساده بین گره ها با استفاده از UDP
مراحل بعدی
با استفاده از این Codelab، تمرینات زیر را امتحان کنید:
- برد FTD Joiner را با استفاده از باینری
ot-cli-mtd
به عنوان یک MTD مجدداً فلش کنید و مشاهده کنید که هرگز خود را به یک روتر ارتقا نمی دهد یا سعی نمی کند رهبر شود. - دستگاه های بیشتری را به شبکه اضافه کنید (پلتفرم دیگری را امتحان کنید!) و توپولوژی را با استفاده از جداول روتر و فرزند، همراه با پینگ به آدرس های چندپخشی ترسیم کنید.
- از pyspinel برای کنترل NCP استفاده کنید
- NCP را با استفاده از OpenThread Border Router به Border Router تبدیل کنید و شبکه Thread خود را به اینترنت متصل کنید.
در ادامه مطلب
برای انواع منابع OpenThread از جمله: openthread.io و GitHub را بررسی کنید:
- پلتفرم های پشتیبانی شده - تمام پلتفرم هایی که از OpenThread پشتیبانی می کنند را کشف کنید
- ساخت OpenThread - جزئیات بیشتر در مورد ساخت و پیکربندی OpenThread
- Thread Primer - تمام مفاهیم Thread که در این Codelab وجود دارد را پوشش می دهد
مرجع: