1. מבוא

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

מה תלמדו
- בנייה והעברה של קבצים בינאריים של OpenThread CLI ללוחות ESP.
- בנייה והעברה של נתב גבולות ללוח ESP Thread Border Router.
- ניהול ידני של צמתי Thread באמצעות ESP Monitor ו-OpenThread CLI.
- יצירת רשת בפרוטוקול Thread בנתב הגבולות של Thread.
- אבטחת ההפעלה של מכשירים ברשת Thread.
- שליחת פינג לכתובת IPv6 בין צמתי Thread.
- העברת הודעות בין צמתי Thread באמצעות UDP.
הדרישות
חומרה:
תוכנה:
2. תחילת העבודה
- התקנה של ESP-IDF.
כדי להתקין את סביבת פיתוח התוכנה, צריך לפעול לפי מדריך התכנות ESP-IDF.
- משכפלים את 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, צריך קודם ליצור את קובץ ה-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, ואז מבצעים build ו-flash.
$ 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:
> 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
מגדירים את התפקיד כנתב.
> 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
מגדירים את פרטי הרשת בלוח 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:
## 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
מגדירים את התפקיד כנתב.
> 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 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 הזה
הפניה: