1. معرفی
Happy ابزاری است که توسط Nest labs برای ارکستراسیون سبک توپولوژی های شبکه شبیه سازی شده ایجاد شده است. Happy برای توسعه و آزمایش شبکه های خانگی IoT مفید است.
با Happy، شما می توانید:
- تست پروتکل های شبکه و سایر برنامه های اجرایی توزیع شده بر روی یک ماشین توسعه لینوکس بدون استفاده از سخت افزار دستگاه اینترنت اشیا
- انجام تست عملکرد خودکار در سراسر یک شبکه
- چندین شبکه همزمان و موازی را در یک سیستم برای بهبود توان آزمایشی اجرا کنید
در این Codelab، نحوه شروع کار با Happy و همچنین اصول اولیه Weave برای دستگاه های IoT را خواهید آموخت. اجرای Weave که استفاده می کنید OpenWeave است، یک نسخه منبع باز که توسط Nest منتشر شده است.
چیزی که یاد خواهید گرفت
- چگونه 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 ایجاد کنیم.
این توپولوژی نمونه ای از یک شبکه ساده خانگی (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
توپولوژی ما اکنون به شکل زیر است:
آخرین مرحله در ایجاد شبکه 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
توپولوژی به روز شده ما در اینجا است:
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
می تواند مستقیماً به آن دسترسی پیدا کند:
آدرسهای IPv6 دیگر ناموفق هستند زیرا ارسال بین wpan0
و 02BorderRouter
wlan0
نشده است. بنابراین، 01ThreadNode
هیچ تصوری از وجود 03WiFiNode
یا نحوه دسترسی به آن ندارد. Happy شبکه شبیه سازی شده را معرفی کرده است، اما همه مسیریابی و ارسال بین گره ها را فعال نکرده است.
اضافه کردن مسیرها
برای هدایت ترافیک IPv6 در سراسر HAN، مسیرهای مناسب را به هر گره در هر شبکه، در هر دو جهت اضافه کنید (تا پینگ بداند چگونه به گره منبع بازگردد).
برای هر گره، باید بدانید:
- نزدیکترین دروازه شبکه - در این مورد،
02BorderRouter
برای هر دو - شبکه هدف - پس از دروازه کجا برویم
برای شبکه سه گره ما، این موارد زیر را به ما می دهد:
از شبکه منبع | به شبکه هدف | از طریق دروازه |
| | |
| | |
این را می توان به صورت جداگانه برای هر گره با 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 کاملاً کاربردی و شبیه سازی شده دارید.
برای فعال کردن روش ایمن تر و مطمئن تر برای اتصال همه چیز به یکدیگر، اجازه دهید 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 به رنگ آبی در اینجا آمده است:
پارچه ببافید
اطلاعات جدید زیادی در ایالت های 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 گفته میشود. این کد جفت شدن بافت است.
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 یک فضای نام شبکه است، در حالی که پیوندهای بین آنها رابط شبکه هستند.
به عنوان مثال، با استفاده از توپولوژی ما:
بیایید ببینیم که 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",
گزارش های زمان اجرا
دستورات صادر شده به گره ها، دستورات پایه ترمینال هستند که از داخل فضای نام هر گره اجرا می شوند. یک راه آسان برای دیدن این، فعال کردن گزارشهای زمان اجرای 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
برای تایید توپولوژی حالت 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
اکنون می توانید با موفقیت بین گره های روی پارچه 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
در این توپولوژی، 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
موفقیت!
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
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 را برای منابع مختلف بررسی کنید، از جمله: