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

1. מבוא

26b7f4f6b3ea0700.png

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

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

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

Espressif_hardware_setup.jpg

מה תלמדו

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

מה הדרישות כדי להצטרף לתוכנית?

חומרה:

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

תוכנה:

2. איך מתחילים

  1. התקנת ESP-IDF.

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

  1. שכפול ה-SDK של נתב שרשורי שרשורים של ESP.

ESP-THREAD-BR הוא ה-SDK הרשמי של 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>

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

$ idf.py menuconfig

תצורת רכיב > OpenThread > הפעלת מחבר, ואז build ו-Flash.

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

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

אפשר להפעיל את תכונת הנציב דרך התפריטconfig:

$ idf.py menuconfig

'תצורת רכיב' > 'OpenThread' > 'הפעלה של Commissioner', ולאחר מכן build ו-Flash.

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

4. יצירה של רשת Thread בנתב של Thread Border

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

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

## 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 Connectorer. מתחילים את תפקיד האיחוד עם אישור ההצטרפות שהגדרתם עכשיו ב-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

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

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

קריאה נוספת

אתם מוזמנים להיעזר ב-openthread.io וב-GitHub כדי למצוא מגוון משאבי OpenThread, כולל:

עיון: