הדמיה של רשתות Thread באמצעות OTNS

מידע על Codelab זה
schedule30 דקות
subjectהעדכון האחרון: 15 במאי 2025
account_circleנכתב על ידי Simon Lin, Colin Tan, Esko Dijk

1. מבוא

איור של טופולוגיית רשת אריג ב-Thread

מהם שרשור ו-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 בהתחלה

אם מוצג רק דף ריק ב-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:

OTNS-Web elements explained

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:

רשת Thread עם 4 צמתים

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

רשת של שיחות עם 4 צמתים, צומת 1 נבחר

הוספת צמתים על ידי OTNS-Web

אפשר גם להוסיף צמתים באמצעות OTNS-Web. לוחצים על הלחצן New Router של Action Bar. צומת אמור להיווצר מימין לצומת שנבחר. הנתב החדש צריך להצטרף למחיצה הקיימת של Thread:

נתב נוסף, סה"כ 5 צמתים

אפשר גם ללחוץ על הלחצנים FED,‏ MED,‏ SSED ו-BR בסרגל הפעולות כדי ליצור את סוגי הצמתים האחרים האלה. עכשיו אמורים להיות 9 צמתים בסך הכול. אם רוצים, אפשר לגרור צמתים מסוימים למיקומים אחרים כדי ליצור טופולוגיה פיזית אחרת של הרשת.

נוספו כמה צמתים חדשים, סה"כ 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.

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

רשת של שרשורים עם צומת מנהיג 1 שנבחר

כבה רדיו

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

ממתינים כ-12 שניות (120 שניות בזמן הסימולציה) עד שהנתב או נתב הגבול השני יהיו ל-Leader החדש:

יצירת מחיצה חדשה עם צומת 9 בתור המארח החדש

רשת Thread מתאוששת מכשלים של מנהיגים באופן אוטומטי על ידי יצירת מחיצה חדשה עם מנהיג חדש. למחיצה החדשה יש גם צבע חדש.

הפעל רדיו

בוחרים את המכשיר המוביל שהרדיו שלו כבוי. לוחצים על הלחצן לחצן הפעלה של הרדיו ב-Action Bar כדי לשחזר את החיבור לרדיו:

צומת 1 מצטרף לחלוקה אחרי שהרדיו שלו מופעל מחדש

אחרי שחיבורי הרדיו יתחדשו, המכשיר המוביל צריך להתחבר מחדש לרשת.

8. העברת צמתים

OTNS מאפשר למשתמשים להעביר צמתים בקלות באמצעות OTNS-CLI או OTNS-Web.

העברת צומת דרך OTNS-CLI

מעבירים את הצומת 9 של נתב הגבול למיקום חדש:

> move 9 50 50
Done

העברת צומת דרך OTNS-Web

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

צומת 5 מועבר מהצומתים האחרים ויוצר מחיצה חדשה

שימו לב שעדיין מוצג קו ירוק אחד בין צומת 5 לצומת 9. לרוב, הסיבה לכך היא מידע לא עדכני על ילד או ילדה שעדיין נשמר בטבלת הצאצאים של הורה לשעבר. יכול להיות גם שמדובר במידע לא עדכני על הקישור הקודם בין הנתב לנתב בין צומת 9 לצומת 5. (או במקרה הזה, יכול להיות שמדובר גם בבאג ברינדור). בסופו של דבר, המידע הלא עדכני יימחק מהצומתים לאחר זמן הקצוב לתפוגה.

9. מחיקת צמתים

מחיקת צמתים דרך OTNS-CLI

מוחקים את הצומת 5:

> del 5
Done

הצומת 5 אמור להיעלם מהסימולציה:

צומת 5 נמחק מהסימולציה

מחיקת צמתים דרך OTNS-Web

בוחרים את צומת 9 של נתב הגבול ולוחצים על הלחצן כפתור מחיקה ב-Action Bar כדי למחוק את צומת 9:

צומת 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_.log. לדוגמה, קטע מקובץ יומן:

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.

צילום מסך של ניתוח חבילות 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…

מסמכי עזרה