شروع با Happy and Weave

1. معرفی

Happy ابزاری است که توسط Nest labs برای ارکستراسیون سبک توپولوژی های شبکه شبیه سازی شده ایجاد شده است. Happy برای توسعه و آزمایش شبکه های خانگی IoT مفید است.

با Happy، شما می توانید:

  • تست پروتکل های شبکه و سایر برنامه های اجرایی توزیع شده بر روی یک ماشین توسعه لینوکس بدون استفاده از سخت افزار دستگاه اینترنت اشیا
  • انجام تست عملکرد خودکار در سراسر یک شبکه
  • چندین شبکه همزمان و موازی را در یک سیستم برای بهبود توان آزمایشی اجرا کنید

در این Codelab، نحوه شروع کار با Happy و همچنین اصول اولیه Weave برای دستگاه های IoT را خواهید آموخت. اجرای Weave که استفاده می کنید OpenWeave است، یک نسخه منبع باز که توسط Nest منتشر شده است.

f6996428fb06dede.png

چیزی که یاد خواهید گرفت

  • چگونه Happy و OpenWeave بسازیم
  • چگونه به صورت دستی یک شبکه IoT شبیه سازی شده ایجاد کنیم
  • نحوه مدیریت توپولوژی های سفارشی
  • نحوه اتصال یک شبکه شبیه سازی شده Happy به اینترنت
  • اصول اولیه بافت

آنچه شما نیاز دارید

  • یک ماشین لینوکس، فیزیکی یا مجازی
  • کلاینت یا cli Git
  • پایتون 2.7
  • درک اولیه از مفاهیم شبکه و مسیریابی

2. شروع کنید

Toolchain و Dependencies را نصب کنید

برای ساخت 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 اکنون باید از خط فرمان قابل دسترسی باشند:

$ 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 را پیدا کند. پیکربندی Happy را با مسیر /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 خود را با مسیر مورد استفاده برای باینری های Happy به روز کنید:

$ 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 و 02BorderRouter wlan0 نشده است. بنابراین، 01ThreadNode هیچ تصوری از وجود 03WiFiNode یا نحوه دسترسی به آن ندارد. Happy شبکه شبیه سازی شده را معرفی کرده است، اما همه مسیریابی و ارسال بین گره ها را فعال نکرده است.

اضافه کردن مسیرها

برای هدایت ترافیک IPv6 در سراسر HAN، مسیرهای مناسب را به هر گره در هر شبکه، در هر دو جهت اضافه کنید (تا پینگ بداند چگونه به گره منبع بازگردد).

برای هر گره، باید بدانید:

  • نزدیکترین دروازه شبکه - در این مورد، 02BorderRouter برای هر دو
  • شبکه هدف - پس از دروازه کجا برویم

برای شبکه سه گره ما، این موارد زیر را به ما می دهد:

از شبکه منبع

به شبکه هدف

از طریق دروازه

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 همانطور که انتظار می رود کار می کند. شما اکنون یک IPv6 HAN کاملاً کاربردی و شبیه سازی شده دارید.

5bb53be0280b3320.png

برای فعال کردن روش ایمن تر و مطمئن تر برای اتصال همه چیز به یکدیگر، اجازه دهید Weave را در بالای HAN اضافه کنیم.

5. بافت را اضافه کنید

Weave یک لایه کاربردی شبکه است که ستون فقرات ارتباطی ایمن و قابل اعتماد را برای محصولات Nest فراهم می کند. ما می توانیم قابلیت Weave را با OpenWeave، نسخه متن باز Weave اضافه کنیم.

اجرای Weave را "پارچه" می نامند. بافت بافت شبکه‌ای است که شامل تمام گره‌های HAN، سرویس Nest و هر دستگاه تلفن همراهی است که در HAN شرکت می‌کند. در بالای HAN قرار می گیرد و مسیریابی آسان تر را در بین فناوری های مختلف پیوند شبکه (مثلاً Thread یا Wi-Fi) امکان پذیر می کند.

پارچه Weave را برای HAN خود با استفاده از fab1 به عنوان شناسه فابریک ایجاد کنید، سپس تمام گره ها را برای Weave پیکربندی کنید:

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

اکنون که Weave پیکربندی شده است، وضعیت Happy را بررسی کنید:

$ 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 برای هر گره استفاده می کند. آدرس‌های این بلوک، آدرس‌های محلی منحصربه‌فرد نامیده می‌شوند و برای استفاده در شبکه‌های خصوصی مانند HAN تعیین شده‌اند. ترکیب آن با Fabric ID، پیشوند جهانی Weave را ایجاد می کند که در بالا نشان داده شده است.

گره ها را ببافید

به هر گره در پارچه Weave یک شناسه گره منحصر به فرد به همراه یک کد جفتی اختصاص داده می شود:

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

شناسه Node به صورت سراسری یک گره را در پارچه Weave شناسایی می کند. کد جفت‌سازی به‌عنوان یک «معتبر اتصال» در طول فرآیند جفت‌سازی استفاده می‌شود و معمولاً در کنار کد QR محصول چاپ می‌شود.

برای مثال، اگر به کد QR در Nest Protect یا Nest Cam نگاه کنید، متوجه یک رشته 6 نویسه‌ای خواهید شد که اغلب به آن Entry Key گفته می‌شود. این کد جفت شدن بافت است.

e7c6fa3e24d61d1b.png

Weave از ترکیبی از Global Prefix، Fabric ID و Node ID برای ایجاد آدرس های IPv6 خاص Weave برای هر گره و رابط در پارچه استفاده می کند.

آدرس ها را ببافید

توجه داشته باشید که چهار آدرس IPv6 جدید در توپولوژی Happy وجود دارد که همگی با پیشوند Weave Global ما از 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 اختصاص داده شده به هر گره.

بافت دروازه شبکه

گره‌های بافت در یک شبکه Thread باید بدانند کجا از آن شبکه خارج شوند. یک دروازه شبکه Weave - معمولاً روی یک مسیریاب مرزی - این قابلیت را ارائه می دهد.

در توپولوژی نمونه خود، اجازه دهید گره BorderRouter را به عنوان دروازه شبکه Weave تعیین کنیم:

$ weave-network-gateway ThreadNetwork 02BorderRouter

این دستور یک مسیر از تمام گره های Thread به زیرشبکه بافت Weave ( fd:0:fab1::/48 ) از طریق رابط Thread گره BorderRouter ( wpan0 ) اضافه می کند، که به هر گره Thread امکان می دهد به هر گره Weave فراتر از شبکه Thread برسد. این مشابه فرمان happy-network-route که قبلاً استفاده کردیم، اما مخصوص مسیرهای پارچه Weave است.

6. نگهداری توپولوژی

چیزی که Happy را بسیار قدرتمند می کند این است که چگونه به راحتی تمام تنظیمات و تخریب توپولوژی شبیه سازی شده را مدیریت می کند.

توپولوژی Happy خود را برای استفاده بعدی ذخیره کنید:

$ happy-state -s codelab.json

این یک فایل JSON با توپولوژی کامل در پوشه ریشه ~/ شما قرار می دهد. فایل JSON یک کپی از حالت مبارک فعلی شما است که در ~/.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، هم در قالب پوسته اسکریپت و هم در قالب 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 است.

یک پنجره ترمینال دوم را باز کنید و لاگ ها را روشن کنید، آنها به طور مداوم در این پنجره اجرا می شوند:

$ happy-state -l

به پنجره اول برگردید و پینگ Happy اجرا کنید:

$ 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 برای اجرای دستورات non-Happy طوری استفاده کنید که انگار به یکی از گره ها وارد شده اید (فضای نام شبکه):

$ 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 است که به عنوان نقطه پایانی تونل در HAN عمل می کند.

ایجاد تونل بافت:

$ weave-tunnel-start BorderRouter cloud

وضعیت شاد را دوباره بررسی کنید. باید یک رابط تونل جدید با آدرس Weave IPv6 در گره 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 ، یکی از آدرس‌های IPv4 google.com استفاده خواهیم کرد.

$ 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 یا URL سرویس در راه اندازی تونل استفاده کنید. مثلا:

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

3ed2c3c0df67f4d2.png

9. تمیز کردن

مهم است که همیشه توپولوژی های Happy را پس از پایان کار با آنها تمیز کنید تا از مشکلاتی در پیکربندی شبکه لینوکس خود جلوگیری کنید.

اگر پشتیبانی DNS را در توپولوژی خود فعال کرده اید، ابتدا با اجرای مجدد آن دستور با پرچم -d (حذف) آن را حذف کنید. این باید قبل از حذف هر گره Happy اجرا شود تا مطمئن شوید که پیکربندی شبکه به درستی به روز شده است.

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

سپس حالت Happy را حذف کنید:

$ 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 برای شبیه سازی شبکه های خانگی اینترنت اشیا خود استفاده کنید
  • نحوه اتصال توپولوژی های Happy به اینترنت
  • اصول اولیه Weave از طریق OpenWeave، نسخه منبع باز Weave Nest

مراحل بعدی

با استفاده از این Codelab، تمرینات زیر را امتحان کنید:

  • یک توپولوژی بزرگتر با چندین گره در هر Thread و شبکه Wi-Fi ایجاد کنید و بین همه گره ها ارتباط برقرار کنید.
  • ایجاد یک اسکریپت bash برای بارگذاری توپولوژی از طریق بارگذاری happy-state-load weave-state-load
  • سایر دستورات Happy را کاوش کنید، مانند happy-traceroute و happy-process-*

بیشتر خواندن

openweave.io را برای منابع مختلف بررسی کنید، از جمله:

f6996428fb06dede.png