1. מבוא
הגרסה 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. לצורך תרגיל זה, נדגים את שני הצמתים שבעיגול הירוק: מנהיג שרשור ונתב שרשור עם חיבור יחיד.
פינג לצומת
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' (הפלט שלך יהיה שונה):
> 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 החדשים, והגורם המורשה לספק את פרטי הכניסה לרשת הנדרשים למכשירים כדי להצטרף לרשת.
בתרגיל הזה, נשתמש באותו טופולוגיה של שני צמתים כמו בעבר. לצורך אימות, מנהל השרשור יפעל כנציב, נתב השרשור כמחבר.
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
בתרגיל הזה ייעשה שימוש בשלושה חלונות טרמינל, בהתאם לתקנים הבאים:
- מופע CLI של מכשיר עם שרשורי הדמיה (צומת 1)
- תהליך
ot-daemon
- מופע 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
מידע נוסף זמין בקישורים הבאים: