Google is committed to advancing racial equity for Black communities. See how.
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

با تابلوهای nRF52840 و OpenThread یک شبکه Thread ایجاد کنید

26b7f4f6b3ea0700.png

OpenThread منتشر شده توسط Google یک اجرای منبع باز از پروتکل شبکه Thread® است. Google Nest OpenThread را منتشر کرده است تا فناوری مورد استفاده در محصولات Nest را به طور گسترده در دسترس توسعه دهندگان قرار دهد تا توسعه محصولات برای خانه متصل را تسریع کند.

مشخصات Thread یک پروتکل ارتباطی بی سیم و بی سیم مبتنی بر IPv6 را برای برنامه های خانگی تعریف می کند. OpenThread تمام لایه های شبکه Thread از جمله IPv6 ، 6LoWPAN ، IEEE 802.15.4 را با امنیت MAC ، ایجاد مش پیوند و مسیریابی پیاده سازی می کند.

در این Codelab ، OpenThread را روی سخت افزار واقعی برنامه ریزی می کنید ، شبکه Thread را ایجاد و مدیریت می کنید و پیام ها را بین گره ها منتقل می کنید.

4806d16a8c137c6d.jpeg

آنچه خواهید آموخت

  • ساخت و فلش باینری 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 استفاده می کند.

a6693da3ce213856.png

ما از SEGGER J-Link برای برنامه ریزی تابلوهای nRF52840 ، که دارای ماژول های JTAG هستند ، استفاده می کنیم. این را روی دستگاه Linux خود نصب کنید.

بسته نرم افزاری و مستندات J-Link را بارگیری کنید

بسته مناسب دستگاه خود را بارگیری کرده و آن را در مکان مناسب نصب کنید. در لینوکس این /opt/SEGGER/JLink .

nRF5x ابزار خط فرمان را نصب کنید

nRF5x ابزار خط فرمان به شما امکان می دهد باینری OpenThread را به صفحات nRF52840 فلش کنید. nRF5x-Command-Line-Tools- <OS> مناسب را بر روی دستگاه لینوکس خود نصب کنید.

nRF5x ابزار خط فرمان را بارگیری کنید

بسته استخراج شده را در پوشه ریشه قرار دهید ~/

ARM GNU Toolchain را نصب کنید

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 روشن است.

20a3b4b480356447.png

اگر این اولین برد متصل به دستگاه لینوکس باشد ، به صورت سریال /dev/ttyACM0 (همه تابلوهای ttyACM از ttyACM برای شناسه پورت سریال استفاده می کنند).

$ ls /dev/ttyACM*
/dev/ttyACM0

به شماره سریال برد nRF52840 که برای RCP استفاده می شود توجه داشته باشید:

c00d519ebec7e5f0.jpeg

به محل ابزارهای خط فرمان 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 تنظیم کنید .

46e7b670d2464842.png

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 استفاده می شود توجه داشته باشید:

c00d519ebec7e5f0.jpeg

به محل ابزارهای خط فرمان 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 استفاده کرده ایم و این ابزار همچنین امکان تقسیم صفحه را در همان پنجره ترمینال فراهم می کند. برای دیدن چگونگی واکنش یک گره به دستورات صادر شده روی دیگری از این استفاده کنید.

در حالت ایده آل ، باید چهار پنجره به راحتی در دسترس داشته باشید:

  1. سرویس / سیاهههای مربوط به ot-daemon
  2. وصل کننده RCP از طریق ot-ctl
  3. نماینده FTD از طریق OpenThread CLI
  4. FTD Joiner از طریق OpenThread CLI

اگر می خواهید از پیکربندی یا ابزار پورت ترمینال / سریال خود استفاده کنید ، احساس راحتی کنید و به مرحله بعدی بروید. پنجره های ترمینال را برای همه دستگاه ها به روشی تنظیم کنید که برای شما بهتر باشد.

با استفاده از صفحه نمایش

برای سهولت استفاده ، فقط یک جلسه صفحه را شروع کنید. شما باید از زمان راه اندازی هر دو FTD ، یکی را داشته باشید.

تمام دستورات داخل صفحه با Ctrl + a شروع می شوند.

دستورات صفحه اصلی:

دوباره به جلسه Screen (از خط فرمان) متصل شوید

screen -r

جلسه Screen را ترک کنید

Ctrl + a → d

در جلسه Screen یک پنجره جدید ایجاد کنید

Ctrl + a → c

در همان جلسه Screen بین پنجره ها جابجا شوید

Ctrl + a → n (جلو) Ctrl + a → p (عقب)

پنجره فعلی را در جلسه Screen بکشید

Ctrl + a → k

تقسیم صفحه

با استفاده از Screen ، می توانید ترمینال را به چندین پنجره تقسیم کنید:

f1cbf1258cf0a5a.png

با استفاده از Ctrl + a به دستورات موجود در screen دسترسی پیدا می کنید. هر دستوری باید با این کلید ترکیبی دسترسی شروع شود.

اگر Codelab را دقیقاً دنبال کرده اید ، باید دو پنجره (FTD Commissioner ، FTD Joiner) در یک نمونه صفحه یکسان داشته باشید. برای تقسیم صفحه نمایش بین این دو ، ابتدا جلسه Screen موجود خود را وارد کنید:

$ screen -r

شما باید در یکی از دستگاه های FTD باشید. این مراحل را در Screen دنبال کنید:

  1. Ctrl + a → S برای تقسیم پنجره به صورت افقی
  2. Ctrl + a → Tab برای انتقال مکان نما به پنجره خالی جدید تغییر دهید
  3. Ctrl + a → n را تغییر دهید تا پنجره جدید را به پنجره بعدی تغییر دهید
  4. اگر همانند پنجره بالا است ، دوباره 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 → c

پنجره را به صورت عمودی تقسیم کنید

Ctrl + a

پنجره را به صورت افقی تقسیم کنید

Ctrl + a → S

به پنجره نمایش داده شده بعدی بروید

Ctrl + a → Tab

پنجره نمایش داده شده را به جلو یا عقب تغییر دهید

Ctrl + a → n یا p

تغییر نام پنجره فعلی

Ctrl + a → 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 متشکل از دو گره داریم که توسط این نمودار توپولوژی نشان داده شده است:

otcodelab_top01C_2nodes.png

نمودارهای توپولوژی

همانطور که در بقیه Codelab کار می کنید ، هر زمان وضعیت شبکه تغییر کند ، یک نمودار توپولوژی Thread جدید نشان خواهیم داد. نقش های گره به شرح زیر مشخص می شوند:

b75a527be4563215.png

روترها همیشه پنج ضلعی هستند و دستگاه های 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 به عنوان یک دستگاه پایان (کودک) به شبکه متصل شده است. در اینجا توپولوژی به روز شده ما است:

otcodelab_top01C_ed01.png

دستگاه های 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 نیز تغییر می کند.

otcodelab_top01C.png

وضعیت جدید و RLOC16 را در FTD Joiner تأیید کنید :

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

FTD Joiner را پایین بیاورید

با پایین آوردن دستی FTD Joiner از روتر به دستگاه آخر ، می توانید این رفتار را آزمایش کنید. حالت را به فرزند تغییر دهید و RLOC16 را بررسی کنید:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

دوباره به کمیساریای 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 .

otcodelab_top01C.png

رهبر را بردارید

رهبر در میان تمام روترهای موضوعی خود انتخاب می شود. این بدان معنی است که اگر 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

otcodelab_top02C_01.png

میز کودک را بررسی کنید. توجه داشته باشید که یک 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

otcodelab_top02C_02.png

شبکه 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

محدوده

تحویل به

ff02::1

پیوند-محلی

همه FTD ها و MED ها

ff02::2

پیوند-محلی

همه FTD ها و مسیریاب ها

ff03::1

مش-محلی

همه FTD ها و MED ها

ff03::2

مش-محلی

تمام 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 می تواند با یک هاپ به آن دسترسی پیدا کند.

otcodelab_top02C_02_LL.png

در حال حاضر 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 است.

otcodelab_top02C_02_LL02.png

این بدان معنی است که اتصال دهنده 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 مشترک می شود.

otcodelab_top02C_02_ML.png

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

otcodelab_top02C_02_LL02.png

به زمان پاسخگویی 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 فیزیکی ایجاد کرده اید!

b915c433e7027cc7.png

اکنون می دانید:

  • تفاوت بین انواع دستگاه Thread ، نقش ها و محدوده ها
  • چگونه دستگاه های Thread وضعیت های خود را در داخل شبکه مدیریت می کنند
  • نحوه ارسال پیام های ساده بین گره ها با استفاده از UDP

مراحل بعدی

با استفاده از این Codelab ، تمرینات زیر را امتحان کنید:

  • صفحه FTD Joiner را به عنوان MTD با استفاده از باینری ot-cli-mtd و مشاهده کنید که هرگز خودش را به روتر ارتقا نمی دهد و نمی خواهد رهبر شود
  • دستگاه های بیشتری اضافه کنید (یک سیستم عامل دیگر را امتحان کنید!) به شبکه و طراحی توپولوژی با استفاده از روتر و جداول کودک ، همراه با پینگ به آدرس های چندپخشی
  • برای کنترل NCP از pyspinel استفاده کنید
  • با استفاده از OpenThread Border Router NCP را به یک مسیریاب Border تبدیل کنید و شبکه Thread خود را به اینترنت وصل کنید

بیشتر خواندن

openthread.io و GitHub را برای انواع منابع OpenThread از جمله:

ارجاع: