با بردهای nRF52840 و OpenThread یک شبکه Thread بسازید

1. معرفی

26b7f4f6b3ea0700.png

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

4806d16a8c137c6d.jpeg

چیزی که یاد خواهید گرفت

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

a6693da3ce213856.png

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

20a3b4b480356447.png

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

$ ls /dev/ttyACM*
/dev/ttyACM0

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

c00d519ebec7e5f0.jpeg

به محل 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 قرار دهید.

46e7b670d2464842.png

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

c00d519ebec7e5f0.jpeg

به محل 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 قرار دهید.

46e7b670d2464842.png

ساخت را تأیید کنید

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

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

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

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

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

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

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

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

مجدداً به جلسه صفحه (از خط فرمان) پیوست کنید

screen -r

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

Ctrl+a → d

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

Ctrl+a → c

در همان جلسه Screen بین پنجره ها سوئیچ کنید

Ctrl+a → n (به جلو)Ctrl+a → p (پشت)

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

Ctrl+a → k

تقسیم صفحه

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

f1cbf1258cf0a5a.png

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

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

$ screen -r

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

  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 خارج شوید، و آنها را در پنجره های جدید Screen راه اندازی مجدد کنید (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 از خط فرمان دوباره آن را وصل کنید.

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

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

otcodelab_top01C_2nodes.png

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

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

b75a527be4563215.png

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

otcodelab_top01C_ed01.png

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

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 ، 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 برمی گردد.

otcodelab_top01C.png

رهبر را حذف کنید

رهبر از بین همه مسیریاب‌های 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

otcodelab_top02C_01.png

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

otcodelab_top02C_02.png

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

محدوده

تحویل به

ff02::1

پیوند-محلی

همه FTD ها و MED ها

ff02::2

پیوند-محلی

همه FTD ها و روترهای مرزی

ff03::1

مش-محلی

همه FTD ها و MED ها

ff03::2

مش-محلی

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

otcodelab_top02C_02_LL.png

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

otcodelab_top02C_02_LL02.png

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

otcodelab_top02C_02_ML.png

پینگ 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

otcodelab_top02C_02_LL02.png

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

b915c433e7027cc7.png

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

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

مراحل بعدی

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

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

بیشتر خواندن

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

ارجاع: