1. מבוא
OpenThread, שהושק על ידי צוות Google Nest, הוא הטמעת קוד פתוח של פרוטוקול הרשת Thread®, שמיועד לזרז את הפיתוח של מוצרים לבית המחובר. מפרט פרוטוקול ה-Thread מגדיר פרוטוקול תקשורת אלחוטי, אמין ומבוסס-IPv6, בין מכשירים לבית או לבניינים מסחריים.
חברת Espressif ביצעה העברה של סטאק OpenThread שמבוסס על FreeRTOS ו-LwIP, וכך המפתחים יכולים לפתח במהירות רשתות בפרוטוקול Thread. אפשר לקבל את קוד המקור הקשור מ-GitHub. במקביל, ב-Espressif הטמיעו גם נתב Thread Border (נתב גבול של שרשורים) שמבוסס על RTOS.
ב-Codelab הזה אפשר לתכנת OpenThread בחומרה אמיתית, ליצור ולנהל רשת בפרוטוקול Thread ולהעביר הודעות בין צמתים.
מה תלמדו
- פיתוח קבצים בינאריים של OpenThread CLI והבהובים ללוחות ESP.
- נתב גבולות מהבהבים ללוח נתב Thread של ESP.
- ניהול ידני של צומתי Thread באמצעות צג ESP ו-CLI של OpenThread.
- יצירת רשת פרוטוקול Thread בנתב Thread Border
- אבטחת מכשירים ברשת בפרוטוקול Thread.
- הצמדה של כתובת IPv6 בין צמתים של פרוטוקולי Thread.
- העברת הודעות בין צומתי Thread באמצעות UDP.
למה תזדקק?
חומרה:
תוכנה:
2. תחילת העבודה
- התקנת ESP-IDF.
כדי להתקין את סביבת פיתוח התוכנה, צריך לפעול לפי ההוראות במדריך התכנות ESP-IDF.
- שכפול ה-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 >
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 עם הטופולוגיה הבאה:
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
עכשיו אתם יודעים:
- פיתוח קבצים בינאריים של OpenThread CLI והבהובים ללוחות ESP.
- פיתוח נתב גבול מהבהב ללוח נתב ESP Thread.
- ניהול ידני של צומתי Thread באמצעות צג ESP ו-CLI של OpenThread.
- יצירת רשת פרוטוקול Thread בנתב Thread Border
- אבטחת מכשירים ברשת בפרוטוקול Thread.
- הצמדה של כתובת IPv6 בין צמתים של פרוטוקולי Thread.
- העברת הודעות בין צומתי Thread באמצעות UDP.
קריאה נוספת
ב-openthread.io וב-GitHub יש מגוון משאבים ב-OpenThread, כולל:
- פלטפורמות נתמכות – כאן מופיעות כל הפלטפורמות שתומכות ב-OpenThread
- פיתוח OpenThread – פרטים נוספים על פיתוח והגדרה של OpenThread
- Thread Primer – כל מושגי ה-Thread שמופיעים ב-Codelab הזה
הפניה: