الابتداء مع سعيد ونسج

1 المقدمة

سعيد هو أداة التي تم إنشاؤها من قبل مختبرات عش لتزامن خفيفة الوزن من بنى الشبكات المحاكاة. برنامج Happy مفيد لتطوير واختبار شبكات المنطقة المنزلية لإنترنت الأشياء.

مع Happy ، يمكنك:

  • اختبر بروتوكولات الشبكة وبرامج التنفيذ الموزعة الأخرى على جهاز تطوير Linux واحد دون استخدام أجهزة جهاز إنترنت الأشياء
  • قم بإجراء اختبار وظيفي آلي عبر الشبكة
  • قم بتشغيل عدة شبكات متوازية ومتزامنة على نفس النظام لتحسين إنتاجية الاختبار

في هذا Codelab، سوف تتعلم كيفية البدء مع سعيد، فضلا عن أساسيات نسج لأجهزة تقنيات عمليات. تنفيذ نسج عليك هو استخدام OpenWeave ، وهو نسخة مفتوحة المصدر الصادرة عن عش.

f6996428fb06dede.png

ماذا ستتعلم

  • كيف نبني Happy و OpenWeave
  • كيفية إنشاء شبكة محاكاة إنترنت الأشياء يدويًا
  • كيفية إدارة طبولوجيا مخصصة
  • كيفية توصيل شبكة Happy محاكاة بالإنترنت
  • أساسيات النسج

ماذا ستحتاج

  • جهاز Linux ، مادي أو افتراضي
  • عميل Git أو 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:

$ 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

يمكن الوصول إلى أوامر النسج المطلوبة في 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 هذا ، يتم توصيل عقدتين معًا في شبكة خيط ، وتتصل إحدى هذه العقد بثالثة عبر 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

الخطوة الأخيرة في إنشاء شبكتنا السعيدة هي تعيين عناوين IP لكل واجهة على كل عقدة. حدد بادئة IP للشبكة ، وسيقوم Happy تلقائيًا بتعيين عناوين IP لك.

نظرًا لأن بروتوكول Thread يستخدم IPv6 ، أضف بادئة IPv6 إلى شبكة مؤشر الترابط:

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

تحقق من الحالة السعيدة. تحتوي واجهات مؤشر الترابط في كل عقدة مؤشر ترابط على عناوين 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. اختبر الاتصال

والآن بعد أن شبكة سعيدة لدينا وتشغيلها، دعونا اختبار الاتصال به من الأزيز العقد الأخرى من 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 ، أضف المسارات المناسبة لكل عقدة في كل شبكة ، في كلا الاتجاهين (حتى يعرف ping كيفية العودة إلى العقدة المصدر).

لكل عقدة ، ستحتاج إلى معرفة:

  • أقرب شبكة بوابة في هذه الحالة، 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).

نظرًا لأننا أضفنا مسارات الشبكة إلى كلا الجانبين ، فلنعمل ping عبر الشبكات:

$ 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).

إنشاء النسيج نسج لHAN، وذلك باستخدام fab1 باسم ID النسيج، ثم تكوين كافة العقد لنسج:

$ 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

تمت إضافة كل عقدة في النسيج نسج، ولكل واجهة لديه عنوان IPv6 الجديد بدءا fd00 . للحصول على مزيد من المعلومات على النسيج نسج، استخدم 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 and Happy States. بداية دعونا مع النسيج من weave-state :

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

استخدامات نسج بادئة ب IPv6 من fd00::/48 لكل عقدة. تسمى العناوين الموجودة في هذه المجموعة بالعناوين المحلية الفريدة وهي مخصصة للاستخدام داخل الشبكات الخاصة مثل HAN. يؤدي دمج ذلك مع معرف النسيج إلى إنشاء بادئة Weave Global الموضحة أعلاه.

نسج العقد

يتم تعيين معرف عقدة فريد لكل عقدة في نسيج Weave ، إلى جانب رمز الاقتران:

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

يحدد معرف العقدة بشكل عام عقدة في نسيج النسج. يتم استخدام رمز الاقتران كـ "بيانات اعتماد نجار" أثناء عملية الاقتران ، وعادةً ما تتم طباعته جنبًا إلى جنب مع رمز الاستجابة السريعة للمنتج.

على سبيل المثال ، إذا نظرت إلى رمز الاستجابة السريعة الموجود على Nest Protect أو Nest Cam ، فستلاحظ سلسلة مكونة من 6 أحرف ، وغالبًا ما يشار إليها باسم Entry Key. هذا هو رمز الاقتران النسج.

e7c6fa3e24d61d1b.png

يستخدم Weave مجموعة من البادئة العالمية ومعرف النسيج ومعرف العقدة لإنشاء عناوين IPv6 خاصة بالنسج لكل عقدة وواجهة في النسيج.

نسج العناوين

علما بأن هناك أربعة عناوين IPv6 جديدة في طوبولوجيا سعيد، عن البدء مع شركائنا في نسج العالمية البادئة من 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 network gateway ـ الموجودة عادةً على جهاز توجيه Thread Border ـ هذه الوظيفة.

في نموذج الهيكل الخاص بنا ، لنقم بتعيين عقدة BorderRouter كبوابة شبكة Weave:

$ weave-network-gateway ThreadNetwork 02BorderRouter

يضيف هذا الأمر طريقا من كافة العقد الموضوع إلى الشبكة الفرعية النسيج نسج ( fd:0:fab1::/48 ) عن طريق BorderRouter العقدة واجهة الموضوع ( wpan0 )، التي تمكن كل عقدة الموضوع للوصول إلى أي عقدة نسج خارج شبكة الموضوع. هذا هو مماثل ل happy-network-route القيادة كنا في وقت سابق، ولكن محددة إلى طرق النسيج نسج.

6. صيانة الطوبولوجيا

ما يجعل 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-state-load - دعامات المساعد نسج

حتى إذا تضمن الهيكل الخاص نسج، دائما استخدام weave-state-load الأوامر بحيث يتم تطبيق النسيج نسج والتكوين المرتبطة بها.

إعادة تحميل طبولوجيا 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

تم توفير عدد من الهياكل المحددة مسبقًا في المستودع السعيد ، بتنسيق shell-script و JSON. العثور عليها في ~/happy/topologies .

يأتي OpenWeave أيضًا مع طبولوجيا Happy محددة مسبقًا لأغراض الاختبار. العثور عليها في ~/openweave-core/src/test-apps/happy/topologies/standalone .

7. كيف يعمل

يستخدم Happy مساحات أسماء شبكات Linux لمحاكاة الطبولوجيا المعقدة. عادةً ما يتم تطبيق تكوين الشبكة عبر نظام التشغيل Linux بالكامل. تسمح لك مساحات أسماء الشبكات بتقسيم تكوينات الشبكة بحيث يكون لكل مساحة اسم مجموعتها الخاصة من الواجهات وجداول التوجيه.

كل عقدة وشبكة في 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.

تحقق من تكوين الواجهة للعقدة. سيكون هذا مختلفًا عن التكوين على مستوى نظام التشغيل الخاص بك ويجب أن يعكس ما هو مدرج في الحالة السعيدة:

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 لمساحات شبكة Linux ، قد تدرك الآن أنه من الممكن توصيل شبكة Happy محاكاة بالإنترنت والوصول إلى العناوين العامة من داخل عقد محاكاة. هذا مفيد لتوصيل أجهزتك المحاكاة بخدمة حقيقية (مثل Nest Service over Weave).

الخدمة في Weave عبارة عن بنية تحتية قائمة على السحابة تربط عقد HAN بنموذج بيانات ، وتوفر الوصول عن بُعد ، وتنفذ وحدات تحكم ذكية لإنشاء نظام بيئي شامل.

يمكن تمثيل الخدمة بطريقتين أساسيتين مع Happy:

  • كخدمة محاكاة في مساحة اسم الشبكة الخاصة بها (العقدة السعيدة)
  • كخدمة سحابية حقيقية على الإنترنت

قدمت طبولوجيا محددة مسبقا في ~/happy/topologies كمثال على كل سيناريو الخدمة.

خدمة محاكاة على عقدة سعيدة

قم بإزالة أي طبولوجيا سعيدة موجودة:

$ happy-state-delete

تؤكد دولة فارغة مع happy-state و weave-state الأوامر.

قم بتحميل طبولوجيا محددة مسبقًا بنقطة الوصول (AP) وعقد الخدمة:

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

6d04cbfcc84038e2.png

تحقق من حالات Happy and 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 العقدة هي بوابة شبكة نسج، الذي يعمل بمثابة نقطة نهاية النفق على HAN.

إنشاء نفق النسج:

$ weave-tunnel-start BorderRouter cloud

أعد فحص الحالة السعيدة. يجب أن تشاهد واجهة نفق جديدة مع عنوان 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

يمكنك الآن تنفيذ الأمر ping بنجاح بين العقد على Weave fabric والبادئة العامة 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-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

نظرًا لأن كل عقدة سعيدة عبارة عن مساحة اسم شبكة ، يتم تقسيمها افتراضيًا من الإنترنت العام. اختبر ذلك عن طريق إدخال عقدة سعيدة وأخذ اختبار الاتصال على عنوان إنترنت عام. سنستخدم 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 الطريق. هذا هو اتصال الإنترنت لجهاز Linux الخاص بك. و 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 مضمنة. إذا حاولت تنفيذ الأمر ping google.com ، فسوف يفشل:

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

لحسن الحظ ، يوفر Happy دعمًا لـ DNS. اخرج من العقدة وابحث عن خوادم DNS لجهاز Linux الخاص بك. تأكد من استخدام الواجهة الافتراضية المناسبة:

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

نفق نسج

مثل الخدمة المحاكاة ، يجب إنشاء نفق نسج بين HAN المحاكى في Happy والخدمة. باستخدام خدمة سحابية حقيقية ، استخدم عنوان IP أو عنوان URL للخدمة في إعداد النفق. على سبيل المثال:

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

3ed2c3c0df67f4d2.png

9. التنظيف

من المهم دائمًا تنظيف الهياكل السعيدة عند الانتهاء منها ، لتجنب المشكلات المتعلقة بتكوين شبكة Linux.

إذا قمت بتمكين دعم DNS في طوبولوجيا الخاص بك، إزالته من قبل rerunning هذا الأمر مع -d (حذف) العلم لأول مرة. يجب تشغيل هذا قبل إزالة أي عقد سعيدة ، لضمان تحديث تكوين الشبكة بشكل صحيح.

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

بعد ذلك ، احذف الحالة السعيدة:

$ happy-state-delete

من حين لآخر ، قد تبقى بعض ملفات الحالة بعد حذف الحالة. إذا واجهت مشاكل ولا يعمل المتوقع كما سعيد، وحذف الدولة مع happy-state-delete ومن ثم استخدم الأوامر التالية لفرض أي تنظيف المتبقية:

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

يجب أن يعود جهازك إلى تكوين الشبكة الطبيعي.

10. مبروك!

أنت تعرف الآن:

  • كيفية استخدام تطبيق Happy لمحاكاة شبكات منطقة منزلك الخاصة بإنترنت الأشياء
  • كيفية توصيل طبولوجيا Happy بشبكة الإنترنت
  • أساسيات Weave via OpenWeave ، نسخة نيست مفتوحة المصدر من Weave

الخطوات التالية

بناء على Codelab هذا ، جرب التمارين التالية:

  • قم بإنشاء هيكل أكبر مع عقد متعددة في كل شبكة خيط وشبكة Wi-Fi ، وقم بإنشاء اتصال بين جميع العقد
  • إنشاء برنامج نصي باش تحميل طوبولوجيا عبر happy-state-load أو weave-state-load
  • استكشاف الأوامر السعيدة الأخرى، مثل happy-traceroute و happy-process-*

قراءة متعمقة

تحقق openweave.io لمجموعة متنوعة من المراجع، بما في ذلك:

f6996428fb06dede.png