הדמיית רשת Thread עם OpenThread

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

1. מבוא

26b7f4f6b3ea0700.png

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

מפרט השרשורים מגדיר פרוטוקול תקשורת אלחוטי למכשיר מאובטח, מאובטח ועוצמתי של IPv6 לאפליקציות ביתיות. OpenThread מטמיע את כל שכבות הרשת של Thread, כולל IPv6, 6LoWPAN, IEEE 802.15.4, עם אבטחת MAC, Mesh Link והגדרת ניתוב רשת.

שיעור Lab זה ידריך אתכם בסימולציה של רשת Thread במכשירים מדומים.

מה תלמדו

  • איך מגדירים את כלי היצירה של OpenThread
  • איך לדמות רשת של Thread
  • איך מאמתים צמתים בשרשור
  • איך מנהלים רשת של Thread עם OpenThread Daemon

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

  • Git
  • ידע בסיסי ב-Linux, ניתוב רשת

2. הגדרת מערכת ה-build

Git

יש להזין Git כדי להשלים את ה-Codelab הזה. צריך להוריד ולהתקין אותה לפני שממשיכים.

לאחר ההתקנה, יש לפעול לפי ההוראות של מערכת ההפעלה הספציפית כדי להוריד ולבנות את OpenThread.

XCode ל-Mac OS X

דרוש קוד X כדי להתקין ולבנות OpenThread ב-Mac OS X.

לאחר התקנת XCode, יש להתקין את כלי XCode Command Line:

$ xcode-select --install

התקנה ב-Linux / Mac OS X

הוראות ההתקנה האלה נבדקו ב-Ubuntu Server 14.04 LTS וב-Mac OS X Sierra 10.12.6.

מתקינים את OpenThread. הפקודות של bootstrap עוזרות לוודא שכלי הכלים מותקן ושהסביבה מוגדרת כראוי:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap
$ ./bootstrap

באמצעות Windows

אם אתם מעדיפים את Windows, מומלץ לנסות את גרסת העגינה של ה-Codelab הזה.

3. יצירת האפליקציות של OpenThread

לאחר השלמת ההתקנה, יש לבנות את אפליקציית OpenThread לדוגמה. ב-Codelab הזה אנחנו משתמשים בדוגמה של הסימולציה.

$ cd ~/src/openthread
$ ./script/cmake-build simulation

עכשיו פתחו את OpenThread Daemon:

$ ./script/cmake-build posix -DOT_DAEMON=ON

4. הדמיה של רשת Thread

האפליקציה לדוגמה שבה תשתמשו ב-Codelab הזה מדגימה אפליקציה מינימלית של OpenThread שחושפת את הממשקים של התצורה והניהול של OpenThread דרך ממשק שורת פקודה בסיסי (CLI).

התרגיל הזה כולל את השלבים המינימליים שצריך לבצע כדי לבצע פינג של מכשיר עם שרשור מדומה.

האיור הבא מתאר טופולוגיה בסיסית של רשת Thread. לצורך תרגיל זה, נדגים את שני הצמתים שבעיגול הירוק: מנהיג שרשור ונתב שרשור עם חיבור יחיד.

6e3aa07675f902dc.png

פינג לצומת

1. התחלה של צומת 1

עוברים לספרייה openthread וממשיכים בתהליך ה-CLI של מכשיר מדומה עם שרשור באמצעות ot-cli-ftd.

$ cd ~/src/openthread
$ ./build/simulation/examples/apps/cli/ot-cli-ftd 1

הערה: אם ההודעה > לא מופיעה אחרי שמריצים את הפקודה הזו, מקישים על enter.

הקובץ הבינארי הזה מטמיע מכשיר OpenThread שמדמה מעל POSIX. מנהל התקן הרדיו IEEE 802.15.4 מיושם בחלק העליון של ה-UDP (המסגרות IEEE 802.15.4 מועברות בתוך המטען הייעודי (payload) של ה-UDP).

הארגומנט של 1 הוא מתאר הקובץ שמייצג את הביטים בעלי המשמעות הנמוכה ביותר של "fact-assigned" IEEE EUI-64 עבור המכשיר שמדמה. הערך הזה משמש גם כשמחייבים יציאת UDP לאמולציה של רדיו IEEE 802.15.4 (יציאה = 9000 + מתאר הקובץ). בכל מופע של מכשיר בעל הדמיה של שרשור ב-Codelab הזה ייעשה שימוש במתאר קובץ אחר.

הערה: יש להשתמש במתארי קבצים של 1 או יותר, כפי שמצוין ב-Codelab הזה, במהלך ההרצה של התהליך למכשיר מדומה. מתאר הקובץ של 0 שמור לשימוש אחר.

יוצרים מערך נתונים תפעולי חדש ומחילים אותו כקבוצת הנתונים הפעילה. מערך הנתונים התפעולי הוא התצורה של רשת השרשור שאתה יוצר.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Network Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

הקפידו שמערך הנתונים הזה יהיה פעיל:

> dataset commit active
Done

מציגים את ממשק IPv6:

> ifconfig up
Done

הפעלה של פרוטוקול Thread:

> thread start
Done

ממתינים כמה שניות ומוודאים שהמכשיר הפך למנהל השרשור. המנהיג הוא המכשיר שאחראי לניהול הקצאת מזהה הנתב.

> state
leader
Done

הצגת כתובות ה-IPv6 שהוקצו לממשק השרשור של צומת 1&#39 (הפלט שלך יהיה שונה):

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

שימו לב לסוגים הספציפיים של כתובות IPv6:

  • מתחיל ב-fd = mesh-local
  • מתחיל ב-fe80 = link-local

סוגי כתובות מקומיות ברשת מסווגים בתור:

  • מכיל ff:fe00 = ממקם נתב (RLOC)
  • לא מכיל ff:fe00 = מזהה של נקודת קצה (EID)

מזהים את ה-EID בפלט של המסוף, רושמים אותו לשימוש מאוחר יותר. בפלט לדוגמה שלמעלה, ה-EID הוא:

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. התחלה של צומת 2

יש לפתוח טרמינל חדש ולנווט אל הספרייה של openthread ולשחזר את תהליך ה-CLI. זהו הסימולציה השנייה של מכשיר השרשור:

$ cd ~/src/openthread
$ ./build/simulation/examples/apps/cli/ot-cli-ftd 2

הערה: אם ההודעה > לא מופיעה אחרי שמריצים את הפקודה הזו, מקישים על enter.

מגדירים את מפתח הרשת של Thread ואת מזהה ה-PAN (מספר חשבון קבוע) באמצעות אותם ערכים כמו מערך הנתונים התפעולי של צומת 1&33:

> dataset networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

הקפידו שמערך הנתונים הזה יהיה פעיל:

> dataset commit active
Done

מציגים את ממשק IPv6:

> ifconfig up
Done

הפעלה של פרוטוקול Thread:

> thread start
Done

המכשיר יתאפס כילד. צאצא של Thread מקביל ל'מכשיר קצה', שהוא מכשיר Thread שמעביר ומקבל תנועת גולשים חד-פעמית רק באמצעות מכשיר הורה.

> state
child
Done

תוך 2 דקות אפשר לראות את מעבר המדינה מ-child ל-router. נתב השרשורים מסוגל לנתב תנועה בין התקני Thread. הוא מכונה גם 'הורה'.

> state
router
Done

אימות הרשת

דרך קלה לאמת את רשת האריג היא לעיין בטבלת הנתבים.

1. בדיקת קישוריות

בצומת 2, מקבלים את ה-RLOC16. ה-RLOC16 הוא 16 הביטים האחרונים בכתובת ה-RLOC IPv6 במכשיר.

> rloc16
5800
Done

בצומת 1, בודקים את טבלת הנתב של RLOC16 של Node 2&33. מוודאים תחילה שצומת 2 עבר למצב נתב.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC  |
+----+--------+----------+----------+-------+---------+-----+------------------+
| 20 | 0x5000 |       63 |         0 |     0 |      0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |     3 |      3 |  23 | 5a4eb647eb6bc66c |

הטבלה R&C של צומת 1 של 0xa800 נמצאת בטבלה ומאשרת שהיא מחוברת לרשת.

2. פינג צומת 1 מצומת 2

אימות הקישור בין שני המכשירים המדומים בשרשור. בצומת 2, ping ה-EID שהוקצה לצומת 1:

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1
hlim=64 time=12ms

יש ללחוץ על enter כדי לחזור להודעה של > CLI.

בדיקת הרשת

עכשיו אפשר לבצע פינג בין שני מכשירי שרשור בסימולציה. מומלץ לבדוק את רשת האריג באמצעות צומת אחד במצב אופליין.

חוזרים אל צומת 1 ומפסיקים את השרשור:

> thread stop
Done

עוברים לצומת 2 ובודקים את המדינה. תוך שתי דקות, צומת 2 מזהה שהמנהיג (צומת 1) אינו מחובר לאינטרנט, ועליך לראות מעבר בין צומת 2 ל-leader של הרשת:

> state
router
Done
...
> state
leader
Done

לאחר האישור, יש להפסיק את השרשור ולאפס את צומת 2 להגדרות המקוריות לפני היציאה. איפוס להגדרות המקוריות מתבצע כדי להבטיח שפרטי הכניסה לרשת של Thread שנעשה בהם שימוש בתרגיל הזה לא יועברו לתרגיל הבא.

> thread stop
Done
> factoryreset
>
> exit

איפוס להגדרות המקוריות ויציאה מצומת 1:

> factoryreset
>
> exit

במידע על CLI של OpenThread אפשר לעיין בכל הפקודות הזמינות של CLI.

5. אימות צמתים באמצעות 'עמלות'

בתרגיל הקודם, הגדרתם רשת Thread עם שני מכשירים מדומים וקישוריות מאומתת. עם זאת, כך רק תעבורת נתונים מקומית לא מאומתת של IPv6 יכולה לעבור בין מכשירים. כדי לנתב בין תעבורת נתונים גלובלית של IPv6 (ואינטרנט באמצעות נתב גבול שרשור), יש לאמת צמתים.

כדי לבצע אימות, מכשיר אחד חייב לפעול כנציב/ת. שירות הנציבות הוא שרת האימות שנבחר כרגע למכשירי Thread החדשים, והגורם המורשה לספק את פרטי הכניסה לרשת הנדרשים למכשירים כדי להצטרף לרשת.

בתרגיל הזה, נשתמש באותו טופולוגיה של שני צמתים כמו בעבר. לצורך אימות, מנהל השרשור יפעל כנציב, נתב השרשור כמחבר.

d6a67e8a0d0b5dcb.png

1. יצירת רשת

אם ממשיכים מהתרגיל הקודם, יש לפתוח שני חלונות של מסוף. אם לא, צריך לוודא ששניהם פתוחים ומוכנים לשימוש. אחד מהם ישמש כצומת 1, והשני כצומת 2.

בצומת 1, מרחיבים את תהליך ה-CLI:

$ cd ~/src/openthread
$ ./build/simulation/examples/apps/cli/ot-cli-ftd 1

הערה: אם ההודעה > לא מופיעה אחרי שמריצים את הפקודה הזו, מקישים על enter.

צריך ליצור קבוצת נתונים תפעולית חדשה, לאשר אותה כקבוצה הפעילה ולהתחיל שרשור:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Network Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

הקפידו שמערך הנתונים הזה יהיה פעיל:

> dataset commit active
Done

מציגים את ממשק IPv6:

> ifconfig up
Done

הפעלה של פרוטוקול Thread:

> thread start
Done

ממתינים כמה שניות ומוודאים שהמכשיר הפך למנהל השרשור:

> state
leader
Done

2. הפעלת תפקיד הנציב

בזמן שאתה עדיין בצומת 1, התחל את תפקיד הנציב:

> commissioner start
Done

הרשאה לכל מנוי (באמצעות התו הכללי לחיפוש *) עם פרטי הכניסה של J01NME להצטרף לרשת. 'הצטרפות' היא מכשיר שאדמין אנושי מוסיף ל'רשת הזמנות'.

> commissioner joiner add * J01NME
Done

3. הפעלת התפקיד 'הצטרפות'

בחלון הטרמינל השני, צרו תהליך CLI חדש. זה צומת 2.

$ cd ~/src/openthread
$ ./build/simulation/examples/apps/cli/ot-cli-ftd 2

בצומת 2, מפעילים את התפקיד 'הצטרפות' באמצעות פרטי הכניסה של J01NME.

> ifconfig up
Done
> joiner start J01NME
Done

... ממתינים כמה שניות עד לאישור ...

Join success

בתור חבר/ה חדש/ה, המכשיר (צומת 2) אומת בהצלחה באמצעות נציב (צומת 1) וקיבל את פרטי הכניסה של רשת Thread.

עכשיו, כשצומת 2 מאומת, מתחילים את השרשור:

> thread start
Done

4. אימות של אימות הרשת

יש לבדוק את state בצומת 2 כדי לוודא שהוא הצטרף לרשת. תוך שתי דקות, צומת 2 עובר מ-child ל-router:

> state
child
Done
...
> state
router
Done

5. איפוס ההגדרה

כדי להתכונן לתרגיל הבא, יש לאפס את ההגדרה. בכל צומת, עצירת השרשור, ביצוע איפוס להגדרות המקוריות ויציאה ממכשיר הסימולציה:

> thread stop
Done
> factoryreset
>
> exit

יכול להיות שיהיה צורך להקיש על enter כמה פעמים כדי להחזיר את ההודעה > אחרי פקודה ב-factoryreset.

6. ניהול הרשת באמצעות OpenThread Daemon

במסגרת התרגיל הזה, ננסה הדמיה של מופע CLI אחד (מכשיר SoC Thread אחד) מוטמע ומופע אחד של רדיו-מעבד (RCP).

ot-daemon הוא מצב של אפליקציית OpenThread Posix שמשתמש בשקע UNIX כקלט ופלט, כדי שמערכת CoreThread תוכל לפעול כשירות. לקוחות יכולים לתקשר עם השירות הזה על ידי חיבור לשקע באמצעות פרוטוקול OpenThread CLI.

ot-ctl הוא CLI שסופק על ידי ot-daemon כדי לנהל ולהגדיר את ה-RCP. באמצעות האפשרות הזו, נחבר את ה-RCP לרשת שנוצרה על ידי מכשיר השרשור.

שימוש ב-ot-daemon

בתרגיל הזה ייעשה שימוש בשלושה חלונות טרמינל, בהתאם לתקנים הבאים:

  1. מופע CLI של מכשיר עם שרשורי הדמיה (צומת 1)
  2. תהליך ot-daemon
  3. מופע CLI של ot-ctl

אם ממשיכים מהתרגיל הקודם, כבר יש לפתוח שני חלונות של טרמינל. פותחים שליש כדי לוודא שיש שלושה חלונות טרמינל זמינים לתרגיל הזה.

1. התחלה של צומת 1

בחלון הטרמינל הראשון, מרחיבים את תהליך ה-CLI עבור המכשיר עם השרשור מההדמיה:

$ cd ~/src/openthread
$ ./build/simulation/examples/apps/cli/ot-cli-ftd 1

הערה: אם ההודעה > לא מופיעה אחרי שמריצים את הפקודה הזו, מקישים על enter.

צריך ליצור קבוצת נתונים תפעולית חדשה, לאשר אותה כקבוצה הפעילה ולהתחיל שרשור:

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Network Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

הקפידו שמערך הנתונים הזה יהיה פעיל:

> dataset commit active
Done

מציגים את ממשק IPv6:

> ifconfig up
Done

הפעלה של פרוטוקול Thread:

> thread start
Done

הצגת כתובות ה-IPv6 שהוקצו לממשק השרשור של צומת 1&33:

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

כפי שמוסבר בשלב סימולציה של רשת Thread, כתובת אחת היא link-local (fe80) ושלוש הן רשת מקומית (fd). ה-EID הוא הכתובת המקומית ברשת שלא מכילה ff:fe00 בכתובת. בפלט לדוגמה הזה, ה-EID הוא fd55:cf34:dea5:7994:460:872c:e807:c4ab.

יש לציין את ה-EID הספציפי מהפלט של ipaddr, שישמש לתקשורת עם הצומת.

2. Start ot-daemon

בחלון הטרמינל השני, עוברים לספרייה openthread ומתחילים את ot-daemon עבור צומת RCP, שנקרא צומת 2. מומלץ להשתמש בסימון המלא של -v כדי לראות פלט יומן ולאשר שהוא פועל. כמו כן, חשוב להשתמש ב-sudo:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+forkpty:///build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'

במצב מוצלח, ot-daemon במצב מלל יוצר פלט דומה לזה:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

צריך להשאיר את הטרמינל פתוח ברקע. לא יוצגו בפקודות נוספות.

3. שימוש ב-OT-ctl כדי להצטרף לרשת

עדיין לא הזמנתי את צומת 2 (ה-RCP של ot-daemon) לאף רשת Thread. כאן נכנס לתמונה ot-ctl. ב-ot-ctl נעשה שימוש באותו CLI של האפליקציה OpenThread CLI, כך שאפשר לשלוט בצמתים של ot-daemon באותו אופן כמו שאר המכשירים המדומים של Thread.

בחלון שלישי של הטרמינל, מתחילים את ot-ctl:

$ sudo ./build/posix/src/posix/ot-ctl
>

הערה: אם ההודעה > לא מופיעה אחרי שמריצים את הפקודה הזו, מקישים על enter.

אפשר להשתמש ב-ot-ctl בחלון הטרמינל השלישי כדי לנהל את צומת 2 (צומת ה-RCP) שהתחלת בחלון השני בטרמינל עם ot-daemon. בדיקת state בצומת 2:

> state
disabled
Done

מקבלים את קישור eui64 של צומת 2, כדי להגביל את ההצטרפות למארגן הספציפי:

> eui64
18b4300000000001
Done

בצומת 1 (חלון הטרמינל הראשון), מפעילים את הנציב ומגבילים את ההצטרפות רק ל-eui64:

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

בצומת 2 (חלון הטרמינל השלישי), מעלים את ממשק הרשת ומצטרפים לרשת:

> ifconfig up
Done
> joiner start J01NME
Done

... ממתינים כמה שניות עד לאישור ...

Join success

כחבר/ה בתוכנית, ה-RCP (צומת 2) אומת בהצלחה באמצעות נציבות (צומת 1) וקיבל את פרטי הכניסה לרשת Thread.

עכשיו מצטרפים לצומת 2 לרשת Thread:

> thread start
Done

4. אימות של אימות הרשת

יש לבדוק את state בצומת 2 כדי לוודא שהוא הצטרף לרשת. תוך שתי דקות, צומת 2 עובר מ-child ל-router:

> state
child
Done
...
> state
router
Done

5. אימות הקישוריות

יציאה מ-ot-ctl באמצעות הפקודה Ctrl+D או שורת הפקודה exit, בשורת הפקודה של המחשב המארח, פינג צומת 1, באמצעות ה-EID שלו עם הפקודה ping6. אם מופע ה-RCP של ot-daemon מחובר בהצלחה לרשת Thread ומתקשר אליה, הפינג יצליח:

$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

7. כל הכבוד!

סימנת בהצלחה את הרשת הראשונה בשרשור באמצעות OpenThread. נפלא!

ב-Codelab הזה למדתם איך:

  • הגדרת כלי ה-build של OpenThread
  • הדמיה של רשת Thread
  • אימות צמתים בשרשור
  • ניהול רשת של Thread באמצעות OpenThread Daemon

מידע נוסף זמין בקישורים הבאים: