إنشاء شبكة Thread باستخدام لوح توجيه الحدود ESP32H2 وESP Thread

‫1. مقدمة

26b7f4f6b3ea0700.png

OpenThread، الذي أطلقه فريق Google Nest، هو تطبيق مفتوح المصدر لبروتوكول الشبكة Thread® المصمّم لتسريع تطوير المنتجات للمنزل المتصل. يحدّد مواصفات Thread بروتوكول اتصال لاسلكي موثوق وآمن ومنخفض الطاقة بين الأجهزة يستند إلى IPv6 لتطبيقات المنازل والمباني التجارية.

نقلت شركة Espressif حزمة OpenThread استنادًا إلى FreeRTOS وLwIP، ما يتيح للمطوّرين إنشاء شبكات Thread بسرعة. يمكن الحصول على الرمز المصدر ذي الصلة من GitHub. في الوقت نفسه، نفّذت شركة Espressif أيضًا جهاز توجيه حدود شبكة Thread استنادًا إلى نظام التشغيل في الوقت الفعلي.

في هذا الدرس التطبيقي حول الترميز، ستبرمِج OpenThread على أجهزة فعلية، وتنشئ شبكة Thread وتديرها، وتتبادل الرسائل بين العُقد.

Espressif_hardware_setup.jpg

أهداف الدورة التعليمية

  • إنشاء وتثبيت ثنائيات OpenThread CLI على لوحات ESP
  • إنشاء جهاز توجيه الحدود وتثبيت البرامج عليه في لوحة ESP Thread Border Router
  • إدارة عُقد Thread يدويًا باستخدام ESP Monitor وOpenThread CLI
  • إنشاء شبكة Thread على جهاز توجيه حدود شبكة Thread
  • تأمين عملية إعداد الأجهزة على شبكة Thread
  • إرسال طلبات اختبار الاتصال إلى عنوان IPv6 بين عُقد Thread
  • تمرير الرسائل بين عُقد Thread باستخدام بروتوكول UDP

المتطلبات

الأجهزة:

  • لوحتا ESP مزوّدتان بوحدات IEEE 802.15.4
  • لوحة جهاز توجيه حدود شبكة Thread واحد من نوع ESP

البرامج:

‫2. الخطوات الأولى

  1. تثبيت ESP-IDF

يُرجى اتّباع دليل برمجة ESP-IDF لتثبيت بيئة تطوير البرامج.

  1. استنسِخ حزمة تطوير البرامج (SDK) لجهاز توجيه حدود شبكة ESP Thread.

ESP-THREAD-BR هي حزمة تطوير البرامج (SDK) الرسمية لجهاز توجيه حدود شبكة Thread من ESP. يتوافق مع جميع ميزات الشبكة الأساسية لإنشاء جهاز توجيه حدودي لشبكة Thread، ويتضمّن ميزات غنية على مستوى المنتج لتسريع عملية طرح المنتج.

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

3- إنشاء وتثبيت ذاكرة ROM

لإنشاء ملف 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>

فعِّل ميزة "الدمج" من خلال menuconfig:

$ idf.py menuconfig

إعدادات المكوّن > OpenThread > تفعيل Joiner، ثم إنشاء وتثبيت.

$ idf.py -p <your-local-port> build flash monitor

لإنشاء ملف ot-br الثنائي وتثبيته على لوحة توجيه الحدود ESP Thread، عليك أولاً إنشاء ملف RCP الثنائي. لا يلزم تثبيت ملف RCP الثنائي هذا بشكل صريح على الجهاز على لوحة جهاز توجيه الحدود ESP Thread. سيتم تضمينها في ملف Border Router الثنائي وتثبيتها على شريحة ESP32-H2 عند التشغيل الأول (أو عند تغيير البرامج الثابتة لبروتوكول RCP). يمكنك الرجوع إلى مستندات 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 > تفعيل Commissioner، ثم إنشاء وتثبيت.

$ idf.py -p <your-local-port> build flash monitor

4. إنشاء شبكة Thread على جهاز توجيه حدود شبكة Thread

يمكنك الآن إنشاء شبكة Thread باستخدام سطر أوامر OpenThread على لوحة ESP Thread Border Router (BR Commissioner):

## 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 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. الانضمام إلى شبكة Thread من خلال networkkey

في هذا الدرس العملي، يتم إعداد لوحَين من ESP مزوَّدَين بوحدات IEEE 802.15.4 للانضمام إلى الشبكة التي تم إنشاؤها باستخدام BR. في هذه الجلسة، سنضيف Board1 إلى الشبكة.

احصل على مفتاح الشبكة من BR:

## BR Commissioner ##
----------------------
> networkkey
731ab6a60a64a0a0b14b259b86b2be01
Done
> 

اضبط مفتاح الشبكة هذا على لوحة ESP واحدة (لوحة الانضمام 1) مع وحدات 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 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

اضبط الدور على "جهاز توجيه".

> 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 للجهاز الذي يمكنه الانضمام، بالإضافة إلى بيانات اعتماد الجهاز الذي يريد الانضمام، مثل J01NME. بيانات اعتماد Joiner هي سلسلة خاصة بالجهاز تتألف من أحرف أبجدية رقمية كبيرة (من 0 إلى 9 ومن A إلى Y، باستثناء I وO وQ وZ لتسهيل القراءة)، ويتراوح طولها بين 6 و32 حرفًا.

## BR Commissioner ##
----------------------
> commissioner start
Commissioner: petitioning
Done
Commissioner: active
> commissioner joiner add 4831b7fffec02be1 J01NME
Done

انتقِل إلى أداة الانضمام إلى Board2. ابدأ دور "المشارك" باستخدام بيانات اعتماد "المشارك" التي أعددتها للتو على "مفوض BR":

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

في غضون دقيقة أو نحو ذلك، ستتلقّى تأكيدًا على نجاح عملية المصادقة:

## Board2 Joiner ##
----------------------
>
Join success

بعد ذلك، يمكنك بدء شبكة Thread والانضمام إليها التي أنشأها BR Commissioner.

عملية بروتوكول بدء سلسلة المحادثات:

> 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

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
  • إنشاء جهاز توجيه حدود شبكة Thread لتثبيت برنامج ESP Thread Border Router
  • إدارة عُقد Thread يدويًا باستخدام ESP Monitor وOpenThread CLI
  • إنشاء شبكة Thread على جهاز توجيه حدود شبكة Thread
  • تأمين عملية إعداد الأجهزة على شبكة Thread
  • إرسال طلبات اختبار الاتصال إلى عنوان IPv6 بين عُقد Thread
  • تمرير الرسائل بين عُقد Thread باستخدام بروتوكول UDP

محتوى إضافي للقراءة

يمكنك الاطّلاع على openthread.io وGitHub للحصول على مجموعة متنوعة من مراجع OpenThread، بما في ذلك:

مرجع: