เริ่มต้นความสุขและสานต่อ

1. บทนำ

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

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

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

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

f6996428fb06dede.png

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

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

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

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

2. เริ่มต้น

ติดตั้ง 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 ควรสามารถเข้าถึงได้จากบรรทัดคำสั่ง:

$ happy-state
State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes

NODES      Name    Interface    Type                                          IPs

ติดตั้ง OpenWeave

จากไดเร็กทอรีรูท OpenWeave ให้ติดตั้ง OpenWeave:

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

กำหนดค่า Happy ด้วย OpenWeave

ในการใช้ OpenWeave กับ Happy คุณต้องแจ้งให้ Happy ทราบว่าจะค้นหาการติดตั้ง Weave ได้จากที่ใด อัปเดตการตั้งค่ามีความสุขกับเส้นทางไปยัง /src/test-apps ภายใน OpenWeave สร้างของคุณ:

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

ยืนยันการกำหนดค่า:

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

ตรวจสอบการติดตั้ง OpenWeave

คำสั่ง Weave ที่จำเป็นใน Codelab นี้สามารถเข้าถึงได้จากบรรทัดคำสั่ง:

$ weave-fabric-add -h

    weave-fabric-add creates a weave fabric.

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

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

    return:
        0    success
        1    fail

ถ้าคุณได้รับข้อผิดพลาด weave-fabric-add: command not found อัปเดตของคุณ PATH ตัวแปรสภาพแวดล้อมที่มีเส้นทางที่ใช้สำหรับการไบนารีแสนสุข:

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

3. โทโพโลยีแรกของคุณ

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

a3295ee87fbd9764.png

โทโพโลยีนี้เป็นตัวอย่างของ 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

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

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

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

$ 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 และ Happy เริ่มต้น Let 's ด้วยผ้าจาก weave-state :

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

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

โหนดสาน

แต่ละโหนดในแฟบริก 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 ตัว ซึ่งมักเรียกว่าคีย์รายการ นี่คือรหัสการจับคู่ลาย

e7c6fa3e24d61d1b.png

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

สานที่อยู่

หมายเหตุว่ามีสี่ที่อยู่ใหม่ 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—โดยปกติบน Thread Border Router—ให้ฟังก์ชันนี้

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

$ weave-network-gateway ThreadNetwork 02BorderRouter

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

6. การบำรุงรักษาโทโพโลยี

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

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

$ happy-state -s codelab.json

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

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

$ happy-state-delete

นี้จะลบ namespaces ทุกเครือข่ายและการกำหนดค่าที่เกี่ยวข้องพบใน ~/.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 topology ที่บันทึกไว้ใหม่:

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

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

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

7d6654c2e4907f2a.png

มาดูกันว่าเนมสเปซที่ Happy สร้างขึ้นสำหรับสิ่งนี้:

$ ip netns list
happy004
happy003
happy002
happy001
happy000

หากคุณตรวจสอบ netns ของแฟ้ม JSON รัฐมีความสุขที่คุณสามารถมองเห็นสิ่งโหนดและเครือข่ายแต่ละสอดคล้อง namespace ที่:

$ 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 เรียกใช้คำสั่งที่ไม่ได้มีความสุขเช่นถ้าเข้าสู่หนึ่งในโหนด (namespaces ระบบเครือข่าย):

$ 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 ที่จะออกจาก namespace ของโหนด:

root@01ThreadNode:# exit

8. เชื่อมต่อกับบริการ

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

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

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

  • เป็นบริการจำลองในเนมสเปซเครือข่ายของตัวเอง (โหนด 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 เพื่อยืนยันโทโพโลยี ใน topology นี้ 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 และบริการ ใน topology นี้ 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 ที่มีอยู่:

$ happy-state-delete

ยืนยันสถานะว่างเปล่ากับ happy-state และ weave-state คำสั่ง

โหลดโทโพโลยีที่กำหนดไว้ล่วงหน้าด้วยโหนดจุดเข้าใช้งาน (AP):

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

c75127417ef3833a.png

ใน topology นี้ onhub เป็นเอพี ตรวจสอบสถานะความสุข มันคล้ายกับโครงสร้างก่อนหน้านี้ได้โดยไม่ต้อง 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 และ ping ที่อยู่อินเทอร์เน็ตสาธารณะ เราจะใช้ 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

Happy nodes ไม่มีความสามารถ 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. ทำความสะอาด

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

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

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

ถัดไป ลบสถานะ Happy:

$ 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 เพื่อจำลองเครือข่าย IoT home Area ของคุณเอง
  • วิธีเชื่อมต่อ Happy topology กับอินเทอร์เน็ต
  • พื้นฐานของ Weave ผ่าน OpenWeave ซึ่งเป็น Weave เวอร์ชันโอเพ่นซอร์สของ Nest

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

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

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

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

ตรวจสอบ openweave.io สำหรับความหลากหลายของการอ้างอิงรวมไปถึง:

f6996428fb06dede.png