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

1. מבוא

חשיפה של טופולוגיית רשת אריג של Thread

מה זה Thread ו-OTNS

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

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

ה-Codelab הזה מתמקד ב-OTNS-CLI וב-OTNS-Web לשימוש אינטראקטיבי. המאמר לא כולל תכונות אחרות של OTNS, כמו סקריפטים של Python.

הדרישות

  • הסבר על שרשורים כדי להבין את מה שנלמד ב-Codelab הזה, צריך להכיר את המושגים הבסיסיים של Thread.
  • עדיף Linux x86_64 או Mac OS עם Homebrew. גרסה 24 ומעלה של Ubuntu ב-WSL2 ב-Windows אמורה גם היא לפעול, אבל יכול להיות שיהיה צורך לבצע שינויים ידניים בהגדרות.
  • Git.
  • דפדפן אינטרנט. ‫OTNS-Web משתמש בדפדפן אינטרנט כדי להציג סימולציות.
  • Wireshark – כלי לניתוח פרוטוקולי רשת (אופציונלי).
  • Go מגרסה 1.23 ואילך.
    • סקריפט ההתקנה יבדוק איזו גרסת Go מותקנת.
    • אם Go לא מותקנת, תותקן גרסה >= 1.23, אם היא זמינה ממנהל החבילות.
    • אם הוא לא זמין במנהל החבילות, צריך להתקין אותו באופן ידני.
    • שימו לב: Ubuntu 24.04 ומטה לא תומך אוטומטית ב-Go 1.23. פרטים נוספים זמינים בדף Available Golang versions (גרסאות Golang זמינות) בתיעוד של Ubuntu. אפשר לבצע התקנה ידנית באמצעות snap או בדרכים אחרות.
  • Python בגרסה 3.9 ואילך.
    • סקריפט ההתקנה יבדוק איזו גרסה של Python מותקנת.
    • אם Python 3 עדיין לא מותקן, תותקן גרסה >= 3.9 אם היא זמינה ממנהל החבילות.
    • אם הוא לא זמין במנהל החבילות, צריך להתקין אותו באופן ידני.

הסברים על המונחים

המונח 'נתב' משמש כמונח הטכני ל-Thread Mesh Extender, שנקרא בהתחלה Thread Router. המונח 'צומת' מתייחס לכל מכשיר OpenThread מדומה בהדמיה של OTNS.

2. התקנה

קבלת קוד OTNS

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

כל פקודות המסוף הבאות ב-Codelab הזה מורצות מהספרייה otns.

הפעלה והתקנה

הסקריפט bootstrap יתקין את הרכיבים התלויים (כולל Python 3 ו-Go/Golang, אם צריך) ואת OTNS. שימו לב: יכול להיות שהסקריפט ייעצר אם הוא לא יוכל להתקין באופן אוטומטי תלויות מסוימות, כמו Python בגרסה >= 3.9 או Go בגרסה >= 1.23. כדי שההתקנה תתבצע באופן אוטומטי, צריך לוודא שהחבילות נמצאות במאגר החבילות שהוגדר במערכת ההפעלה.

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

$ ./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. רשימה מלאה של הפקודות זמינה במאמרי העזרה בנושא OTNS CLI. אל דאגה, תשתמש רק בכמה מהפקודות האלה ב-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

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 נבחר. הרשומה 'תפקיד' בחלונית מאשרת שמדובר במנהיג.

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

הוספת צמתים באמצעות OTNS-Web

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

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

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

נוספו כמה צמתים חדשים, סך הכול 9 צמתים

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

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.

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

רשת Thread עם צומת ראשי 1 שנבחר

כבה רדיו

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

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

מחיצה חדשה נוצרת עם צומת 9 כמנהיג החדש

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

הפעל רדיו

בוחרים את המנהיג שהרדיו שלו כבוי. לוחצים על הלחצן כפתור ההפעלה של הרדיו ב-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 יהפוך למוביל של מחיצה חדשה וכל הצמתים שנותרו יצורפו כצאצא לצומת 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

כדי להגדיר את מפתח הפענוח, בוחרים באפשרות עריכה -> העדפות בתפריט. בחלון ההעדפות, בוחרים באפשרות Protocols -> IEEE 802.15.4 (פרוטוקולים -> IEEE 802.15.4). לוחצים על הלחצן עריכה... לצד 'מפתחות פענוח'. לוחצים על + כדי ליצור רשומה חדשה, מזינים את המפתח 00112233445566778899aabbccddeeff (32 תווים) ובוחרים באפשרות 'גיבוב של השרשור' בשדה 'גיבוב של המפתח'. אפשר להשאיר את הערך של 'אינדקס מפתח הפענוח' כ-0. לאחר מכן לוחצים על אישור, ושוב על אישור. עכשיו, כשנטען את קובץ ה-PCAP של OTNS, הוא אמור להיות מפוענח בצורה תקינה.

חותמות הזמן שמוצגות בעמודה 'Time' (זמן) (בשניות) תואמות לערכי הזמן המוחלטים של הסימולציה שמוצגים ביומני הצמתים של OpenThread. כך קל יותר לקשר בין הודעות ביומן לבין מסגרות רדיו שמועברות או מתקבלות. עם זאת, בדרך כלל הערכים לא זהים עד לרמת דיוק של מיקרו-שנייה אחת: חומרת הרדיו המדומה IEEE 802.15.4 עשויה להוסיף עיכוב נוסף, אחרי שבקשת שליחת פריים רדיו נשלחת על ידי מחסנית OpenThread.

12. מזל טוב

מזל טוב, ביצעת בהצלחה את הסימולציה הראשונה של OTNS!

למדתם איך להתקין את OTNS ואת יחסי התלות שלו. התחלתם סימולציה של OTNS עם צמתים מדומי OpenThread. למדתם איך לשנות את הסימולציה בדרכים שונות באמצעות OTNS-CLI וגם OTNS-Web.

עכשיו אתם יודעים מה זה OTNS ואיך אפשר להשתמש בו כדי לדמות רשתות OpenThread.

מה השלב הבא?

כדאי לעיין ב-Codelabs הבאים…

מסמכי עזר