תחילת העבודה עם Happy and Weave

1. הקדמה

שמח הוא כלי שנוצר על ידי מעבדות קן עבור תזמור קל של טופולוגיות רשת מדומה. Happy שימושי לפיתוח ובדיקה של רשתות IoT ביתיות.

עם Happy, אתה יכול:

  • בדוק פרוטוקולי רשת ותוכניות הפעלה מבוזרות אחרות על מכונת פיתוח לינוקס אחת ללא שימוש בחומרת מכשירי IoT
  • בצע בדיקות פונקציונליות אוטומטיות ברשת
  • הפעל מספר רשתות מקבילות במקביל על אותה מערכת כדי לשפר את תפוקת הבדיקות

בשנת Codelab זה, תלמד איך להתחיל עם שמח, כמו גם את היסודות של Weave למכשירי IOT. יישום Weave תשתמש הוא OpenWeave , גרסת קוד פתוח שוחררה מבית Nest.

f6996428fb06dede.png

מה תלמד

  • איך לבנות Happy ו-OpenWeave
  • כיצד ליצור באופן ידני רשת IoT מדומה
  • כיצד לנהל טופולוגיות מותאמות אישית
  • כיצד לחבר רשת Happy מדומה לאינטרנט
  • היסודות של Weave

מה אתה צריך

  • מכונת לינוקס, פיזית או וירטואלית
  • Git client או cli
  • פייתון 2.7
  • הבנה בסיסית של מושגי רשת וניתוב

2. התחל

התקן את שרשרת הכלים ותלות

כדי לבנות את Happy and Weave, ודא שיש לך שרשרת כלים נתמכת וכל התלות מותקנת.

$ sudo apt-get update
$ sudo apt-get install -y autotools-dev build-essential git lcov \
                           libdbus-1-dev libglib2.0-dev libssl-dev \
                           libudev-dev make python2.7 software-properties-common \
                           python-setuptools bridge-utils python-lockfile \
                           python-psutil
$ sudo apt-get install -y --force-yes gcc-arm-none-eabi
$ sudo apt-get update -qq

קבל את קוד המקור

שכבו את המאגרים של Happy ו-OpenWeave Git משורת הפקודה:

$ cd ~
$ git clone https://github.com/openweave/happy.git
$ git clone https://github.com/openweave/openweave-core.git

התקן את Happy

מספריית השורש של Happy, התקן את Happy:

$ cd ~/happy
$ make

ודא התקנה מאושרת

כעת אמורות להיות נגישות לפקודות שמחות משורת הפקודה:

$ happy-state
State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes

NODES      Name    Interface    Type                                          IPs

התקן את OpenWeave

מספריית השורש של OpenWeave, התקן את OpenWeave:

$ cd ~/openweave-core
$ make -f Makefile-Standalone

הגדר את Happy עם OpenWeave

כדי להשתמש ב-OpenWeave עם Happy, עליך ליידע את Happy היכן למצוא את התקנת Weave. עדכון התצורה השמחה עם הנתיב /src/test-apps בתוך לבנות OpenWeave שלך:

$ happy-configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps

אשר את התצורה:

$ happy-configuration
User Happy Configuration
        weave_path         ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps

אמת את התקנת OpenWeave

פקודות Weave הדרושות ב- Codelab זה נגישות משורת הפקודה:

$ weave-fabric-add -h

    weave-fabric-add creates a weave fabric.

    weave-fabric-add [-h --help] [-q --quiet] [-i --id <FABRIC_ID>]

    Example:
    $ weave-fabric-add 123456
        Creates a Weave Fabric with id 123456

    return:
        0    success
        1    fail

אם אתה מקבל את השגיאה weave-fabric-add: command not found , לעדכן שלך PATH משתנה הסביבה עם נתיב המשמש הבינאריים שמח:

$ export PATH=$PATH:~/openweave-core/src/test-apps/happy/bin

3. הטופולוגיה הראשונה שלך

בואו ניצור את הטופולוגיה הבאה של שלושה צמתים עם Happy.

a3295ee87fbd9764.png

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

ראשית, צור את שלושת הצמתים:

$ happy-node-add 01ThreadNode
$ happy-node-add 02BorderRouter
$ happy-node-add 03WiFiNode

בואו נוודא שהם קיימים:

$ happy-node-list
01ThreadNode
02BorderRouter
03WiFiNode

עכשיו בואו ניצור כמה רשתות:

$ happy-network-add ThreadNetwork thread
$ happy-network-add WiFiNetwork wifi

ודא שהרשתות קיימות:

$ happy-network-list
ThreadNetwork
WiFiNetwork

בדוק את מצב שמח:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP
    WiFiNetwork         wifi      UP

NODES      Name    Interface    Type                                          IPs
   01ThreadNode
 02BorderRouter
     03WiFiNode

זה לא מספיק רק להעלות רשת - עלינו להוסיף צמתים לרשתות. בעקבות דיאגרמת הטופולוגיה שלנו, הוסף כל צומת לרשת(ות) המתאימות:

$ happy-node-join 01ThreadNode ThreadNetwork
$ happy-node-join 02BorderRouter ThreadNetwork
$ happy-node-join 02BorderRouter WiFiNetwork
$ happy-node-join 03WiFiNode WiFiNetwork

הערה כי 02BorderRouter נוספה הוא ThreadNetwork ו WiFiNetwork . הסיבה לכך היא כנתב גבול בתוך ה-HAN שלנו, הצומת הזה מחבר את שתי הרשתות הבודדות יחד.

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

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP
    WiFiNetwork         wifi      UP

NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread
 02BorderRouter        wpan0  thread
                       wlan0    wifi
     03WiFiNode        wlan0    wifi

הטופולוגיה שלנו נראית כעת כך:

2d054e6c4e54089c.png

השלב האחרון בהעלאת רשת ה-Happy שלנו הוא הקצאת כתובות IP לכל ממשק בכל צומת. ציין את קידומת ה-IP עבור רשת, ו-Happy מקצה עבורך באופן אוטומטי כתובות IP.

מכיוון שפרוטוקול Thread משתמש ב-IPv6, הוסף קידומת IPv6 לרשת Thread:

$ happy-network-address ThreadNetwork 2001:db8:1:2::

בדוק את מצב האושר. לממשקי ה-Thread בכל צומת Thread יש כתובות IP:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP                       2001:0db8:0001:0002/64

    WiFiNetwork         wifi      UP

NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:3e36:13ff:fe33:732e/64

 02BorderRouter        wpan0  thread   2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64

                       wlan0    wifi
     03WiFiNode        wlan0    wifi

עבור רשת ה-WiFi, הוסף גם קידומות IPv4 וגם IPv6:

$ happy-network-address WiFiNetwork 2001:db8:a:b::
$ happy-network-address WiFiNetwork 10.0.1.0

בדוק את המצב שמח פעם נוספת. לכל הממשקים הוקצו כתובות IP, עם שתיים לכל ממשק Wi-Fi:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP                       2001:0db8:0001:0002/64

    WiFiNetwork         wifi      UP                       2001:0db8:000a:000b/64
                                                                        10.0.1/24


NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:3e36:13ff:fe33:732e/64

 02BorderRouter        wpan0  thread   2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64

                       wlan0    wifi                                  10.0.1.2/24
                                       2001:0db8:000a:000b:426c:38ff:fe90:01e6/64

     03WiFiNode        wlan0    wifi   2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64
                                                                      10.0.1.3/24

הנה הטופולוגיה המעודכנת שלנו:

84eecd23871618ca.png

4. בדוק את הקישוריות

עכשיו רשת Happy שלנו היא ולהפעלתו, בואו לבדוק את הקישוריות שלה על ידי ביצוע פינג צומת האחרים מן 01ThreadNode :

$ happy-ping 01ThreadNode 02BorderRouter
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    10.0.1.2 -> 100% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    2001:0db8:0001:0002:a651:3eff:fe92:6dbc -> 0% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    2001:0db8:000a:000b:426c:38ff:fe90:01e6 -> 100% packet loss

$ happy-ping 01ThreadNode 03WiFiNode
[Ping] ping from 01ThreadNode to 03WiFiNode on address
    2001:0db8:000a:000b:9aae:2bff:fe71:62fa -> 100% packet loss
[Ping] ping from 01ThreadNode to 03WiFiNode on address
    10.0.1.3 -> 100% packet loss

happy-ping מנסה הפקודה כדי לאותת לכל כתובת IP עבור כל ממשק על הצומת היעד. אנו יכולים להתעלם מכתובות ה-IPv4 מכיוון ש-Thread משתמש רק ב-IPv6.

שים לב שרק פינג אחד IPv6 היה מוצלח: האחד על 02BorderRouter של wpan0 ממשק, המהווה את הכתובת היחידה 01ThreadNode יכול להגיע ישירות:

5447bcbdf7d539df.png

כתוב IPv6 האחרות נכשלו בגלל שילוח לא הופעל בין wpan0 ו wlan0 על 02BorderRouter . לפיכך, 01ThreadNode אין לו מושג 03WiFiNode קיים, או איך להגיע אליו. Happy העלתה את הרשת המדומה, אך לא אפשרה את כל הניתוב וההעברה בין צמתים.

הוסף מסלולים

כדי לנתב תעבורת IPv6 על פני ה-HAN, הוסף את המסלולים המתאימים לכל צומת בכל רשת, בשני הכיוונים (כדי שהפינג ידע לחזור לצומת המקור).

עבור כל צומת, תצטרך לדעת:

  • הרשת הקרובה שער-במקרה זה, 02BorderRouter עבור שניהם
  • רשת היעד - לאן ללכת אחרי השער

עבור רשת שלושת הצמתים שלנו, זה נותן לנו את הדברים הבאים:

מ-Source Network

ל-Target Network

דרך שער

ThreadNetwork

WiFiNetwork

02BorderRouter wlan0 2001:db8:1:2::/64 prefix

WiFiNetwork

ThreadNetwork

02BorderRouter wpan0 2001:db8:a:b::/64 prefix

ניתן לעשות זאת בנפרד עבור כל צומת עם happy-node-route , אבל זה יותר קל לעשות את זה עבור כל הצמתים בכל הרשת עם happy-network-route .

$ happy-network-route -a -i ThreadNetwork -t default -v 02BorderRouter -p 2001:db8:1:2::/64
$ happy-network-route -a -i WiFiNetwork -t default -v 02BorderRouter -p 2001:db8:a:b::/64

לקבלת הסבר על דגלי שורת הפקודה, להשתמש happy-network-route -h .

happy-network-route הפקודה הופכת גם על העברת IPv4 ו- IPv6 עבור כל צומת, לפי הצורך. זה מאפשר לתנועה לנתב מממשק אחד למשנהו בתוך צומת.

עכשיו נסה שוב את הפינג:

$ happy-ping 01ThreadNode 02BorderRouter
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    10.0.1.2 -> 100% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    2001:0db8:0001:0002:a651:3eff:fe92:6dbc -> 0% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    2001:0db8:000a:000b:426c:38ff:fe90:01e6 -> 0% packet loss

שני הפינגים של IPv6 עובדים! והפנה על, היא יודעת איך להגיע wlan0 הממשק. פינג ה-IPv4 עדיין נכשל, מכיוון שהגדרנו רק מסלולים והעברה של IPv6 (גם בגלל ש-Thread לא פועל על IPv4).

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

$ happy-ping 01ThreadNode 03WiFiNode
[Ping] ping from 01ThreadNode to 03WiFiNode on address
    2001:0db8:000a:000b:9aae:2bff:fe71:62fa -> 0% packet loss
[Ping] ping from 01ThreadNode to 03WiFiNode on address
    10.0.1.3 -> 100% packet loss

הפינג IPv6 עובד כצפוי. כעת יש לך HAN IPv6 מדומה, מתפקד במלואו.

5bb53be0280b3320.png

כדי לאפשר דרך בטוחה ואמינה יותר לחבר הכל ביחד, בואו נוסיף את Weave על גבי ה-HAN.

5. הוסף Weave

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

יישום של Weave נקרא "בד". מארג Weave הוא רשת הכוללת את כל צמתי ה-HAN, שירות Nest וכל המכשירים הניידים המשתתפים ב-HAN. הוא יושב על גבי ה-HAN ומאפשר ניתוב קל יותר על פני טכנולוגיות קישור הרשת השונות (לדוגמה, Thread או Wi-Fi).

צור במרקם Weave לה.א.נ. שלך, באמצעות fab1 כמזהה בד, ואז להגדיר את כל הצמתים עבור Weave:

$ weave-fabric-add fab1
$ weave-node-configure

כעת לאחר ש-Weave מוגדר, בדוק את המצב שמח:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP                       2001:0db8:0001:0002/64

    WiFiNetwork         wifi      UP                       2001:0db8:000a:000b/64
                                                                        10.0.1/24


NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:3e36:13ff:fe33:732e/64
                                       fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64

 02BorderRouter        wpan0  thread   fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64
                                       2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64

                       wlan0    wifi   fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64
                                                                      10.0.1.2/24
                                       2001:0db8:000a:000b:426c:38ff:fe90:01e6/64

     03WiFiNode        wlan0    wifi   2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64
                                                                      10.0.1.3/24
                                       fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64

כל צומת נוספה במרקם Weave, וכל ממשק יש כתובת IPv6 החדש החל fd00 . כדי לקבל מידע נוסף על בד Weave, להשתמש weave-state הפקודה:

$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code
        01ThreadNode    69ca9502eb6911e7          8ZJB5Q
      02BorderRouter    686af236eb6911e7          B5YV3P
          03WiFiNode    69826e60eb6911e7          L3VT3A

FABRIC     Fabric Id           Global Prefix
                fab1     fd00:0000:fab1::/48

הנה הטופולוגיה המעודכנת שלנו, עם ערכי Weave בכחול:

ce3fa9082408355b.png

אריג בד

יש הרבה מידע חדש במדינות Weave ו-Happy. התחילה בואו עם הבד מן weave-state :

FABRIC     Fabric Id           Global Prefix
                fab1     fd00:0000:fab1::/48

שימושים Weave קידומת IPv6 של fd00::/48 עבור כל צומת. כתובות בבלוק זה נקראות Unique Local Addresses והן מיועדות לשימוש בתוך רשתות פרטיות כגון HAN. שילוב זה עם מזהה הבד יוצר את הקידומת העולמית של Weave המוצגת למעלה.

ארוג צמתים

לכל צומת בבד Weave מוקצה מזהה צומת ייחודי, יחד עם קוד זיווג:

NODES           Name       Weave Node Id    Pairing Code
        01ThreadNode    69ca9502eb6911e7          8ZJB5Q
      02BorderRouter    686af236eb6911e7          B5YV3P
          03WiFiNode    69826e60eb6911e7          L3VT3A

מזהה הצומת מזהה באופן גלובלי צומת במארג ה-Weave. קוד ההתאמה משמש כ"אישור מצרף" במהלך תהליך ההתאמה, ובדרך כלל מודפס לצד קוד QR של מוצר.

לדוגמה, אם תסתכל על קוד ה-QR של Nest Protect או Nest Cam, תבחין במחרוזת בת 6 תווים, המכונה לעתים קרובות מפתח הכניסה. זהו קוד ה-Weave Pairing.

e7c6fa3e24d61d1b.png

Weave משתמשת בשילוב של הקידומת הגלובלית, מזהה הבד ומזהה הצומת כדי ליצור כתובות IPv6 ספציפיות ל-Weave עבור כל צומת וממשק במארג.

שזור כתובות

שים לב כי ישנם ארבעה כתובות IPv6 חדש הטופולוגיה שמח, כל מתחיל עם קידומת גלובל Weave שלנו fd00:0000:fab1::/48 .

NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:3e36:13ff:fe33:732e/64
                                       fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64

 02BorderRouter        wpan0  thread   fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64
                                       2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64

                       wlan0    wifi   fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64
                                                                      10.0.1.2/24
                                       2001:0db8:000a:000b:426c:38ff:fe90:01e6/64

     03WiFiNode        wlan0    wifi   2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64
                                                                      10.0.1.3/24
                                       fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64

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

Weave שער רשת

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

בטופולוגיה לדוגמה שלנו, הבה נועד את הצומת BorderRouter כשער הרשת של Weave:

$ weave-network-gateway ThreadNetwork 02BorderRouter

פקודה זו מוסיפה נתיב מכל הצמתים אשכול לרשת המשנה בד Weave ( fd:0:fab1::/48 ) באמצעות BorderRouter ממשק אשכול של הצומת ( wpan0 ), המאפשרת כל צומת אשכול להגיע לכל צומת Weave מעבר לרשת אשכול. זה משול happy-network-route פקוד השתמשנו קודם לכן, אך הם ייחודיים מסלולי בד Weave.

6. תחזוקת טופולוגיה

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

שמור את הטופולוגיה של Happy לשימוש מאוחר יותר:

$ happy-state -s codelab.json

מקומות זה קובץ JSON עם הטופולוגיה מוחלטת השורש שלך ~/ תיקייה. קובץ JSON הוא העתק של המדינה Happy הנוכחי שלך, אשר נמצא ב ~/.happy_state.json .

לאחר השמירה, מחק את הטופולוגיה הנוכחית:

$ happy-state-delete

זה מוחק את כול מרחבי שמות של הרשת ותצורות נלוות נמצאות ~/.happy-state.json הקובץ. בדוק happy-state ואת weave-state לאשר תצורה ריקה:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes

NODES      Name    Interface    Type                                          IPs


$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code

FABRIC     Fabric Id           Global Prefix

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

  • happy-state-load - אינו תומך תוסף Weave
  • weave-state-load - תומך תוסף Weave

אז אם הטופולוגיה שלך כולל Weave, תמיד להשתמש weave-state-load פקוד כך בד Weave והתצורה הקשורים מוחלת.

טען מחדש את הטופולוגיה השמורה של Happy:

$ weave-state-load codelab.json

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

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP                       2001:0db8:0001:0002/64

    WiFiNetwork         wifi      UP                       2001:0db8:000a:000b/64
                                                                        10.0.1/24


NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:eef6:a0ff:feca:6697/64
                                       fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64

 02BorderRouter        wpan0  thread   fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64
                                       2001:0db8:0001:0002:5e53:bbff:fe05:484b/64

                       wlan0    wifi   2001:0db8:000a:000b:2e61:fdff:fed9:4fbc/64
                                       fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64
                                                                      10.0.1.2/24

     03WiFiNode        wlan0    wifi   fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64
                                                                      10.0.1.3/24
                                       2001:0db8:000a:000b:5e8e:c9ff:fed2:bdd1/64


$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code
        01ThreadNode    69ca9502eb6911e7          8ZJB5Q
      02BorderRouter    686af236eb6911e7          B5YV3P
          03WiFiNode    69826e60eb6911e7          L3VT3A

FABRIC     Fabric Id           Global Prefix
                fab1     fd00:0000:fab1::/48

מספר טופולוגיות מוגדרות מראש סופקו במאגר ה-Happy, הן בפורמט shell-script והן בפורמט JSON. מצא אותם ~/happy/topologies .

OpenWeave מגיע גם עם טופולוגיות Happy המוגדרות מראש למטרות בדיקה. מצא אותם ~/openweave-core/src/test-apps/happy/topologies/standalone .

7. איך זה עובד

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

כל צומת ורשת ב-Happy הם מרחב שמות של רשת, בעוד שקישורים ביניהם הם ממשקי רשת.

לדוגמה, באמצעות הטופולוגיה שלנו:

7d6654c2e4907f2a.png

בוא נראה אילו מרחבי שמות יצרה Happy בשביל זה:

$ ip netns list
happy004
happy003
happy002
happy001
happy000

אם אתה בודק את netns קטע קובץ JSON המדינה השמח, אתה יכול לראות מה צומת ורשתות כול אחד מהם מקבילי מרחב שמות:

$ happy-state -j | grep "netns" -A 5
"netns": {
    "01ThreadNode": "000",
    "02BorderRouter": "001",
    "03WiFiNode": "002",
    "ThreadNetwork": "003",
    "WiFiNetwork": "004",

49cfdce6ff9dd745.png

יומני זמן ריצה

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

פתח חלון מסוף שני והפעל יומנים, הם יפעלו ברציפות בחלון זה:

$ happy-state -l

חזור לחלון הראשון והרץ פינג שמח:

$ happy-ping 01ThreadNode 02BorderRouter

בדוק את ערכי היומן העדכניים ביותר בחלון הטרמינל השני. אתה אמור לראות שורה כזו ביומנים:

DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ping6 -c 1 2001:0db8:0001:0002:5e53:bbff:fe05:484b

happy-ping הפקודה היא לא יותר מאשר שמח הפעלת ping6 פיקודי happy000 מרחב ( 01ThreadNode ).

הזן צומת

השתמשו happy-shell להפעיל פקודות בלתי שמח כאילו מחובר לאחד הצמתים (במרחבי הרשת):

$ happy-shell 01ThreadNode
root@01ThreadNode:#

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

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

root@01ThreadNode:# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:152 (152.0 B)  TX bytes:152 (152.0 B)

wpan0     Link encap:Ethernet  HWaddr ec:f6:a0:ca:66:97
          inet6 addr: fd00:0:fab1:6:6bca:9502:eb69:11e7/64 Scope:Global
          inet6 addr: 2001:db8:1:2:eef6:a0ff:feca:6697/64 Scope:Global
          inet6 addr: fe80::eef6:a0ff:feca:6697/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:32 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2832 (2.8 KB)  TX bytes:2348 (2.3 KB)

השתמש exit לעזוב את המרחב של הצומת:

root@01ThreadNode:# exit

8. התחבר לשירות

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

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

ניתן לייצג את השירות בשתי דרכים עיקריות עם Happy:

  • כשירות מדומה במרחב שמות הרשת שלו (צומת שמח)
  • כשירות ענן אמיתי באינטרנט

מוגדר מראש טופולוגיות ניתנו ב ~/happy/topologies כדוגמא מתרחיש שירות.

שירות מדומה על צומת Happy

הסר כל טופולוגיות Happy קיימות:

$ happy-state-delete

אשר מדינה ריקה עם happy-state ואת weave-state פקודות.

טען טופולוגיה מוגדרת מראש עם נקודת גישה (AP) וצמתי שירות:

$ weave-state-load ~/happy/topologies/thread_wifi_ap_service.json

6d04cbfcc84038e2.png

בדוק את המצבים Happy ו-Weave כדי לאשר את הטופולוגיה. בטופולוגיה זו, onhub הוא AP, תוך cloud הוא שירות מדומה. הערה שניהם מחוברים אל Internet רשת מסוג wan :

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
     HomeThread       thread      UP                       2001:0db8:0111:0001/64

       HomeWiFi         wifi      UP                       2001:0db8:0222:0002/64
                                                                        10.0.1/24

       Internet          wan      UP                               192.168.100/24


NODES      Name    Interface    Type                                          IPs
   BorderRouter        wpan0  thread   2001:0db8:0111:0001:f624:13ff:fe4a:6def/64
                                       fd00:0000:fab1:0006:1ab4:3000:0000:0005/64

                       wlan0    wifi                                  10.0.1.2/24
                                       fd00:0000:fab1:0001:1ab4:3000:0000:0005/64
                                       2001:0db8:0222:0002:9e31:97ff:fe73:29f0/64

     ThreadNode        wpan0  thread   2001:0db8:0111:0001:c237:fbff:fecc:b082/64
                                       fd00:0000:fab1:0006:1ab4:3000:0000:0009/64

          cloud         eth0     wan                             192.168.100.3/24

          onhub        wlan0    wifi                                  10.0.1.3/24
                                       2001:0db8:0222:0002:3266:20ff:fe98:6ee2/64

                        eth0     wan                             192.168.100.2/24


$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code
        BorderRouter    18B4300000000005          AAA123
          ThreadNode    18B4300000000009          AAA123

FABRIC     Fabric Id           Global Prefix
                fab1     fd00:0000:fab1::/48

מנהרה לארוג

מנהרת Weave מחברת את בד Weave לשירות. זהו נתיב מאובטח המעביר הודעות IPv6 UDP בין ה-HAN לשירות. בטופולוגיה זו, BorderRouter הצומת הוא השער לרשת Weave, המתפקד כנקודת הסיום מנהרה על האן.

צור את מנהרת Weave:

$ weave-tunnel-start BorderRouter cloud

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

NODES      Name    Interface    Type                                          IPs

          cloud service-tun0     tun   fd00:0000:fab1:0005:1ab4:3002:0000:0011/64

                        eth0     wan                             192.168.100.3/24

c5ffca09d7cd3208.png

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

$ happy-ping ThreadNode cloud
[Ping] ping from ThreadNode to cloud on address
    fd00:0000:fab1:0005:1ab4:3002:0000:0011 -> 0% packet loss

שירות ענן אמיתי באינטרנט

הסר כל טופולוגיות Happy קיימות:

$ happy-state-delete

אשר מדינה ריקה עם happy-state ואת weave-state פקודות.

טען טופולוגיה מוגדרת מראש עם צומת נקודת גישה (AP):

$ weave-state-load ~/happy/topologies/thread_wifi_ap_internet.json

c75127417ef3833a.png

בטופולוגיה זו, onhub הוא AP. בדוק את מצב האושר. זה דומה הטופולוגיה הקודמת, בלי Internet רשת cloud צמתים:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
     HomeThread       thread      UP                       2001:0db8:0111:0001/64

       HomeWiFi         wifi      UP                       2001:0db8:0222:0002/64
                                                                        10.0.1/24


NODES      Name    Interface    Type                                          IPs
   BorderRouter        wpan0  thread   2001:0db8:0111:0001:ca3f:71ff:fe53:1559/64
                                       fd00:0000:fab1:0006:1ab4:3000:0000:0006/64

                       wlan0    wifi   2001:0db8:0222:0002:32e7:dfff:fee2:107a/64
                                       fd00:0000:fab1:0001:1ab4:3000:0000:0006/64
                                                                      10.0.1.2/24

     ThreadNode        wpan0  thread   2001:0db8:0111:0001:c2fb:97ff:fe04:64bd/64
                                       fd00:0000:fab1:0006:1ab4:3000:0000:000a/64

          onhub        wlan0    wifi                                  10.0.1.3/24
                                       2001:0db8:0222:0002:3a3c:8dff:fe38:999b/64


$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code
        BorderRouter    18B4300000000006          AAA123
          ThreadNode    18B430000000000A          AAA123

FABRIC     Fabric Id           Global Prefix
                fab1     fd00:0000:fab1::/48

מכיוון שכל צומת Happy הוא מרחב שמות של רשת, הם מחולקים מהאינטרנט הציבורי כברירת מחדל. בדוק זאת על ידי הזנת צומת Happy ופינג כתובת אינטרנט ציבורית. נשתמש 8.8.8.8 , אחת מהכתובות google.com של IPv4.

$ happy-shell onhub
root@onhub:# ping -c2 8.8.8.8
connect: Network is unreachable

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

צא מהצומת:

root@onhub:# exit

לקבוע את ממשק חיבור האינטרנט שלך עם route הפקודה:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.0     0.0.0.0         UG    0      0        0 em1

מצא את default המסלול. זהו חיבור האינטרנט עבור מכונת הלינוקס שלך. Iface הטור מציין איזה ממשק נמצא בשימוש עבור קישוריות. בדוגמה לעיל, זה em1 .

השתמש happy-internet להקים את הגשר, באמצעות הממשק עבור נתיב ברירת המחדל שלך. עבור --isp הדגל, להשתמש בשם ממשק בלי נגרר מספרים. בדוגמה זו, זה em . אם ממשק ברירת המחדל שלך היא eth1 , את --isp שהדגל יהיה eth .

$ happy-internet --node onhub --interface em1 --isp em --seed 249

לא יהיה שינוי גלוי happy-state הפלט, אבל onhub הצומת צריכה קישוריות לאינטרנט. בוא נחזור לצומת ונבדוק:

$ happy-shell onhub
root@onhub:# ping -c2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.81 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.81 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.814/1.816/1.819/0.042 ms

הַצלָחָה!

c4d411ab1734131.png

DNS

לצמתים שמחים אין יכולות DNS מובנות. אם תנסה לעשות פינג ל-google.com, זה נכשל:

root@onhub:# ping -c2 google.com
ping: unknown host google.com

למרבה המזל, Happy מספקת תמיכה ב-DNS. צא מהצומת ומצא את שרתי ה-DNS עבור מחשב הלינוקס שלך. הקפד להשתמש בממשק ברירת המחדל המתאים:

root@onhub:# exit
$ nmcli dev list iface em1 | grep domain_name_servers
DHCP4.OPTION[13]:                       domain_name_servers = 172.16.255.1 172.16.255.153 172.16.255.53

השתמשו כתובות DNS אלה עם happy-dns :

$ happy-dns 172.16.255.1 172.16.255.153 172.16.255.53

עכשיו מנסים פינג google.com מתוך onhub הצומת:

$ happy-shell onhub
root@onhub:# ping -c2 google.com
PING google.com (64.233.191.113) 56(84) bytes of data.
64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=1 ttl=46 time=36.9 ms
64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=2 ttl=46 time=37.0 ms

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 36.978/36.995/37.013/0.193 ms

יציאת onhub הצומת כשאתה מסיים:

root@onhub:# exit

מנהרה לארוג

כמו השירות המדומה, יש להקים מנהרת Weave בין ה-HAN המדומה ב-Happy לבין השירות. עם שירות ענן אמיתי, השתמש בכתובת ה-IP או בכתובת האתר של השירות בהגדרת המנהרה. לדוגמה:

$ weave-tunnel-start BorderRouter mycloud.service.com

3ed2c3c0df67f4d2.png

9. ניקיון

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

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

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

לאחר מכן, מחק את המצב שמח:

$ happy-state-delete

לפעמים, קבצי מצב מסוימים עשויים להישאר לאחר מחיקת מצב. אם אתה נתקלת בבעיות ו Happy אינו פועל כצפוי, למחוק את המדינה עם happy-state-delete ולאחר מכן להשתמש בפקודות הבאות כדי לכפות שום דבר נקי נותר:

$ ip netns | xargs -I {} sudo ip netns delete {}
$ rm -rf ~/.*state.json
$ rm -rf ~/.*state.json.lock

המחשב שלך אמור לחזור לתצורת הרשת הרגילה שלו.

10. מזל טוב!

עכשיו אתה יודע:

  • כיצד להשתמש ב-Happy כדי לדמות את רשתות ה-IoT הביתיות שלך
  • כיצד לחבר טופולוגיות Happy לאינטרנט
  • היסודות של Weave באמצעות OpenWeave, גרסת הקוד הפתוח של Nest של Weave

הצעדים הבאים

בהתבסס על Codelab זה, נסה את התרגילים הבאים:

  • צור טופולוגיה גדולה יותר עם מספר צמתים בכל רשת Thread ו-Wi-Fi, וצור קישוריות בין כל הצמתים
  • צור סקריפט bash כדי לטעון את הטופולוגיה באמצעות happy-state-load או weave-state-load
  • חקור פקודות Happy אחרים, כגון happy-traceroute ו happy-process-*

לקריאה נוספת

בדוק openweave.io עבור מגוון רחב של אזכור, כולל:

f6996428fb06dede.png