יצירת רשת Thread בעזרת ה-ESP32H2 וה-ESP Thread Border Board

1. מבוא

26b7f4f6b3ea0700.png

OpenThread, שהושק על ידי צוות Google Nest, הוא הטמעת קוד פתוח של פרוטוקול הרשת Thread®, שמיועד לזרז את הפיתוח של מוצרים לבית המחובר. מפרט פרוטוקול ה-Thread מגדיר פרוטוקול תקשורת אלחוטי, אמין ומבוסס-IPv6, בין מכשירים לבית או לבניינים מסחריים.

חברת Espressif ביצעה העברה של סטאק OpenThread שמבוסס על FreeRTOS ו-LwIP, וכך המפתחים יכולים לפתח במהירות רשתות בפרוטוקול Thread. אפשר לקבל את קוד המקור הקשור מ-GitHub. במקביל, ב-Espressif הטמיעו גם נתב Thread Border (נתב גבול של שרשורים) שמבוסס על RTOS.

ב-Codelab הזה אפשר לתכנת OpenThread בחומרה אמיתית, ליצור ולנהל רשת בפרוטוקול Thread ולהעביר הודעות בין צמתים.

Espressif_hardware_setup.jpg

מה תלמדו

  • פיתוח קבצים בינאריים של OpenThread CLI והבהובים ללוחות ESP.
  • נתב גבולות מהבהבים ללוח נתב Thread של ESP.
  • ניהול ידני של צומתי Thread באמצעות צג ESP ו-CLI של OpenThread.
  • יצירת רשת פרוטוקול Thread בנתב Thread Border
  • אבטחת מכשירים ברשת בפרוטוקול Thread.
  • הצמדה של כתובת IPv6 בין צמתים של פרוטוקולי Thread.
  • העברת הודעות בין צומתי Thread באמצעות UDP.

למה תזדקק?

חומרה:

  • 2 לוחות ESP עם מודולי IEEE 802.15.4.
  • 1 לוח נתב מסוג Thread של Thread של ESP.

תוכנה:

2. תחילת העבודה

  1. התקנת ESP-IDF.

כדי להתקין את סביבת פיתוח התוכנה, צריך לפעול לפי ההוראות במדריך התכנות ESP-IDF.

  1. שכפול ה-SDK של ESP Thread Border Router Router.

ESP-THREAD-BR הוא ה-SDK הרשמי של ESP Thread Border Router Router. הוא תומך בכל תכונות הרשת הבסיסיות כדי לפתח נתב Thread כולל תכונות מתקדמות ברמת המוצר, כדי לאפשר מוצר מהיר למוצר.

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

3. יצירה ו-Flash

כדי לבנות ולהריץ את הקובץ הבינארי 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>

הפעלת תכונת הצירוף דרך menuconfig:

$ idf.py menuconfig

הגדרת הרכיב > OpenThread > מפעילים את Joiner ואז מפתחים ו-Flash.

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

כדי ליצור ולהריץ את הקובץ הבינארי ot-br ב-ESP Thread Border Router Board, יש ליצור קודם את הקובץ הבינארי של RCP. אין צורך להבהב במפורש את קובץ ה-RCP הבינארי הזה למכשיר ב-ESP Thread Router Board. הוא ייכלל בקובץ הבינארי של 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 ואז יוצרים ו-Flash.

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

4. יצירת רשת בפרוטוקול Thread בנתב Thread Border

עכשיו אפשר ליצור רשת פרוטוקול Thread באמצעות שורת הפקודה OpenThread ב-ESP Thread Router Router Board (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:

> 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 דרך מפתח רשת

ב-Codelab הזה, שני לוחות ESP עם מודולים של IEEE 802.15.4 מוכנים להצטרפות לרשת ה-BR שנוצרה. בסשן הזה, נוסיף את Board1 לרשת.

משיגים את מפתח הרשת מברזיל:

## 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

מגדירים את התפקיד כ'נתב'.

> 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. פרטי הכניסה להצטרפות הם מחרוזת ספציפית למכשיר שכוללת את כל התווים האלפאנומריים באותיות רישיות (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 Joiner. מתחילים את תפקיד ההצטרפות עם פרטי הכניסה שהגדרתם כרגע ב-BR Commissioner:

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

תוך כדקה תקבלו אישור לכך שהאימות בוצע בהצלחה:

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

לאחר מכן, תוכלו להתחיל להצטרף לרשת בפרוטוקול Thread שנוצר על ידי הנציב בברזיל.

התחלת פעולה של פרוטוקול 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

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.
  • ניהול ידני של צומתי Thread באמצעות צג ESP ו-CLI של OpenThread.
  • יצירת רשת פרוטוקול Thread בנתב Thread Border
  • אבטחת מכשירים ברשת בפרוטוקול Thread.
  • הצמדה של כתובת IPv6 בין צמתים של פרוטוקולי Thread.
  • העברת הודעות בין צומתי Thread באמצעות UDP.

קריאה נוספת

ב-openthread.io וב-GitHub יש מגוון משאבים ב-OpenThread, כולל:

הפניה: