۱. مقدمه

OpenThread که توسط تیم Google Nest منتشر شده است، یک پیادهسازی متنباز از پروتکل شبکه Thread® است که برای تسریع توسعه محصولات برای خانههای متصل طراحی شده است. مشخصات Thread یک پروتکل ارتباطی بیسیم دستگاه به دستگاه مبتنی بر IPv6، قابل اعتماد، ایمن و کممصرف را برای برنامههای کاربردی ساختمانهای خانگی و تجاری تعریف میکند.
Espressif پشته OpenThread را بر اساس FreeRTOS و LwIP پورت کرده است و به توسعهدهندگان امکان میدهد تا به سرعت شبکههای Thread را بسازند. کد منبع مرتبط را میتوان از GitHub دریافت کرد. در عین حال، Espressif یک مسیریاب حاشیهای Thread را نیز بر اساس RTOS پیادهسازی کرده است.
در این Codelab، شما OpenThread را روی سختافزار واقعی برنامهنویسی خواهید کرد، یک شبکه Thread ایجاد و مدیریت خواهید کرد و پیامها را بین گرهها رد و بدل خواهید کرد.

آنچه یاد خواهید گرفت
- ساخت و فلش کردن فایلهای باینری OpenThread CLI روی بردهای ESP.
- ساخت و فلش کردن روتر مرزی به برد روتر مرزی Thread ESP.
- مدیریت دستی گرههای Thread با ESP Monitor و OpenThread CLI.
- تشکیل یک شبکه Thread روی روتر Thread Border.
- ایمنسازی راهاندازی دستگاهها بر روی یک شبکه Thread.
- پینگ کردن آدرس IPv6 بین گرههای Thread.
- انتقال پیام بین گرههای Thread با UDP.
آنچه نیاز دارید
سختافزار:
نرمافزار:
۲. شروع کار
- نصب ESP-IDF.
لطفاً برای نصب محیط توسعه نرمافزار ، راهنمای برنامهنویسی ESP-IDF را دنبال کنید.
- SDK روتر ESP Thread Border Router را کلون کنید.
ESP-THREAD-BR کیت توسعه نرمافزار رسمی ESP Thread Border Router است. این کیت از تمام ویژگیهای اساسی شبکه برای ساخت یک Thread Border Router پشتیبانی میکند و ویژگیهای غنی سطح محصول را برای تولید سریع ادغام میکند.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
۳. ساخت و فلش کردن
برای ساخت و فلش کردن فایل باینری ot-cli-ftd روی بردهای ESP با ماژولهای IEEE 802.15.4، میتوانید برای جزئیات بیشتر به مثال ot_cli مربوط به ESP-IDF مراجعه کنید:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
فعال کردن قابلیت Joiner از طریق menuconfig:
$ idf.py menuconfig
پیکربندی کامپوننت > OpenThread > فعال کردن Joiner، سپس ساخت و فلش کردن.
$ idf.py -p <your-local-port> build flash monitor
برای ساخت و فلش کردن فایل باینری ot-br روی برد روتر ESP Thread Border، ابتدا باید فایل باینری RCP را بسازید. این فایل باینری RCP نیازی به فلش کردن صریح روی دستگاه روی برد روتر ESP Thread Border ندارد. این فایل در فایل باینری Border Router قرار میگیرد و پس از اولین بوت (یا تغییر فریمور RCP) روی تراشه ESP32-H2 فلش میشود. برای جزئیات بیشتر میتوانید به مستندات ESP Thread BR مراجعه کنید:
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
ویژگی کمیسیونر را از طریق menuconfig فعال کنید:
$ idf.py menuconfig
پیکربندی کامپوننت > OpenThread > فعال کردن کمیسر، سپس ساخت و فلش.
$ idf.py -p <your-local-port> build flash monitor
۴. تشکیل یک شبکه Thread روی روتر Thread Border
اکنون میتوانید با استفاده از خط فرمان OpenThread در برد روتر ESP Thread Border (BR Commissioner) یک شبکه Thread تشکیل دهید:
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:
> dataset commit active Done
رابط IPv6 را اجرا کنید:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
شروع عملیات پروتکل Thread:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
بعد از لحظهای، وضعیت دستگاه را بررسی کنید. باید در حالت Leader باشد.
> state leader Done >
۵. از طریق networkkey به شبکه Thread بپیوندید
در این کدلب، دو برد ESP با ماژول IEEE 802.15.4 برای اتصال به شبکه تشکیل شده BR آماده شدهاند. در این جلسه، برد شماره ۱ را به شبکه اضافه خواهیم کرد.
کلید شبکه را از BR دریافت کنید:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
این کلید شبکه را روی یک برد ESP (Board1 Joiner) با ماژولهای IEEE 802.15.4 تنظیم کنید:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:
> dataset commit active Done
رابط IPv6 را اجرا کنید:
> ifconfig up Done I (20308) OT_STATE: netif up
شروع عملیات پروتکل Thread:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
بعد از لحظهای، وضعیت دستگاه را بررسی کنید. باید دستگاه Child باشد.
> state child Done
نقش را روی روتر تنظیم کنید.
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >

۶. از طریق راهاندازی امن به شبکه Thread بپیوندید
در این جلسه، Board2 را از طریق راهاندازی امنیتی به شبکه اضافه خواهیم کرد:
PSKc و panid را از کمیسر BR دریافت کنید:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
اطلاعات شبکه را روی Board2 پیکربندی کنید:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
این مجموعه داده را به عنوان مجموعه داده فعال ثبت کنید:
## Board2 Joiner ## ---------------------- > dataset commit active Done
رابط IPv6 را اجرا کنید:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
دریافت eui64 از Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
در BR Commissioner ، آن را اجرا کنید و eui64 دستگاهی که میتواند به آن بپیوندد را به همراه Joiner Credential، مثلاً J01NME ، مشخص کنید. Joiner Credential یک رشته مختص دستگاه است که از تمام کاراکترهای حروف بزرگ و عددی (0-9 و AY، به جز I، O، Q و Z برای خوانایی) با طول بین 6 تا 32 کاراکتر تشکیل شده است.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
به Board2 Joiner بروید. نقش Joiner را با اعتبارنامه Joiner که اخیراً در BR Commissioner تنظیم کردهاید، شروع کنید:
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
ظرف یک دقیقه یا بیشتر، تأیید احراز هویت موفقیتآمیز را دریافت میکنید:
## Board2 Joiner ## ---------------------- > Join success
پس از آن، میتوانید شبکه Thread را که توسط کمیسر BR تشکیل شده است، راهاندازی و به آن بپیوندید.
شروع عملیات پروتکل Thread:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
نقش را روی روتر تنظیم کنید.
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
اکنون یک شبکه Thread با توپولوژی نشان داده شده در زیر دریافت میکنید:

۷. پینگ کردن آدرس IPv6 بین گرههای Thread
شما میتوانید از دستور ping برای برقراری ارتباط بین هر دو برد استفاده کنید. از دستور ipaddr برای چاپ آدرس IPv6 هر برد استفاده کنید:
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
برای مثال، برای پینگ کردن Board2 MLE-ID از BR Commissioner، میتوانید این دستور را در BR Commissioner اجرا کنید:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
۸. ارسال پیام بین گرههای Thread با UDP
در این جلسه، شما یاد خواهید گرفت که چگونه بین دو دستگاه Thread پیام ارسال کنید. به عنوان مثال، udp را باز کنید و آن را روی پورت 20617 متصل کنید و به تمام آدرسهای روی BR گوش دهید:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
سپس یک پیام از Board1 به آدرس BR MLE-ID و پورت 20617 ارسال کنید:
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
میتوانید پیام دریافتی را در BR مشاهده کنید:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
۹. تبریک میگویم!
شما با استفاده از بردهای ESP یک شبکه فیزیکی Thread ایجاد کردهاید!

حالا میدانید:
- ساخت و فلش کردن فایلهای باینری OpenThread CLI روی بردهای ESP.
- ساخت یک روتر مرزی چشمک زن به برد روتر مرزی نخ ESP.
- مدیریت دستی گرههای Thread با ESP Monitor و OpenThread CLI.
- تشکیل یک شبکه Thread روی روتر Thread Border.
- ایمنسازی راهاندازی دستگاهها بر روی یک شبکه Thread.
- پینگ کردن آدرس IPv6 بین گرههای Thread.
- انتقال پیام بین گرههای Thread با UDP.
مطالعه بیشتر
برای دسترسی به منابع متنوع OpenThread، از جمله موارد زیر، به openthread.io و GitHub مراجعه کنید:
- پلتفرمهای پشتیبانیشده - تمام پلتفرمهایی که از OpenThread پشتیبانی میکنند را کشف کنید
- ساخت OpenThread — جزئیات بیشتر در مورد ساخت و پیکربندی OpenThread
- مقدمهای بر نخ - تمام مفاهیم نخ ارائه شده در این Codelab را پوشش میدهد
مرجع: