OpenThread منتشر شده توسط Google یک اجرای منبع باز از پروتکل شبکه Thread® است. Google Nest OpenThread را منتشر کرده است تا فناوری مورد استفاده در محصولات Nest را به طور گسترده در دسترس توسعه دهندگان قرار دهد تا توسعه محصولات برای خانه متصل را تسریع کند.
مشخصات Thread یک پروتکل ارتباطی بی سیم و بی سیم مبتنی بر IPv6 را برای برنامه های خانگی تعریف می کند. OpenThread تمام لایه های شبکه Thread از جمله IPv6 ، 6LoWPAN ، IEEE 802.15.4 را با امنیت MAC ، ایجاد مش پیوند و مسیریابی پیاده سازی می کند.
در این Codelab ، OpenThread را روی سخت افزار واقعی برنامه ریزی می کنید ، شبکه Thread را ایجاد و مدیریت می کنید و پیام ها را بین گره ها منتقل می کنید.
آنچه خواهید آموخت
- ساخت و فلش باینری OpenThread CLI در صفحه های توسعه
- ساخت یک RCP متشکل از یک دستگاه لینوکس و یک صفحه توسعه
- برقراری ارتباط با RCP با استفاده از OpenThread Daemon و
ot-ctl
- مدیریت دستی گره های Thread با Screen و OpenThread CLI
- راه اندازی ایمن دستگاه ها در شبکه Thread
- نحوه عملکرد چندپخشی IPv6
- ارسال پیام بین گره های Thread با UDP
آنچه شما نیاز دارید
سخت افزار:
- 3 صفحه Nordic Semiconductor nRF52840 dev
- 3 کابل USB به Micro-USB برای اتصال بردها
- دستگاه لینوکس با حداقل 3 پورت USB
نرم افزار:
- ابزار GNU
- Nordic nRF5x ابزارهای خط فرمان
- نرم افزار Segger J-Link
- OpenThread
- گیت
به استثنای موارد دیگری که ذکر شده باشد ، محتوای این Codelab تحت Creative Commons Attribution 3.0 License و نمونه های کد تحت مجوز Apache 2.0 مجوز دارند .
شبیه سازی OpenThread
قبل از شروع ، ممکن است بخواهید از طریق Codelab Simulation OpenThread اجرا شوید ، تا با مفاهیم اساسی Thread و OpenThread CLI آشنا شوید.
پایانه های پورت سریال
شما باید با نحوه اتصال به یک پورت سریال از طریق یک ترمینال آشنا باشید. این Codelab از Screen استفاده می کند و نمای کلی استفاده را ارائه می دهد ، اما از هر نرم افزار پایانه دیگری می توان استفاده کرد.
دستگاه لینوکس
این Codelab برای استفاده از دستگاه لینوکس مبتنی بر i386 یا x86 به عنوان میزبان دستگاه Thread Radio-Co-Processor (RCP) و فلش کردن همه تابلوهای توسعه Thread طراحی شده است. تمام مراحل در Ubuntu 14.04.5 LTS (Trusty Tahr) آزمایش شد.
تخته های Nordic Semiconductor nRF52840
این Codelab از سه صفحه nRF52840 PDK استفاده می کند.
SEGGER J-Link را نصب کنید
ما از SEGGER J-Link برای برنامه ریزی تابلوهای nRF52840 ، که دارای ماژول های JTAG هستند ، استفاده می کنیم. این را روی دستگاه Linux خود نصب کنید.
بسته مناسب دستگاه خود را بارگیری کرده و آن را در مکان مناسب نصب کنید. در لینوکس این /opt/SEGGER/JLink
.
nRF5x ابزار خط فرمان را نصب کنید
nRF5x ابزار خط فرمان به شما امکان می دهد باینری OpenThread را به صفحات nRF52840 فلش کنید. nRF5x-Command-Line-Tools- <OS> مناسب را بر روی دستگاه لینوکس خود نصب کنید.
بسته استخراج شده را در پوشه ریشه قرار دهید ~/
ARM GNU Toolchain را نصب کنید
ARM GNU Toolchain برای ساخت استفاده می شود.
ما توصیه می کنیم بایگانی استخراج شده را در /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
بر روی دستگاه لینوکس خود قرار دهید. برای دستورالعمل نصب ، دستورالعمل های موجود در فایل readme.txt
بایگانی را دنبال کنید.
نصب صفحه (اختیاری)
Screen یک ابزار ساده برای دسترسی به دستگاه های متصل شده توسط پورت سریال است. این Codelab از Screen استفاده می کند ، اما شما می توانید از هر برنامه ترمینال پورت سریال که می خواهید استفاده کنید.
$ sudo apt-get install screen
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 هستید.
بسازید و فلش کنید
مثال OpenThread nRF52840 را با قابلیت Joiner و بومی USB بسازید. دستگاهی برای تأیید اعتبار ایمن و راه اندازی در شبکه Thread از نقش Joiner استفاده می کند. Native USB استفاده از USB CDC ACM را به عنوان یک انتقال سریال بین nRF52840 و میزبان امکان پذیر می کند.
همیشه با اجرای make clean
نسخه اولیه ساختهای قبلی make clean
.
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 UART_trans
با دودویی OpenThread RCP به فهرست بروید و آن را به قالب hex تبدیل کنید:
$ 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 روشن است.
اگر این اولین برد متصل به دستگاه لینوکس باشد ، به صورت سریال /dev/ttyACM0
(همه تابلوهای ttyACM
از ttyACM
برای شناسه پورت سریال استفاده می کنند).
$ ls /dev/ttyACM* /dev/ttyACM0
به شماره سریال برد nRF52840 که برای RCP استفاده می شود توجه داشته باشید:
به محل ابزارهای خط فرمان nRFx بروید و با استفاده از شماره سریال برد ، پرونده hex 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 بومی را به عنوان یک انتقال سریال فراهم می کند ، برای برقراری ارتباط با میزبان RCP (ماشین لینوکس) باید از پورت USB nRF در برد nRF52840 استفاده کنید.
انتهای کابل USB Micro-USB را از پورت اشکال زدایی برد nRF52840 فلش زده و سپس دوباره آن را به درگاه USB Micro-USB nRF در کنار دکمه RESET متصل کنید. کلید منبع تغذیه 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
این پنجره ترمینال را باز بگذارید تا سیاهههای مربوط به ot-daemon
قابل مشاهده باشد.
برای برقراری ارتباط با گره RCP از ot-ctl
استفاده کنید. ot-ctl
از CLI مشابه برنامه OpenThread CLI استفاده می کند. بنابراین ، شما می توانید گره های ot-daemon
به همان روشی که سایر دستگاه های Thread شبیه سازی شده کنترل کنید.
در پنجره ترمینال دوم ، ot-ctl
شروع کنید:
$ ./output/posix/bin/ot-ctl >
state
گره 2 (گره RCP) را که با ot-daemon
:
> state disabled Done
دو گره Thread دیگر که در این Codelab استفاده می شود ، دستگاه های Full Thread (FTD) با طرح استاندارد System-on-Chip (SoC) است. آنها از wpantund
استفاده نمی کنند و کاربر به صورت دستی آنها را با OpenThread CLI مدیریت می کند.
یک دستگاه به عنوان کمیسر کار می کند ، تا امنیت دستگاه ها را در آن شبکه تأیید کند و راه اندازی کند. دستگاه دیگر به عنوان Joiner عمل می کند که کمیساریا می تواند آن را در شبکه Thread تأیید کند.
بسازید و فلش کنید
با فعال کردن نقش کمیسر و Joiner ، مثال 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 به دایرکتوری بروید و آن را به قالب hex تبدیل کنید:
$ 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 هنوز به دستگاه لینوکس متصل باشد ، این صفحه جدید باید به صورت سریال /dev/ttyACM1
(همه تابلوهای ttyACM
از ttyACM
برای شناسه پورت سریال استفاده می کنند)
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
مانند قبل ، به شماره سریال برد nRF52840 که برای FTD استفاده می شود توجه داشته باشید:
به محل ابزارهای خط فرمان nRFx بروید و با استفاده از شماره سریال برد ، فایل hex 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 Screen از پنجره ترمینال ، ساخت موفقیت آمیز را تأیید کنید. تابلوهای 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 Use استفاده کنید
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 تکرار کنید.
اگر وقتی این صفحه سوم متصل است ، دو گره دیگر به دستگاه Linux متصل هستند ، باید به صورت سریال /dev/ttyACM2
:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
روی تابلو "Joiner" برچسب بزنید.
هنگام تأیید با استفاده از Screen ، به جای ایجاد یک نمونه جدید از Screen از خط فرمان ، دوباره به مورد موجود وصل شوید و یک پنجره جدید در آن ایجاد کنید (که برای FTD کمیساریون استفاده کردید):
$ screen -r
با Ctrl + a the پنجره جدیدی در Screen ایجاد کنید
c
**. ** خط فرمان جدید ظاهر می شود. برای اتصال دهنده FTD به OpenThread CLI دسترسی پیدا کنید:
$ 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 Use استفاده کنید
d
در هر زمان برای خروج از صفحه نمایش.
با رفتن به جلو ، شما مرتب بین دستگاه های Thread جابجا خواهید شد ، بنابراین مطمئن شوید که همه آنها زنده هستند و به راحتی در دسترس هستند. تا کنون ، ما برای دسترسی به دو FTD از Screen استفاده کرده ایم و این ابزار همچنین امکان تقسیم صفحه را در همان پنجره ترمینال فراهم می کند. برای دیدن چگونگی واکنش یک گره به دستورات صادر شده روی دیگری از این استفاده کنید.
در حالت ایده آل ، باید چهار پنجره به راحتی در دسترس داشته باشید:
- سرویس / سیاهههای مربوط به
ot-daemon
- وصل کننده RCP از طریق
ot-ctl
- نماینده FTD از طریق OpenThread CLI
- FTD Joiner از طریق OpenThread CLI
اگر می خواهید از پیکربندی یا ابزار پورت ترمینال / سریال خود استفاده کنید ، احساس راحتی کنید و به مرحله بعدی بروید. پنجره های ترمینال را برای همه دستگاه ها به روشی تنظیم کنید که برای شما بهتر باشد.
با استفاده از صفحه نمایش
برای سهولت استفاده ، فقط یک جلسه صفحه را شروع کنید. شما باید از زمان راه اندازی هر دو FTD ، یکی را داشته باشید.
تمام دستورات داخل صفحه با Ctrl + a شروع می شوند.
دستورات صفحه اصلی:
دوباره به جلسه Screen (از خط فرمان) متصل شوید | |
جلسه Screen را ترک کنید | Ctrl + a → |
در جلسه Screen یک پنجره جدید ایجاد کنید | Ctrl + a → |
در همان جلسه Screen بین پنجره ها جابجا شوید | Ctrl + a → |
پنجره فعلی را در جلسه Screen بکشید | Ctrl + a → |
تقسیم صفحه
با استفاده از Screen ، می توانید ترمینال را به چندین پنجره تقسیم کنید:
با استفاده از Ctrl + a به دستورات موجود در screen
دسترسی پیدا می کنید. هر دستوری باید با این کلید ترکیبی دسترسی شروع شود.
اگر Codelab را دقیقاً دنبال کرده اید ، باید دو پنجره (FTD Commissioner ، FTD Joiner) در یک نمونه صفحه یکسان داشته باشید. برای تقسیم صفحه نمایش بین این دو ، ابتدا جلسه Screen موجود خود را وارد کنید:
$ screen -r
شما باید در یکی از دستگاه های FTD باشید. این مراحل را در Screen دنبال کنید:
- 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
خارج شوید و آنها را در پنجره های جدید صفحه (Ctrl + a. c
) دوباره راه اندازی کنید.
این تنظیم لازم نیست و به عنوان یک تمرین برای کاربر باقی مانده است.
با دستورات زیر بین پنجره ها تقسیم شده و حرکت کنید:
ایجاد پنجره جدید | Ctrl + a → |
پنجره را به صورت عمودی تقسیم کنید | Ctrl + a |
پنجره را به صورت افقی تقسیم کنید | Ctrl + a → |
به پنجره نمایش داده شده بعدی بروید | Ctrl + a → |
پنجره نمایش داده شده را به جلو یا عقب تغییر دهید | Ctrl + a → |
تغییر نام پنجره فعلی | Ctrl + a → |
هر زمان بخواهید با Ctrl + a → d
صفحه را ترک کنید و دوباره از screen -r
دستور با screen -r
متصل شوید.
برای اطلاعات بیشتر در مورد صفحه ، به مرجع سریع صفحه GNU مراجعه کنید .
اکنون که تمام پنجره ها و صفحه های ترمینال خود را پیکربندی کرده اید ، بیایید شبکه 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 Master Key: 1234c0de7ab51234c0de7ab51234c0de Network Name: OpenThread-c0de PAN ID: 0xc0de PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Master Key 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" اکنون هنگام اسکن شدن از سایر دستگاه های Thread قابل مشاهده است.
از ot-ctl
در وصل کننده RCP :
## 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). این فقط به این معنی است که راه اندازی Thread در شبکه فعال نیست. با وارد کردن دستی کلید اصلی شبکه در دستگاه وصله ، همچنان می توان از باند آن پیوست.
بیایید با استفاده از فرایند خارج از باند ، 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 را مطرح کنید تا Joiner RCP به شبکه "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
آدرس fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
-Local IPv6 را یادداشت کنید ( fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
اینجا) ، بعداً از آن استفاده خواهید کرد.
دوباره به کمیساریای FTD بروید ، جدول روتر و کودک را بررسی کنید تا تأیید کنید هر دو دستگاه بخشی از یک شبکه هستند. از RLOC16 برای شناسایی اتصال دهنده RCP استفاده کنید.
## 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 (آدرس مش محلی که از خروجی ipaddr
وصال RCP بدست آمده است) برای تأیید اتصال:
## 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 جدید نشان خواهیم داد. نقش های گره به شرح زیر مشخص می شوند:
روترها همیشه پنج ضلعی هستند و دستگاه های End همیشه دایره هستند. اعداد موجود در هر گره بسته به نقش و وضعیت فعلی هر گره در آن زمان ، نشان دهنده شناسه Router یا Child ID است که در خروجی CLI نشان داده شده است.
حال اجازه دهید دستگاه Thread سوم را به شبکه "codelab" اضافه کنیم. این بار ما می خواهیم از ایمن ترین روند راه اندازی باند استفاده کنیم. در اتصال دهنده FTD ، شبکه را اسکن کنید:
## FTD Joiner ## ---------------- > scan | J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI | +---+------------------+------------------+------+------------------+----+-----+-----+ | 0 | OpenThread-c0de | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 | 57 |
A 0
در ستون J نشان می دهد که راه اندازی Thread در دستگاه فعال نیست.
بیایید هنگام راه اندازی در این دستگاه بعدی خاص باشیم و فقط به FTD Joiner اجازه عضویت دهیم. هنوز در eui64
، eui64
را دریافت کنید ، بنابراین کمیساریای FTD می تواند آن را شناسایی کند:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
در کمیساریون FTD ، کمیسر را شروع کرده و eui64
دستگاهی را که می تواند به آن بپیوندد ، همراه با اعتبارنامه Joiner مشخص کنید. اعتبار نامه Joiner یک عبارت عبور مخصوص دستگاه است.
## 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، موضوع راه اندازی شده است در حال حاضر فعال در شبکه است. نقش وصال را با اعتبارنامه Joiner که به تازگی در کمیسیون FTD تنظیم کرده اید شروع کنید:
## FTD Joiner ## ---------------- > ifconfig up Done > joiner start J01NME Done
در عرض یک دقیقه یا بیشتر ، شما تأیید احراز هویت موفقیت آمیز را دریافت می کنید:
## FTD Joiner ## ---------------- > Join success
Thread را بالا آورید تا Joiner FTD به شبکه "codelab" بپیوندد و بلافاصله وضعیت و RLOC16 را بررسی کنید:
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
آدرسهای IPv6 دستگاه را بررسی کنید. توجه داشته باشید که هیچ ALOC وجود ندارد. دلیلش این است که این دستگاه Leader نیست و همچنین نقشی خاص 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 به عنوان یک دستگاه پایان (کودک) به شبکه متصل شده است. در اینجا توپولوژی به روز شده ما است:
دستگاه های Thread موجود در این Codelab نوعی خاص از دستگاه Full Thread (FTD) است که دستگاه انتهایی واجد شرایط روتر (REED) نامیده می شود. این بدان معنی است که آنها می توانند به عنوان روتر یا دستگاه پایان عمل کنند و می توانند خود را از یک دستگاه پایان یافته به یک روتر ارتقا دهند.
این موضوع می تواند حداکثر 32 روتر را پشتیبانی کند ، اما سعی دارد تعداد روترها را بین 16 تا 23 نگه دارد. به طور خودکار خود را به یک روتر معرفی می کند.
اگر بعد از اضافه کردن FTD Joiner در شبکه Thread خود دو فرزند داشتید ، حداقل دو دقیقه صبر کنید و سپس جداول روتر و کودک را در 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 بر اساس شناسه روتر و شناسه کودک یک دستگاه ساخته شده است. هنگامی که از End Device به 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 ، Joiner FTD اکنون باید در جدول کودک ظاهر شود (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
.
رهبر را بردارید
رهبر در میان تمام روترهای موضوعی خود انتخاب می شود. این بدان معنی است که اگر Leader فعلی از شبکه Thread حذف شود ، یکی دیگر از روترها به Leader جدید تبدیل می شود.
در کمیسیون FTD ، Thread را خاموش کنید تا از شبکه Thread حذف شود:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
در عرض دو دقیقه ، FTD Joiner به عنوان رهبر جدید موضوع شناخته می شود. آدرس و وضعیت IPv6 اتصال دهنده FTD را بررسی کنید تا تأیید کنید:
## 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 جدید وجود دارد. همانطور که توسط شناسه و MAC توسعه یافته نشان داده شده است ، این اتصال دهنده RCP است. به منظور حفظ شبکه Thread ، روترهای اصلی را از کمیساریای FTD به وصال FTD تغییر داده است. این منجر به ایجاد یک 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
شاید لازم باشد چند دقیقه منتظر بمانید تا Joiner RCP از کودکی به FTD Joiner متصل شود. وضعیت و RLOC16 را بررسی کنید تا تأیید کنید:
## RCP Joiner ## -------------- > state child > rloc16 b801
کمیسیون FTD را دوباره وصل کنید
شبکه Thread با دو گره خیلی جالب نیست. بیایید کمیشنر FTD را دوباره آنلاین کنیم.
در کمیساریون FTD ، موضوع را دوباره راه اندازی کنید:
## 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
شبکه Thread ما دوباره از سه گره تشکیل شده است.
مدیریت یک شبکه Thread با چندین دستگاه در ترمینال یا پنجره های مختلف صفحه ممکن است پیچیده باشد. اگر با مشکلی روبرو شدید ، از این نکات برای "تنظیم مجدد" وضعیت شبکه یا فضای کار خود استفاده کنید.
صفحه نمایش
اگر شما هرگز در پیکربندی خود را (بیش از حد بسیاری از پنجره های صفحه نمایش، و یا صفحه نمایش در صفحه نمایش) از دست داده، به کشتن پنجره صفحه نمایش با استفاده از Ctrl + A → K تا وجود داشته باشد هیچ و screen -ls
در خط فرمان خروجی No Sockets found
. سپس پنجره های صفحه را برای هر دستگاه از نو بسازید. حالت های دستگاه حتی در هنگام از بین رفتن صفحه نیز حفظ می شوند.
گره های نخ
اگر توپولوژی شبکه Thread مطابق توضیحات این Codelab نیست ، یا گره ها به دلایلی قطع اتصال می شوند (شاید به این دلیل است که دستگاه لینوکس آنها را خاموش می کند) ، بهتر است Thread را پایین بیاورید ، اعتبار شبکه را پاک کنید و دوباره از ایجاد مرحله شبکه Thread .
برای تنظیم مجدد FTDs:
## 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
از Multicast برای برقراری ارتباط همزمان با گروهی از دستگاه ها استفاده می شود. در یک شبکه Thread ، آدرس های خاصی برای استفاده چندپخشی با گروه های مختلف دستگاه ، بسته به دامنه ، ذخیره می شود.
آدرس IPv6 | محدوده | تحویل به |
| پیوند-محلی | همه FTD ها و MED ها |
| پیوند-محلی | همه FTD ها و مسیریاب ها |
| مش-محلی | همه FTD ها و MED ها |
| مش-محلی | تمام FTD ها و روترهای مرزی |
از آنجا که ما در این Codelab از روتر Border استفاده نمی کنیم ، بیایید بر روی دو آدرس چند FAST و FED تمرکز کنیم.
پیوند-محلی
دامنه Link-Local شامل همه رابط های Thread است که با یک رادیو یا یک "هاپ" واحد قابل دسترسی هستند. توپولوژی شبکه تعیین می کند کدام دستگاه ها به یک پینگ به آدرس چندپخشی 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 فقط یک پاسخ دریافت کرد ، از آدرس پیوند محلی-اتصال دهنده FTD (LLA) این بدان معنی است که 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
) LLA وصل کننده RCP است.
این بدان معنی است که اتصال دهنده FTD مستقیماً به کمیسر FTD و وصل کننده RCP متصل است ، که توپولوژی ما را تأیید می کند.
مش-محلی
دامنه مش-محلی شامل همه رابط های موضوع است که در همان شبکه Thread قابل دسترسی هستند. بیایید پاسخ های ping به آدرس چندپخشی 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 دو پاسخ دریافت کرد ، یکی از FTD Joiner's Routing Locator (RLOC ، با پایان b800
) و دیگری از RCP Joiner's Mesh-Local EID (ML-EID ، با پایان با d55f
). دامنه مش محلی شامل کل شبکه Thread است. مهم نیست که یک دستگاه در کجای شبکه قرار داشته باشد ، در آدرس ff03::1
مشترک می شود.
Ping ff03::1
از عضو FTD برای تایید رفتار مشابه:
## 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 (23 میلی ثانیه) زمان برد. این به این دلیل است که برای رسیدن به کمیساریای FTD باید دو هاپ تولید کند ، در حالی که برای وصال FTD یک هاپ وجود دارد.
همچنین ممکن است متوجه شده باشید که پینگ چندپخشی مش محلی با RLOC فقط برای دو FTD جواب می دهد - نه اتصال دهنده RCP. این به این دلیل است که FTD ها روترهای درون شبکه هستند ، در حالی که RCP یک دستگاه نهایی است.
برای تأیید وضعیت اتصال دهنده RCP :
## RCP Joiner ## ---------------- > state child
یکی از سرویس های برنامه ای که OpenThread ارائه می دهد ، پروتکل کاربر Datagram Protocol (UDP) است که یک پروتکل لایه حمل و نقل است. برنامه ای که بر روی OpenThread ساخته شده است می تواند از UDP API برای انتقال پیام ها بین گره های شبکه Thread یا سایر دستگاه ها در یک شبکه خارجی استفاده کند (مانند اینترنت ، اگر شبکه Thread دارای روتر حاشیه باشد)
سوکت های UDP از طریق OpenThread CLI در معرض دید قرار می گیرند. بیایید از آن برای انتقال پیام بین دو FTD استفاده کنیم.
آدرس EID مش محلی را برای 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 بروید ، 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
شما یک شبکه Thread فیزیکی ایجاد کرده اید!
اکنون می دانید:
- تفاوت بین انواع دستگاه Thread ، نقش ها و محدوده ها
- چگونه دستگاه های Thread وضعیت های خود را در داخل شبکه مدیریت می کنند
- نحوه ارسال پیام های ساده بین گره ها با استفاده از UDP
مراحل بعدی
با استفاده از این Codelab ، تمرینات زیر را امتحان کنید:
- صفحه FTD Joiner را به عنوان MTD با استفاده از باینری
ot-cli-mtd
و مشاهده کنید که هرگز خودش را به روتر ارتقا نمی دهد و نمی خواهد رهبر شود - دستگاه های بیشتری اضافه کنید (یک سیستم عامل دیگر را امتحان کنید!) به شبکه و طراحی توپولوژی با استفاده از روتر و جداول کودک ، همراه با پینگ به آدرس های چندپخشی
- برای کنترل NCP از pyspinel استفاده کنید
- با استفاده از OpenThread Border Router NCP را به یک مسیریاب Border تبدیل کنید و شبکه Thread خود را به اینترنت وصل کنید
بیشتر خواندن
openthread.io و GitHub را برای انواع منابع OpenThread از جمله:
- سیستم عامل های پشتیبانی شده - همه سیستم عامل هایی را که از OpenThread پشتیبانی می کنند کشف کنید
- ساخت OpenThread - جزئیات بیشتر در مورد ساخت و پیکربندی OpenThread
- Thread Primer - تمام مفاهیم Thread ارائه شده در این Codelab را پوشش می دهد
ارجاع: