1. مقدمه
OpenThread که توسط تیم Google Nest منتشر شده است، یک پیاده سازی متن باز از پروتکل شبکه Thread® است که برای تسریع در توسعه محصولات برای خانه متصل طراحی شده است. Thread Specification یک پروتکل ارتباطی دستگاه به دستگاه بی سیم قابل اعتماد، ایمن و کم مصرف مبتنی بر IPv6 را برای کاربردهای خانگی و ساختمان های تجاری تعریف می کند.
Espressif پشته OpenThread را بر اساس FreeRTOS و LwIP منتقل کرده است و توسعه دهندگان را قادر می سازد تا به سرعت شبکه های Thread را بسازند. کد منبع مرتبط را می توان از GitHub دریافت کرد. در همان زمان، Espressif همچنین یک Thread Border Router مبتنی بر RTOS را پیاده سازی کرده است.
در این Codelab، OpenThread را روی سخت افزار واقعی برنامه ریزی می کنید، شبکه Thread را ایجاد و مدیریت می کنید و پیام ها را بین گره ها ارسال می کنید.
چیزی که یاد خواهید گرفت
- ساخت و چشمک زدن باینری های OpenThread CLI روی بردهای ESP.
- ساخت و چشمک زدن روتر مرزی به برد ESP Thread Border Router.
- مدیریت دستی گره های Thread با مانیتور ESP و OpenThread CLI.
- تشکیل شبکه Thread روی Thread Border Router.
- ایمن سازی راه اندازی دستگاه ها در شبکه Thread.
- پینگ کردن آدرس IPv6 بین گره های Thread.
- ارسال پیام بین گره های Thread با UDP.
آنچه شما نیاز دارید
سخت افزار:
نرم افزار:
- ESP-IDF .
- ESP-THREAD-BR .
2. شروع به کار
- نصب ESP-IDF.
لطفاً راهنمای برنامه نویسی ESP-IDF را برای نصب محیط توسعه نرم افزار دنبال کنید.
- ESP Thread Border Router SDK را کلون کنید.
ESP-THREAD-BR رسمی ESP Thread Border Router SDK است. از تمام ویژگی های شبکه اصلی برای ساخت Thread Border Router پشتیبانی می کند و ویژگی های سطح محصول غنی را برای تولید سریع یکپارچه می کند.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. ساخت و فلش
برای ساخت و فلش کردن فایل باینری ot-cli-ftd روی بردهای ESP با ماژول های IEEE 802.15.4، می توانید برای جزئیات بیشتر به مثال ESP-IDF ot_cli مراجعه کنید:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
ویژگی Joiner را از طریق menuconfig فعال کنید:
$ idf.py menuconfig
Component config > OpenThread > Enable Joiner، سپس build و فلش کنید.
$ idf.py -p <your-local-port> build flash monitor
برای ساخت و فلش کردن فایل باینری ot-br در ESP Thread Border Router Board، ابتدا باید فایل باینری RCP را بسازید. این فایل باینری RCP نیازی به فلش صراحتاً روی دستگاه در ESP Thread Border Router Board ندارد. در فایل باینری 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
Component config > OpenThread > Enable Commissioner، سپس build و فلش کنید.
$ idf.py -p <your-local-port> build flash monitor
4. تشکیل شبکه Thread بر روی Thread Border Router
اکنون می توانید با استفاده از خط فرمان OpenThread در ESP Thread Border Router Board (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
پس از یک لحظه، وضعیت دستگاه را بررسی کنید. باید رهبر باشد.
> state leader Done >
5. از طریق networkkey به شبکه Thread بپیوندید
در این کد لبه دو برد ESP با ماژول های IEEE 802.15.4 برای پیوستن به شبکه تشکیل شده BR آماده شده است. در این جلسه Board1 را به شبکه اضافه می کنیم.
کلید شبکه را از 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
پس از یک لحظه، وضعیت دستگاه را بررسی کنید. باید کودک باشد.
> state child Done
نقش را روی Router قرار دهید.
> 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 >
6. از طریق راه اندازی ایمن به شبکه Thread بپیوندید
در این جلسه، Board2 را از طریق راه اندازی امنیتی به شبکه اضافه می کنیم:
PSKc و panid را از BR Commissioner دریافت کنید:
## 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، برای مثال 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 بروید. نقش وصال را با اعتبار وصال که به تازگی در کمیسیونر BR تنظیم کرده اید، شروع کنید:
## 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
نقش را روی Router قرار دهید.
> 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 با توپولوژی نشان داده شده در زیر دریافت می کنید:
7. پینگ کردن آدرس 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
8. ارسال پیام بین گره های 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
9. تبریک می گویم!
شما یک شبکه Thread فیزیکی با استفاده از تابلوهای ESP ایجاد کرده اید!
اکنون می دانید:
- ساخت و چشمک زدن باینری های OpenThread CLI روی بردهای ESP.
- ساخت یک روتر مرزی چشمک زن به برد ESP Thread Border Router.
- مدیریت دستی گره های Thread با مانیتور ESP و OpenThread CLI.
- تشکیل شبکه Thread روی Thread Border Router.
- ایمن سازی راه اندازی دستگاه ها در شبکه Thread.
- پینگ کردن آدرس IPv6 بین گره های Thread.
- ارسال پیام بین گره های Thread با UDP.
در ادامه مطلب
برای انواع منابع OpenThread از جمله: openthread.io و GitHub را بررسی کنید:
- پلتفرم های پشتیبانی شده - تمام پلتفرم هایی که از OpenThread پشتیبانی می کنند را کشف کنید
- ساخت OpenThread - جزئیات بیشتر در مورد ساخت و پیکربندی OpenThread
- Thread Primer - تمام مفاهیم Thread که در این Codelab وجود دارد را پوشش می دهد
مرجع: