Happy เป็นเครื่องมือที่สร้างขึ้นโดยห้องปฏิบัติการ Nest สำหรับการจัดเรียงโทโพโลยีเครือข่ายแบบจำลองที่มีน้ำหนักเบา Happy มีประโยชน์สำหรับการพัฒนาและทดสอบเครือข่ายพื้นที่บ้าน IoT
ด้วยความสุขคุณสามารถ:
- ทดสอบโปรโตคอลเครือข่ายและโปรแกรมดำเนินการแบบกระจายอื่น ๆ บนเครื่องพัฒนา Linux เครื่องเดียวโดยไม่ต้องใช้ฮาร์ดแวร์อุปกรณ์ IoT
- ทำการทดสอบการทำงานอัตโนมัติในเครือข่าย
- เรียกใช้เครือข่ายแบบขนานหลายเครือข่ายพร้อมกันบนระบบเดียวกันเพื่อปรับปรุงปริมาณงานทดสอบ
ใน Codelab นี้คุณจะได้เรียนรู้วิธีเริ่มต้นใช้งาน Happy ตลอดจนพื้นฐานของ Weave สำหรับอุปกรณ์ IoT การใช้งาน Weave ที่คุณจะใช้คือ OpenWeave ซึ่งเป็นเวอร์ชันโอเพนซอร์สที่ออกโดย Nest
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้าง 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
โทโพโลยีนี้เป็นตัวอย่างของ 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
ตอนนี้โทโพโลยีของเรามีลักษณะดังนี้:
ขั้นตอนสุดท้ายในการเปิดเครือข่าย 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
นี่คือโทโพโลยีที่อัปเดตของเรา:
ตอนนี้เครือข่าย 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
สามารถเข้าถึงได้โดยตรง
ที่อยู่ IPv6 อื่นล้มเหลวเนื่องจากไม่ได้เปิดใช้งานการส่งต่อระหว่าง wpan0
และ wlan0
บน 02BorderRouter
ดังนั้น 01ThreadNode
จึงไม่รู้ว่ามี 03WiFiNode
อยู่หรือจะเข้าถึงได้อย่างไร Happy ได้นำเสนอเครือข่ายจำลอง แต่ไม่ได้เปิดใช้งานการกำหนดเส้นทางและการส่งต่อระหว่างโหนดทั้งหมด
เพิ่มเส้นทาง
ในการกำหนดเส้นทางการรับส่งข้อมูล IPv6 ข้าม HAN ให้เพิ่มเส้นทางที่เหมาะสมให้กับแต่ละโหนดในแต่ละเครือข่ายทั้งสองทิศทาง (เพื่อให้ ping ทราบวิธีกลับไปยังโหนดต้นทาง)
สำหรับแต่ละโหนดคุณจะต้องทราบ:
- เกตเวย์เครือข่ายที่ใกล้ที่สุด - ในกรณีนี้คือ
02BorderRouter
สำหรับทั้งคู่ - เครือข่ายเป้าหมาย - จะไปที่ไหนหลังจากเกตเวย์
สำหรับเครือข่ายโหนดทั้งสามของเราที่ให้สิ่งต่อไปนี้:
จาก Source Network | ไปยัง Target Network | ผ่านเกตเวย์ |
| | |
| | |
สิ่งนี้สามารถทำได้แยกกันสำหรับแต่ละโหนดที่มี 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 จำลองที่ใช้งานได้เต็มรูปแบบแล้ว
เพื่อให้สามารถเชื่อมต่อทุกอย่างเข้าด้วยกันได้อย่างปลอดภัยและเชื่อถือได้มากขึ้นเรามาเพิ่ม 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
นี่คือโทโพโลยีที่อัปเดตของเราโดยมีค่าสานเป็นสีน้ำเงิน:
ผ้าสาน
มีข้อมูลใหม่มากมายในสถานะ 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 นี่คือรหัสการจับคู่แบบสาน
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 เป็นเนมสเปซเครือข่ายในขณะที่การเชื่อมโยงระหว่างโหนดเหล่านี้เป็นอินเทอร์เฟซเครือข่าย
ตัวอย่างเช่นการใช้โทโพโลยีของเรา:
มาดูกันว่าเนมสเปซใดที่ 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",
บันทึกรันไทม์
คำสั่งที่ออกให้กับโหนดเป็นคำสั่งเทอร์มินัลพื้นฐานที่ดำเนินการจากภายในเนมสเปซของแต่ละโหนด วิธีง่ายๆในการดูสิ่งนี้คือการเปิดใช้งานบันทึกเวลาทำงานของ 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
ตรวจสอบสถานะ 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
ตอนนี้คุณสามารถ 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
ในโทโพโลยีนี้ 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
สำเร็จ!
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
สิ่งสำคัญคือต้องล้างโทโพโลยี 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 สำหรับการอ้างอิงที่หลากหลายรวมถึง: