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

1. מבוא

26b7f4f6b3ea0700.png

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

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

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

Espressif_hardware_setup.jpg

מה תלמדו

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

הדרישות

חומרה:

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

תוכנה:

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

  1. התקנה של ESP-IDF.

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

  1. משכפלים את ESP Thread Border Router SDK.

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

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

3. בנייה והעברה

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

Component config > OpenThread > Enable Joiner, then build and flash.

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

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

Component config > OpenThread > Enable Commissioner, then build and flash.

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

4. יצירת רשת Thread בנתב גבולות לרשת Thread

עכשיו אפשר ליצור רשת Thread באמצעות שורת הפקודה OpenThread בלוח נתב גבולות לרשת Thread של ESP (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 באמצעות networkkey

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

מקבלים את networkkey מ-BR:

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

מגדירים את networkkey בלוח 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

מגדירים את התפקיד כ-Mesh Extender (שנקרא router ב-CLI ובלוגים).

> 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

מגדירים את פרטי הרשת בלוח 2:

## 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, מפעילים את ה-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 שנוצרה על ידי BR Commissioner.

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

מגדירים את התפקיד כ-Mesh Extender (שנקרא router ב-CLI ובלוגים).

> 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, מבצעים bind ליציאה 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, כולל:

  • פלטפורמות נתמכות – רשימה של כל הפלטפורמות שתומכות ב-OpenThread
  • Build OpenThread – פרטים נוספים על יצירה והגדרה של OpenThread
  • Thread Primer – סקירה של כל המושגים שקשורים ל-Thread ומופיעים ב-Codelab הזה

הפניה: