Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

เริ่มต้นด้วย Happy and Weave

Happy เป็นเครื่องมือที่สร้างขึ้นโดยห้องปฏิบัติการ Nest สำหรับการจัดเรียงโทโพโลยีเครือข่ายแบบจำลองที่มีน้ำหนักเบา Happy มีประโยชน์สำหรับการพัฒนาและทดสอบเครือข่ายพื้นที่บ้าน IoT

ด้วยความสุขคุณสามารถ:

  • ทดสอบโปรโตคอลเครือข่ายและโปรแกรมดำเนินการแบบกระจายอื่น ๆ บนเครื่องพัฒนา Linux เครื่องเดียวโดยไม่ต้องใช้ฮาร์ดแวร์อุปกรณ์ IoT
  • ทำการทดสอบการทำงานอัตโนมัติในเครือข่าย
  • เรียกใช้เครือข่ายแบบขนานหลายเครือข่ายพร้อมกันบนระบบเดียวกันเพื่อปรับปรุงปริมาณงานทดสอบ

ใน Codelab นี้คุณจะได้เรียนรู้วิธีเริ่มต้นใช้งาน Happy ตลอดจนพื้นฐานของ Weave สำหรับอุปกรณ์ IoT การใช้งาน Weave ที่คุณจะใช้คือ OpenWeave ซึ่งเป็นเวอร์ชันโอเพนซอร์สที่ออกโดย Nest

f6996428fb06dede.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้าง Happy และ OpenWeave
  • วิธีสร้างเครือข่าย IoT จำลองด้วยตนเอง
  • วิธีจัดการโทโพโลยีแบบกำหนดเอง
  • วิธีเชื่อมต่อเครือข่าย Happy จำลองกับอินเทอร์เน็ต
  • พื้นฐานของ Weave

สิ่งที่คุณต้องการ

  • เครื่อง Linux แบบฟิสิคัลหรือเสมือน
  • ไคลเอนต์ Git หรือ cli
  • Python 2.7
  • ความเข้าใจพื้นฐานเกี่ยวกับแนวคิดระบบเครือข่ายและการกำหนดเส้นทาง

ติดตั้ง toolchain และการอ้างอิง

ในการสร้าง Happy and Weave ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง toolchain ที่รองรับและการอ้างอิงทั้งหมดแล้ว

$ 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 build ของคุณ:

$ 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 ของคุณด้วยพา ธ ที่ใช้สำหรับ Happy binaries:

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

มาสร้างโทโพโลยีสามโหนดต่อไปนี้ด้วย Happy

a3295ee87fbd9764.png

โทโพโลยีนี้เป็นตัวอย่างของ Home Area Network (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 นั่นเป็นเพราะในฐานะ Border Router ภายใน 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 ให้คุณโดยอัตโนมัติ

เนื่องจากโปรโตคอลเธรดใช้ 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

ตอนนี้เครือข่าย Happy ของเราพร้อมใช้งานแล้วมาทดสอบการเชื่อมต่อโดย ping โหนดอื่น ๆ จาก 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 พยายาม ping ทุกที่อยู่ IP สำหรับทุกอินเทอร์เฟซบนโหนดเป้าหมาย เราสามารถละเว้นที่อยู่ IPv4 ได้เนื่องจากเธรดใช้เฉพาะ IPv6

โปรดทราบว่ามีเพียง IPv6 ping เดียวเท่านั้นที่สามารถเข้าถึงได้: อันบน 02BorderRouter ของ wpan0 ซึ่งเป็นที่อยู่เดียวที่ 01ThreadNode สามารถเข้าถึงได้โดยตรง

5447bcbdf7d539df.png

ที่อยู่ IPv6 อื่นล้มเหลวเนื่องจากไม่ได้เปิดใช้งานการส่งต่อระหว่าง wpan0 และ wlan0 บน 02BorderRouter ดังนั้น 01ThreadNode จึงไม่รู้ว่ามี 03WiFiNode อยู่หรือจะเข้าถึงได้อย่างไร Happy ได้นำเสนอเครือข่ายจำลอง แต่ไม่ได้เปิดใช้งานการกำหนดเส้นทางและการส่งต่อระหว่างโหนดทั้งหมด

เพิ่มเส้นทาง

ในการกำหนดเส้นทางการรับส่งข้อมูล IPv6 ข้าม HAN ให้เพิ่มเส้นทางที่เหมาะสมให้กับแต่ละโหนดในแต่ละเครือข่ายทั้งสองทิศทาง (เพื่อให้ ping ทราบวิธีกลับไปยังโหนดต้นทาง)

สำหรับแต่ละโหนดคุณจะต้องทราบ:

  • เกตเวย์เครือข่ายที่ใกล้ที่สุด - ในกรณีนี้คือ 02BorderRouter สำหรับทั้งคู่
  • เครือข่ายเป้าหมาย - จะไปที่ไหนหลังจากเกตเวย์

สำหรับเครือข่ายโหนดทั้งสามของเราที่ให้สิ่งต่อไปนี้:

จาก Source Network

ไปยัง Target Network

ผ่านเกตเวย์

ThreadNetwork

WiFiNetwork

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

WiFiNetwork

ThreadNetwork

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

สิ่งนี้สามารถทำได้แยกกันสำหรับแต่ละโหนดที่มี happy-node-route แต่ทำได้ง่ายกว่าสำหรับโหนดทั้งหมดในแต่ละเครือข่ายที่มี happy-network-route

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

สำหรับคำอธิบายของแฟล็กบรรทัดคำสั่งให้ใช้ happy-network-route -h

คำสั่ง happy-network-route จะเปิดการส่งต่อ IPv4 และ IPv6 สำหรับแต่ละโหนดตามต้องการ สิ่งนี้ช่วยให้การรับส่งข้อมูลสามารถกำหนดเส้นทางจากอินเทอร์เฟซหนึ่งไปยังอีกอินเทอร์เฟซภายในโหนด

ตอนนี้ลอง ping อีกครั้ง:

$ 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 pings ทำงาน! เมื่อเปิดการส่งต่อจะรู้วิธีเข้าถึงอินเทอร์เฟซ wlan0 การ ping IPv4 ยังคงล้มเหลวเนื่องจากเรากำหนดค่าเส้นทางและการส่งต่อ IPv6 เท่านั้น (เนื่องจากเธรดไม่ทำงานผ่าน 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 ping ทำงานตามที่คาดไว้ ตอนนี้คุณมี IPv6 HAN จำลองที่ใช้งานได้เต็มรูปแบบแล้ว

5bb53be0280b3320.png

เพื่อให้สามารถเชื่อมต่อทุกอย่างเข้าด้วยกันได้อย่างปลอดภัยและเชื่อถือได้มากขึ้นเรามาเพิ่ม Weave ที่ด้านบนของ HAN

Weave เป็นเลเยอร์แอปพลิเคชันเครือข่ายที่ให้กระดูกสันหลังการสื่อสารที่ปลอดภัยและเชื่อถือได้สำหรับผลิตภัณฑ์ Nest เราสามารถเพิ่มฟังก์ชัน Weave ด้วย OpenWeave ซึ่งเป็นเวอร์ชันโอเพ่นซอร์สของ Weave

การใช้งานสานเรียกว่า "ผ้า" ผ้าสานเป็นเครือข่ายที่ประกอบด้วยโหนด HAN ทั้งหมดบริการ Nest และอุปกรณ์เคลื่อนที่ใด ๆ ที่เข้าร่วมใน HAN ตั้งอยู่ด้านบนของ HAN และช่วยให้สามารถกำหนดเส้นทางข้ามเทคโนโลยีการเชื่อมโยงเครือข่ายต่างๆได้ง่ายขึ้น (เช่นเธรดหรือ Wi-Fi)

สร้างผ้าสานสำหรับ HAN ของคุณโดยใช้ fab1 เป็นรหัสผ้าจากนั้นกำหนดค่าโหนดทั้งหมดสำหรับ Weave:

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

เมื่อกำหนดค่า Weave แล้วให้ตรวจสอบสถานะความสุข:

$ happy-state

State Name:  happy

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

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


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

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

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

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

แต่ละโหนดได้รับการเพิ่มเข้าไปใน Weave fabric และแต่ละอินเทอร์เฟซมีที่อยู่ IPv6 ใหม่โดยเริ่มต้นด้วย fd00 หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับผ้าสานให้ใช้คำสั่ง weave-state การ 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

นี่คือโทโพโลยีที่อัปเดตของเราโดยมีค่าสานเป็นสีน้ำเงิน:

ce3fa9082408355b.png

ผ้าสาน

มีข้อมูลใหม่มากมายในสถานะ Weave and Happy เริ่มต้นด้วยผ้าจาก weave-state :

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

Weave ใช้คำนำหน้า IPv6 ของ fd00::/48 สำหรับแต่ละโหนด ที่อยู่ในบล็อกนี้เรียกว่า Unique Local Addresses และถูกกำหนดให้ใช้ภายในเครือข่ายส่วนตัวเช่น HAN เมื่อรวมเข้ากับ Fabric ID จะสร้างคำนำหน้าแบบรวมของ Weave ที่แสดงด้านบน

โหนดสาน

แต่ละโหนดในแฟบริก Weave จะถูกกำหนด Node ID ที่ไม่ซ้ำกันพร้อมกับรหัสการจับคู่:

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

Node ID ระบุโหนดในแฟบริก Weave รหัสการจับคู่ใช้เป็น "ข้อมูลประจำตัวผู้เข้าร่วม" ในระหว่างขั้นตอนการจับคู่และโดยทั่วไปจะพิมพ์ควบคู่ไปกับรหัส QR ของผลิตภัณฑ์

ตัวอย่างเช่นหากคุณดูโค้ด QR บน Nest Protect หรือ Nest Cam คุณจะสังเกตเห็นสตริง 6 อักขระซึ่งมักเรียกกันว่า Entry Key นี่คือรหัสการจับคู่แบบสาน

e7c6fa3e24d61d1b.png

Weave ใช้การรวมกันของ Global Prefix, Fabric ID และ Node ID เพื่อสร้างที่อยู่ IPv6 เฉพาะ Weave สำหรับแต่ละโหนดและอินเทอร์เฟซในแฟบริค

ที่อยู่สาน

โปรดทราบว่ามีที่อยู่ IPv6 ใหม่สี่รายการใน Happy topology โดยทั้งหมดเริ่มต้นด้วย Weave Global Prefix ของเราที่ 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 แทนที่จะเป็นที่อยู่ IPv6 มาตรฐานที่กำหนดให้กับแต่ละโหนด

เกตเวย์เครือข่ายสาน

โหนดสานบนเครือข่ายเธรดจำเป็นต้องทราบว่าจะออกจากเครือข่ายนั้นได้ที่ไหน เกตเวย์เครือข่ายแบบสานซึ่งโดยทั่วไปจะอยู่ในเธรด Border Router ให้ฟังก์ชันนี้

ในโทโพโลยีตัวอย่างของเราให้กำหนดโหนด BorderRouter เป็นเกตเวย์เครือข่ายสาน:

$ weave-network-gateway ThreadNetwork 02BorderRouter

คำสั่งนี้จะเพิ่มเส้นทางจากโหนดกระทู้ทั้งหมดไปยังเครือข่ายย่อยสานผ้า ( fd:0:fab1::/48 ) ผ่านทาง BorderRouter โหนดอินเตอร์เฟซของกระทู้ ( wpan0 ) ที่ช่วยให้แต่ละโหนดกระทู้ไปถึงโหนดสานใด ๆ ที่นอกเหนือจากเครือข่ายเธรด สิ่งนี้คล้ายคลึงกับคำสั่ง happy-network-route เราใช้ก่อนหน้านี้ แต่เฉพาะสำหรับเส้นทาง Weave fabric

สิ่งที่ทำให้ Happy มีประสิทธิภาพมากก็คือวิธีจัดการการตั้งค่าและการแยกโครงสร้างโทโพโลยีจำลองทั้งหมดอย่างง่ายดาย

บันทึกโทโพโลยี Happy ของคุณเพื่อใช้ในภายหลัง:

$ happy-state -s codelab.json

สิ่งนี้จะวางไฟล์ JSON พร้อมโทโพโลยีที่สมบูรณ์ในรูท ~/ โฟลเดอร์ของคุณ ไฟล์ JSON เป็นสำเนาของสถานะความสุขปัจจุบันของคุณซึ่งอยู่ที่ ~/.happy_state.json

เมื่อบันทึกแล้วให้ลบโทโพโลยีปัจจุบัน:

$ happy-state-delete

ซึ่งจะลบเนมสเปซเครือข่ายทั้งหมดและคอนฟิกูเรชันที่เกี่ยวข้องที่พบในไฟล์ ~/.happy-state.json ตรวจสอบ happy-state และ 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-state-load เสมอเพื่อให้ใช้ผ้า Weave และคอนฟิกูเรชันที่เกี่ยวข้อง

โหลดโทโพโลยี Happy ที่บันทึกไว้ใหม่:

$ weave-state-load codelab.json

ตรวจสอบสถานะทั้งหมดเพื่อยืนยันการโหลดสำเร็จ:

00073 หัว 70

โทโพโลยีที่กำหนดไว้ล่วงหน้าจำนวนหนึ่งถูกจัดเตรียมไว้ในที่เก็บ Happy ทั้งในรูปแบบเชลล์สคริปต์และ JSON ค้นหาได้ที่ ~/happy/topologies

OpenWeave ยังมาพร้อมกับโทโพโลยี Happy ที่กำหนดไว้ล่วงหน้าเพื่อวัตถุประสงค์ในการทดสอบ ค้นหาได้ที่ ~/openweave-core/src/test-apps/happy/topologies/standalone

Happy ใช้เนมสเปซเครือข่าย Linux เพื่อจำลองโทโพโลยีที่ซับซ้อน โดยทั่วไปการกำหนดค่าเครือข่ายจะใช้กับระบบปฏิบัติการ Linux ทั้งหมด เนมสเปซเครือข่ายอนุญาตให้คุณแบ่งพาร์ติชันคอนฟิกูเรชันเครือข่ายเพื่อให้แต่ละเนมสเปซมีชุดอินเทอร์เฟซและตารางเส้นทางของตัวเอง

แต่ละโหนดและเครือข่ายใน Happy เป็นเนมสเปซเครือข่ายในขณะที่การเชื่อมโยงระหว่างโหนดเหล่านี้เป็นอินเทอร์เฟซเครือข่าย

ตัวอย่างเช่นการใช้โทโพโลยีของเรา:

7d6654c2e4907f2a.png

มาดูกันว่าเนมสเปซใดที่ Happy สร้างขึ้นเพื่อสิ่งนี้:

$ ip netns list
happy004
happy003
happy002
happy001
happy000

หากคุณตรวจสอบส่วน netns ของไฟล์ Happy state 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 ping:

$ 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 namespace ( 01ThreadNode )

ป้อนโหนด

ใช้ happy-shell เพื่อรันคำสั่งที่ไม่ใช่ Happy ราวกับว่าล็อกอินเข้าสู่โหนดใดโหนดหนึ่ง (เนมสเปซเครือข่าย):

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

อุปกรณ์จำลองจะทำงานภายในแต่ละเนมสเปซและเข้าถึงได้เฉพาะการกำหนดค่าเครือข่ายที่ระบุผ่าน Happy

ตรวจสอบคอนฟิกูเรชันอินเทอร์เฟซสำหรับโหนด สิ่งนี้จะแตกต่างจากการกำหนดค่าทั้ง OS ของคุณและควรแสดงถึงสิ่งที่ระบุไว้ในสถานะ 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

ด้วยความเข้าใจว่า Happy ใช้เนมสเปซเครือข่าย Linux อย่างไรตอนนี้คุณอาจทราบแล้วว่าสามารถเชื่อมต่อเครือข่าย Happy จำลองกับอินเทอร์เน็ตและเข้าถึงที่อยู่สาธารณะจากภายในโหนดจำลองได้ สิ่งนี้มีประโยชน์สำหรับการเชื่อมต่ออุปกรณ์จำลองของคุณกับบริการจริง (เช่น Nest Service over Weave)

บริการใน Weave เป็นโครงสร้างพื้นฐานบนคลาวด์ที่เชื่อมต่อโหนด HAN เข้ากับโมเดลข้อมูลให้การเข้าถึงระยะไกลและใช้ตัวควบคุมอัจฉริยะเพื่อสร้างระบบนิเวศที่ครอบคลุม

บริการสามารถแสดงได้สองวิธีหลักด้วย Happy:

  • เป็นบริการจำลองในเนมสเปซเครือข่ายของตนเอง (Happy node)
  • ในฐานะบริการคลาวด์จริงบนอินเทอร์เน็ต

โทโพโลยีที่กำหนดไว้ล่วงหน้าได้รับการจัดเตรียมไว้ใน ~/happy/topologies เป็นตัวอย่างของสถานการณ์การให้บริการแต่ละแบบ

บริการจำลองบนโหนด 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

อุโมงค์สาน

อุโมงค์สานเชื่อมต่อผ้าสานเข้ากับบริการ นี่คือเส้นทางที่ปลอดภัยซึ่งถ่ายโอนข้อความ IPv6 UDP ระหว่าง HAN และบริการ ในโทโพโลยีนี้โหนด BorderRouter คือเกตเวย์เครือข่ายสานซึ่งทำหน้าที่เป็นจุดสิ้นสุดของอุโมงค์บน 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

ตอนนี้คุณสามารถ ping ระหว่างโหนดบนผ้าสานและคำนำหน้าทั่วโลก 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 topologies ที่มีอยู่:

$ 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 node และส่ง Ping ไปยังที่อยู่อินเทอร์เน็ตสาธารณะ เราจะใช้ 8.8.8.8 หนึ่งในที่อยู่ IPv4 ของ google.com

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

ในการเชื่อมต่อโหนด onhub กับอินเทอร์เน็ตต้องเชื่อมต่อกับอินเทอร์เฟซนั้นบนคอนฟิกูเรชันระดับ Linux OS

ออกจากโหนด:

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

ตอนนี้ลอง ping 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

สิ่งสำคัญคือต้องล้างโทโพโลยี Happy เสมอเมื่อคุณทำเสร็จแล้วเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการกำหนดค่าเครือข่าย Linux ของคุณ

หากคุณเปิดใช้งานการสนับสนุน DNS ในโทโพโลยีของคุณให้ลบออกโดยการรันคำสั่งนั้นใหม่ด้วยแฟ -d (delete) ก่อน ต้องรันก่อนที่จะลบโหนด Happy เพื่อให้แน่ใจว่าการกำหนดค่าเครือข่ายได้รับการอัปเดตอย่างเหมาะสม

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

ถัดไปลบสถานะความสุข:

$ happy-state-delete

ในบางครั้งไฟล์สถานะบางไฟล์อาจยังคงอยู่หลังจากการลบสถานะ หากคุณพบปัญหาและ Happy ไม่ทำงานตามที่คาดไว้ให้ลบสถานะด้วย happy-state-delete จากนั้นใช้คำสั่งต่อไปนี้เพื่อบังคับให้ล้างข้อมูลที่เหลือ:

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

เครื่องของคุณควรกลับสู่การกำหนดค่าเครือข่ายปกติ

ตอนนี้คุณรู้แล้ว:

  • วิธีใช้ Happy เพื่อจำลองเครือข่ายพื้นที่บ้าน IoT ของคุณเอง
  • วิธีเชื่อมต่อ Happy topologies กับอินเทอร์เน็ต
  • พื้นฐานของ Weave ผ่าน OpenWeave ซึ่งเป็น Weave เวอร์ชันโอเพ่นซอร์สของ Nest

ขั้นตอนถัดไป

สร้างจาก Codelab นี้ลองทำแบบฝึกหัดต่อไปนี้:

  • สร้างโทโพโลยีที่ใหญ่ขึ้นโดยมีหลายโหนดในแต่ละเธรดและเครือข่าย Wi-Fi และสร้างการเชื่อมต่อระหว่างโหนดทั้งหมด
  • สร้างสคริปต์ทุบตีเพื่อโหลดโทโพโลยีผ่าน happy-state-load หรือ weave-state-load
  • สำรวจคำสั่ง Happy อื่น ๆ เช่น happy-traceroute และ happy-process-*

อ่านเพิ่มเติม

ตรวจสอบ openweave.io สำหรับการอ้างอิงที่หลากหลายรวมถึง:

f6996428fb06dede.png