یک شبکه Thread با برد ESP32H2 و ESP Thread Border Router بورد

1. مقدمه

26b7f4f6b3ea0700.png

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

Espressif پشته OpenThread را بر اساس FreeRTOS و LwIP منتقل کرده است و توسعه دهندگان را قادر می سازد تا به سرعت شبکه های Thread را بسازند. کد منبع مرتبط را می توان از GitHub دریافت کرد. در همان زمان، Espressif همچنین یک Thread Border Router مبتنی بر RTOS را پیاده سازی کرده است.

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

Espressif_hardware_setup.jpg

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

  • ساخت و چشمک زدن باینری های OpenThread CLI روی بردهای ESP.
  • ساخت و چشمک زدن روتر مرزی به برد ESP Thread Border Router.
  • مدیریت دستی گره های Thread با مانیتور ESP و OpenThread CLI.
  • تشکیل شبکه Thread روی Thread Border Router.
  • ایمن سازی راه اندازی دستگاه ها در شبکه Thread.
  • پینگ کردن آدرس IPv6 بین گره های Thread.
  • ارسال پیام بین گره های Thread با UDP.

آنچه شما نیاز دارید

سخت افزار:

  • 2 برد ESP با ماژول های IEEE 802.15.4.
  • 1 برد ESP Thread Border Router Board.

نرم افزار:

2. شروع به کار

  1. نصب ESP-IDF.

لطفاً راهنمای برنامه نویسی ESP-IDF را برای نصب محیط توسعه نرم افزار دنبال کنید.

  1. 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
> 

esp_ot_tp_LR.jpg

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

esp_ot_tp_LRR.jpg

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 ایجاد کرده اید!

esp_ot_final_topology.jpg

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

  • ساخت و چشمک زدن باینری های OpenThread CLI روی بردهای ESP.
  • ساخت یک روتر مرزی چشمک زن به برد ESP Thread Border Router.
  • مدیریت دستی گره های Thread با مانیتور ESP و OpenThread CLI.
  • تشکیل شبکه Thread روی Thread Border Router.
  • ایمن سازی راه اندازی دستگاه ها در شبکه Thread.
  • پینگ کردن آدرس IPv6 بین گره های Thread.
  • ارسال پیام بین گره های Thread با UDP.

در ادامه مطلب

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

مرجع: