1. บทนำ
มีความสุข เป็นเครื่องมือที่สร้างขึ้นโดยห้องปฏิบัติการสำหรับการประสาน Nest น้ำหนักเบาโครงสร้างเครือข่ายที่จำลอง Happy มีประโยชน์สำหรับการพัฒนาและทดสอบเครือข่ายพื้นที่ภายในบ้าน IoT
ด้วย Happy คุณสามารถ:
- ทดสอบโปรโตคอลเครือข่ายและโปรแกรมการดำเนินการแบบกระจายอื่นๆ บนเครื่องพัฒนา Linux เครื่องเดียวโดยไม่ต้องใช้ฮาร์ดแวร์อุปกรณ์ IoT
- ทำการทดสอบการทำงานอัตโนมัติในเครือข่าย
- เรียกใช้เครือข่ายคู่ขนานหลายเครือข่ายพร้อมกันบนระบบเดียวกันเพื่อปรับปรุงปริมาณงานการทดสอบ
ใน Codelab นี้คุณจะได้เรียนรู้วิธีการที่จะเริ่มต้นด้วยการมีความสุขเช่นเดียวกับพื้นฐานของการ สาน สำหรับอุปกรณ์ IOT การดำเนินการสานที่คุณจะใช้เป็น OpenWeave รุ่นโอเพนซอร์สปล่อยออกมาจากรัง
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้าง 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
โทโพโลยีนี้เป็นตัวอย่างของ 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
นี่คือโทโพโลยีที่อัปเดตของเรา:
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
สามารถเข้าถึงโดยตรง:
ที่อยู่ IPv6 อื่น ๆ ล้มเหลวเนื่องจากการส่งต่อไม่ได้เปิดใช้ระหว่าง wpan0
และ wlan0
บน 02BorderRouter
ดังนั้น 01ThreadNode
มีความคิด 03WiFiNode
อยู่หรือวิธีการเข้าถึงมัน Happy ได้นำเครือข่ายจำลองขึ้นมา แต่ยังไม่ได้เปิดใช้งานการกำหนดเส้นทางและการส่งต่อระหว่างโหนดทั้งหมด
เพิ่มเส้นทาง
ในการกำหนดเส้นทางการรับส่งข้อมูล IPv6 ข้าม HAN ให้เพิ่มเส้นทางที่เหมาะสมไปยังแต่ละโหนดในแต่ละเครือข่าย ในทั้งสองทิศทาง (เพื่อให้ ping รู้วิธีกลับไปยังโหนดต้นทาง)
สำหรับแต่ละโหนด คุณจะต้องทราบ:
- เครือข่ายที่ใกล้ที่สุดเกตเวย์ในกรณีนี้
02BorderRouter
สำหรับทั้ง - เครือข่ายเป้าหมาย—จะไปที่ไหนหลังจากเกตเวย์
สำหรับเครือข่ายสามโหนดของเรา ที่ให้สิ่งต่อไปนี้แก่เรา:
จากเครือข่ายต้นทาง | ไปยังเครือข่ายเป้าหมาย | ผ่านเกตเวย์ |
| | |
| | |
ซึ่งสามารถทำได้เป็นรายบุคคลสำหรับแต่ละโหนดมี happy-node-route
แต่มันง่ายที่จะทำเพื่อโหนดทั้งหมดในแต่ละเครือข่ายที่มี happy-network-route
$ happy-network-route -a -i ThreadNetwork -t default -v 02BorderRouter -p 2001:db8:1:2::/64 $ happy-network-route -a -i WiFiNetwork -t default -v 02BorderRouter -p 2001:db8:a:b::/64
สำหรับคำอธิบายของธงบรรทัดคำสั่งให้ใช้ happy-network-route -h
happy-network-route
คำสั่งนอกจากนี้ยังจะเปิด IPv4 และ IPv6 การส่งต่อสำหรับแต่ละโหนดตามความจำเป็น ซึ่งช่วยให้ทราฟฟิกสามารถกำหนดเส้นทางจากอินเทอร์เฟซหนึ่งไปยังอีกอินเทอร์เฟซหนึ่งภายในโหนด
ตอนนี้ลอง 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 จำลองที่ทำงานได้อย่างสมบูรณ์
เพื่อให้มีวิธีการเชื่อมต่อทุกอย่างเข้าด้วยกันอย่างปลอดภัยและเชื่อถือได้ ให้เพิ่ม 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 เป็นสีน้ำเงิน:
ผ้าทอ
มีข้อมูลใหม่มากมายในรัฐ 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 ตัว ซึ่งมักเรียกว่าคีย์รายการ นี่คือรหัสการจับคู่ลาย
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 คือเนมสเปซเครือข่าย ในขณะที่ลิงก์ระหว่างโหนดทั้งสองคืออินเทอร์เฟซเครือข่าย
ตัวอย่างเช่น การใช้โทโพโลยีของเรา:
มาดูกันว่าเนมสเปซที่ 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",
บันทึกรันไทม์
คำสั่งที่ออกให้กับโหนดเป็นคำสั่งเทอร์มินัลพื้นฐานที่ดำเนินการจากภายในเนมสเปซของแต่ละโหนด วิธีง่ายๆ ในการดูสิ่งนี้คือการเปิดใช้งานบันทึกรันไทม์ 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
ตรวจสอบสถานะ 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
ตอนนี้คุณสามารถ 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
ใน 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
ความสำเร็จ!
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
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 สำหรับความหลากหลายของการอ้างอิงรวมไปถึง: