1. מבוא
מהם שרשור ו-OTNS
Thread הוא פרוטוקול רשתות רשתות רשתות אלחוטיות מבוסס-IP עם צריכת אנרגיה נמוכה, שמאפשר תקשורת מאובטחת בין מכשירים ומכשירים לענן. רשתות של חוטים יכולות להתאים את עצמן לשינויים בטופולוגיה כדי למנוע נקודת כשל יחידה.
OpenThread, שפורסם על ידי Google, הוא הטמעה של Thread בקוד פתוח. למרות גודל הקוד הקטן והזיכרון שנדרש, OpenThread תומך בכל התכונות שמוגדרות במפרט של Thread.
אפשר להשתמש ב-OpenThread Network Simulator (OTNS) כדי לדמות רשתות Thread על ידי הפעלת צמתים מדומים של OpenThread בפלטפורמות POSIX. OTNS מספק ממשק אינטרנט קל לשימוש (OTNS-Web) להצגה חזותית של רשתות Thread מדומה ולתפעול שלהן. אפשר גם לבצע סימולציות לפי סקריפט (באמצעות Python).
מה תלמדו
- התקנה של OTNS ושל יחסי התלות שלו
- יסודות השימוש ב-OTNS-CLI
- איך מוסיפים/מעבירים/מוחקים צמתים של OpenThread ב-OTNS-Web
- שימוש בתכונות המועילות האחרות של OTNS-Web כדי לשלוט בסימולציה של הרשת
- אימות של OpenThread ללא נקודת כשל יחידה
- הצגת תעבורת הנתונים בין צמתים של OpenThread ב-Wireshark
בקודלאב הזה נסביר איך משתמשים ב-OTNS-CLI וב-OTNS-Web באופן אינטראקטיבי. תכונות אחרות של OTNS, כמו סקריפטים של Python, לא נכללות.
מה נדרש
- עדיף Linux x86_64 או Mac OS עם Homebrew. גם Ubuntu 22/24 ב-Windows WSL2 אמורה לפעול, אבל יכול להיות שתצטרכו לשנות ידנית חלק מההגדרות.
- Git.
- דפדפן אינטרנט. ב-OTNS-Web נעשה שימוש בדפדפן אינטרנט כדי להציג סימולציות.
- Thread Primer. כדי להבין את החומר שמוסבר ב-Codelab הזה, צריך להכיר את המושגים הבסיסיים של Thread.
הסברים על המונחים
המונח 'נתב' משמש כמונח טכני למתאם Mesh של Thread, שנקרא בהתחלה 'נתב Thread'. המונח 'צומת' מתייחס לכל מכשיר OpenThread מדומה בסימולציה של OTNS.
2. התקנה
קבלת קוד OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
כל פקודות המסוף הבאות ב-Codelab הזה מופעלות מהספרייה otns
.
התקנה של Bootstrap
הסקריפט bootstrap
יותקן את יחסי התלות (כולל Python3 ו-Go/Golang, אם יש צורך) וגם את OTNS. הוא גם יוצר את סוגי הצמתים השונים של OT שאפשר להשתמש בהם ישירות בסימולציה, ומבצע כמה בדיקות בסיסיות. בגלל ה-builds של הצמתים, התהליך עשוי להימשך כמה דקות.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
יכול להיות שתתבקשו להזין סיסמה ל-sudo
.
אם האפליקציה otns
לא מותקנת כראוי
יכול להיות שהסקריפט ידווח על שגיאה כמו:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
במקרה כזה, צריך להוסיף את $(go env GOPATH)/bin
ל-$PATH.
במקרה של שגיאות אחרות, אפשר ליצור בעיה ב-GitHub.
3. הפעלת OTNS בפעם הראשונה
מריצים את otns
:
$ otns >_ ← OTNS-CLI prompt
לאחר ההפעלה, OTNS ייכנס למסוף CLI (OTNS-CLI
) ויפעיל דפדפן אינטרנט לצורך ניהול ותצוגה חזותית של הרשת (OTNS-Web
):
אם מוצג רק דף ריק ב-OTNS-Web, סביר להניח ש-WebGL לא מופעל בדפדפן שלכם. במאמר https://superuser.com/a/836833 מוסבר איך מפעילים את WebGL.
בקטעים הבאים תלמדו לנהל סימולציות של OTNS באמצעות OTNS-CLI
ו-OTNS-Web
.
4. מידע על OTNS-CLI ו-OTNS-Web
OTNS-CLI
OTNS-CLI
הוא ממשק שורת הפקודה (CLI) לניהול סימולציות של OTNS.
$ otns >_ ← OTNS-CLI prompt
אפשר להקליד פקודות דרך OTNS-CLI
. במאמרי העזרה של CLI ב-OTNS יש רשימה מלאה של הפקודות. אל דאגה, תשתמשו רק בכמה מהפקודות האלה ב-Codelab הזה.
מקלידים את הפקודה help
כדי לקבל סקירה כללית של פקודות ה-CLI. הרשימה הזו זהה למסמך העזרה של CLI.
> help add Add a node to the simulation and get the node ID. .... .... Done >
כדי לקבל עזרה נוספת לגבי פקודה ספציפית, נותנים את שם הפקודה, לדוגמה:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
הוא הכלי של OTNS לניהול ולתצוגה חזותית של הרשת. הוא מספק ייצוג חזותי של הצמתים, ההודעות והקישורים של רשת Thread המדומה. שימו לב לרכיבים השונים של OTNS-Web
:
5. הוספת צמתים
הוספת צמתים באמצעות OTNS-CLI
מוסיפים לסימולציה נתב Thread:
> add router 1 Done
אמור להופיע צומת שנוצר ב-OTNS-Web
. הצומת מתחיל בתור נתב והופך ליוביל תוך כמה שניות:
כדי להקל על הפעלת סימולציות באופן אינטראקטיבי, כל צומת OpenThread חדש מופעל כברירת מחדל עם קבוצה רגילה של פרמטרים של רשת.
הוספת צמתים נוספים דרך OTNS-CLI
עכשיו נוסיף כמה צמתים מסוגים שונים.
> add fed 2 Done > add med 3 Done > add sed 4 Done
ממתינים כמה שניות עד שהצמתים ימוזגו למחיצה אחת. הצמתים אמורים להופיע ב-OTNS-Web
:
ב-OTNS-Web
אפשר גם לבחור כל אחד מהצומתים כדי להציג חלונית עם מידע נוסף על הצומת. לדוגמה, באיור הבא הצומת 1 נבחר. הרשומה 'תפקיד' בחלונית מאשרת שמדובר ב-Leader.
הוספת צמתים על ידי OTNS-Web
אפשר גם להוסיף צמתים באמצעות OTNS-Web
. לוחצים על הלחצן New Router
של Action Bar
. צומת אמור להיווצר מימין לצומת שנבחר. הנתב החדש צריך להצטרף למחיצה הקיימת של Thread:
אפשר גם ללחוץ על הלחצנים FED, MED, SSED ו-BR בסרגל הפעולות כדי ליצור את סוגי הצמתים האחרים האלה. עכשיו אמורים להיות 9 צמתים בסך הכול. אם רוצים, אפשר לגרור צמתים מסוימים למיקומים אחרים כדי ליצור טופולוגיה פיזית אחרת של הרשת.
עכשיו יצרתם רשת של חוטים עם מחיצה אחת שמכילה צמתים רבים. בקטע הבא נשנה את מהירות הסימולציה כדי שהיא תרוץ מהר יותר.
6. שינוי המהירות
נכון לעכשיו, הסימולציה אמורה לפעול במהירות 1X
, כלומר זמן הסימולציה שחלף עד עכשיו זהה לזמן בפועל מאז שיצרנו את הצומת הראשון.
שינוי המהירות באמצעות OTNS-CLI
אפשר לשנות את מהירות הסימולציה באמצעות OTNS-CLI
.
הגדרת מהירות הסימולציה ל-100X
> speed 100 Done
אמורים להופיע הודעות שנשלחות מהצמתים בתדירות גבוהה בהרבה מבעבר.
הגדרת מהירות הסימולציה ל-MAX
> speed max Done
עכשיו, OTNS מנסה כמיטב יכולתו לדמות את התהליך מהר ככל האפשר, כך שצריך לראות צמתים ששולחים מספר רב של הודעות.
הדמיית השהיה
> speed 0 Done
הגדרת מהירות הסימולציה ל-0
משהיא את הסימולציה.
שחזור ההדמיה במהירות רגילה
> speed 1 Done
הגדרת מהירות הסימולציה לערך גדול מ-0
תפעיל מחדש את הסימולציה.
שינוי המהירות באמצעות OTNS-Web
לחצני בקרת מהירות
מאתרים את לחצני בקרת המהירות ב-
Action Bar
. בלחצנים מוצגת מהירות הסימולציה הנוכחית, ואפשר להשתמש בהם כדי לשנות את מהירות הסימולציה ולהשהות או להמשיך את הסימולציה.
האצת הסימולציה
כדי להאיץ את הסימולציה, לוחצים על הלחצן עד שהמהירות מגיעה ל-
MAX
: .
האטת הסימולציה
כדי להאט את הסימולציה, לוחצים על הלחצן .
הדמיית השהיה
לוחצים על הלחצן כדי להשהות את הסימולציה כשהיא פועלת. הלחצן ישתנה ל-
.
המשך הסימולציה
לוחצים על הלחצן כדי להמשיך את הסימולציה כשהיא מושהית. הלחצן ישתנה חזרה ל-
.
הגדרת מהירות הסימולציה ל-10X
כדי לחסוך זמן, אפשר להשתמש ב
OTNS-CLI
כדי לשנות את מהירות הסימולציה ל-
10X
כדי שנוכל לזהות שינויים בטופולוגיה של הרשת מהר יותר.
> speed 10 Done
7. הפעלה/השבתה של הרדיו
עכשיו, הסימולציה אמורה להכיל לפחות 2 נתבים (בצורת משושה), אולי נתב גבול (בצורת ריבוע) ועוד הרבה צאצאים, והיא אמורה לפעול במהירות פי 10.
מחפשים את המכשיר המוביל הנוכחי (הקו האדום) מבין שני הנתב, ולוחצים עליו לחיצה אחת כדי לבחור אותו:
כבה רדיו
לוחצים על הלחצן בסרגל הפעולות כדי לכבות את הרדיו של צומת המנהיג. המנהיג לא יוכל לשלוח או לקבל הודעות כשהרדיו כבוי.
ממתינים כ-12 שניות (120 שניות בזמן הסימולציה) עד שהנתב או נתב הגבול השני יהיו ל-Leader החדש:
רשת Thread מתאוששת מכשלים של מנהיגים באופן אוטומטי על ידי יצירת מחיצה חדשה עם מנהיג חדש. למחיצה החדשה יש גם צבע חדש.
הפעל רדיו
בוחרים את המכשיר המוביל שהרדיו שלו כבוי. לוחצים על הלחצן ב-
Action Bar
כדי לשחזר את החיבור לרדיו:
אחרי שחיבורי הרדיו יתחדשו, המכשיר המוביל צריך להתחבר מחדש לרשת.
8. העברת צמתים
OTNS מאפשר למשתמשים להעביר צמתים בקלות באמצעות OTNS-CLI
או OTNS-Web
.
העברת צומת דרך OTNS-CLI
מעבירים את הצומת 9 של נתב הגבול למיקום חדש:
> move 9 50 50 Done
העברת צומת דרך OTNS-Web
גוררים את הצומת 5 עד שהוא מגיע לפינה הימנית התחתונה. מאחר שצומת 5 נמצא עכשיו מחוץ לכיסוי הרדיו של הנתב האחר, הוא יוצר מחיצה משלו עם מזהה מחיצה חדש. אפשר לבדוק את מזהי המחיצות בחלונית המידע של הצמתים בלחיצה על הצמתים.
שימו לב שעדיין מוצג קו ירוק אחד בין צומת 5 לצומת 9. לרוב, הסיבה לכך היא מידע לא עדכני על ילד או ילדה שעדיין נשמר בטבלת הצאצאים של הורה לשעבר. יכול להיות גם שמדובר במידע לא עדכני על הקישור הקודם בין הנתב לנתב בין צומת 9 לצומת 5. (או במקרה הזה, יכול להיות שמדובר גם בבאג ברינדור). בסופו של דבר, המידע הלא עדכני יימחק מהצומתים לאחר זמן הקצוב לתפוגה.
9. מחיקת צמתים
מחיקת צמתים דרך OTNS-CLI
מוחקים את הצומת 5:
> del 5 Done
הצומת 5 אמור להיעלם מהסימולציה:
מחיקת צמתים דרך OTNS-Web
בוחרים את צומת 9 של נתב הגבול ולוחצים על הלחצן ב-
Action Bar
כדי למחוק את צומת 9:
הצומת Node 1
אמור להפוך ל-Leader של מחיצה חדשה, וכל שאר הצמתים ישויכו כצאצאים לצומת 1.
10. הקשר של צומת OTNS-CLI
OTNS-CLI
מספק מצב הקשר של צומת ליצירת אינטראקציה קלה עם צמתים, כדי לעזור למפתחים לאבחן את סטטוס הצומת. אפשר גם להפעיל פעולות של צמתים מהמצב הזה.
מעבר למצב הקשר של הצומת
מזינים את הקשר של הצומת של צומת 1:
> node 1 Done node 1>
הנחיה של CLI השתנתה ל-node 1>
, שמציינת את ההקשר הנוכחי של הצומת. אפשר להקליד פקודות OpenThread CLI שיופעלו בצומת כאילו אתם מבצעים אינטראקציה עם הצומת ישירות.
ביצוע פקודות בהקשר של צומת
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
מעבר להקשר של צומת אחר
node 1> node 2 Done node 2>
הקשר של צומת היציאה
node 1> exit Done >
דרך חלופית לצאת מההקשר של הצומת היא הפקודה node 0
.
11. הצגת יומני צמתים ולכידות חבילות
יומני צמתים של OpenThread
כברירת מחדל, OTNS יוצר קובצי יומן מפורטים לכל צמתים של OpenThread בסימולציה. אפשר לראות אותם בספרייה ./tmp
. שם הקובץ הוא 0_
. לדוגמה, קטע מקובץ יומן:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
זמן הסימולציה המוחלט מיוצג באלפיות השנייה בצד ימין. חותמת הזמן hh:mm:ss
מציגה את חותמת הזמן של היומן של צומת OpenThread, שעשויה להיות שונה משעת הסימולציה המוחלטת.
לכידות חבילות של Wireshark
כברירת מחדל, כל המסגרות של IEEE 802.15.4 שמועברות מתועדות בקובץ ה-PCAP current.pcap
. אפשר לקרוא את הקובץ הזה באמצעות Wireshark במהלך הסימולציה או אחריה. בגלל ההצפנה בשכבת הקישור של Thread, צריך לבצע פעולת הגדרה חד-פעמית ב-Wireshark כדי להגדיר את מפתח הפענוח של OTNS כראוי. כברירת מחדל, נעשה שימוש במפתח רשת ידוע אחד כדי לפשט את פענוח המסגרות על ידי Wireshark.
בצילום המסך שבהמשך יש דוגמה לבדיקת חבילות של OpenThread ב-Wireshark.
כדי להגדיר את מפתח הפענוח, בוחרים בתפריט Edit -> Preferences. לאחר מכן, בחלון ההעדפות, בוחרים באפשרות Protocols -> IEEE 802.15.4. לוחצים על הלחצן Edit… (עריכה) לצד 'מפתחות פענוח'. לוחצים על + כדי ליצור רשומה חדשה, מזינים את המפתח 00112233445566778899aabbccddeeff
(32 תווים) ובוחרים באפשרות 'hash של שרשור' בשדה 'hash של מפתח'. אפשר להשאיר את הערך 0
בשדה 'מפתח הפענוח'. לאחר מכן לוחצים על אישור ואז שוב על אישור. עכשיו קובץ ה-PCAP של OTNS אמור לעבור פענוח כראוי בזמן הטעינה.
חותמות הזמן שמוצגות בעמודה 'זמן' (בשניות) תואמות לערכים המוחלטים של זמן הסימולציה שמוצגים ביומני הצמתים של OpenThread. כך קל יותר למצוא התאמה בין הודעות ביומן לבין מסגרות רדיו שנשלחו או התקבלו. עם זאת, בדרך כלל הערכים לא זהים עד לרמת דיוק של מיקרו-שנייה אחת: חומרת הרדיו המדומה של IEEE 802.15.4 עשויה להוסיף עיכוב נוסף, אחרי שסטאק OpenThread מבקש לשלוח פריים רדיו.
12. מזל טוב
מזל טוב, ביצעתם בהצלחה את הסימולציה הראשונה של OTNS!
למדתם איך להתקין את OTNS ואת יחסי התלות שלו. הפעלתם סימולציה של OTNS עם צמתים מדומים של OpenThread. למדתם איך לשנות את הסימולציה בדרכים שונות באמצעות OTNS-CLI
ו-OTNS-Web
.
עכשיו אתם יודעים מהו OTNS ואיך אפשר להשתמש ב-OTNS כדי לדמות רשתות OpenThread.
מה השלב הבא?
כדאי לעיין בחלק מהקורסים האלה ב-Codelab…
- סימולציה של רשת Thread באמצעות OpenThread
- סימולציה של רשת Thread באמצעות OpenThread ב-Docker
- יצירת רשת Thread באמצעות לוחות nRF52840 ו-OpenThread