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

۱. مقدمه

۲۶b7f4f6b3ea0700.png

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

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

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

تنظیمات_سخت‌افزار_اسپرسیف.jpg

آنچه یاد خواهید گرفت

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

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

سخت‌افزار:

  • ۲ برد ESP با ماژول‌های IEEE 802.15.4.
  • ۱ برد روتر حاشیه‌ای نخ ESP.

نرم‌افزار:

۲. شروع کار

  1. نصب ESP-IDF.

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

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

esp_ot_tp_LR.jpg

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

esp_ot_tp_LRR.jpg

۷. پینگ کردن آدرس 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 ایجاد کرده‌اید!

esp_ot_final_topology.jpg

حالا می‌دانید:

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

مطالعه بیشتر

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

مرجع: