1. Giới thiệu
Hạnh phúc là một công cụ được tạo ra bởi các phòng thí nghiệm Nest cho dàn nhạc nhẹ của topo mạng mô phỏng. Happy rất hữu ích cho việc phát triển và thử nghiệm các mạng khu vực gia đình IoT.
Với Happy, bạn có thể:
- Kiểm tra các giao thức mạng và các chương trình thực thi phân tán khác trên một máy phát triển Linux duy nhất mà không cần sử dụng phần cứng thiết bị IoT
- Thực hiện kiểm tra chức năng tự động trên một mạng
- Chạy nhiều mạng song song, đồng thời trên cùng một hệ thống để cải thiện thông lượng kiểm tra
Trong Codelab này, bạn sẽ học cách để bắt đầu với Happy, cũng như những điều cơ bản của Weave cho các thiết bị IOT. Việc thực hiện Weave bạn sẽ sử dụng là OpenWeave , một phiên bản mã nguồn mở phát hành bởi Nest.
Những gì bạn sẽ học
- Cách xây dựng Happy và OpenWeave
- Cách tạo thủ công một mạng IoT mô phỏng
- Cách quản lý cấu trúc liên kết tùy chỉnh
- Cách kết nối mạng Happy mô phỏng với Internet
- Những điều cơ bản về Weave
Những gì bạn cần
- Máy Linux, vật lý hoặc ảo
- Git client hoặc cli
- Python 2.7
- Hiểu biết cơ bản về các khái niệm mạng và định tuyến
2. Bắt đầu
Cài đặt chuỗi công cụ và các phụ thuộc
Để xây dựng Happy and Weave, hãy đảm bảo bạn đã cài đặt chuỗi công cụ được hỗ trợ và tất cả các phần phụ thuộc.
$ 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
Lấy mã nguồn
Sao chép các kho lưu trữ Happy và OpenWeave Git từ dòng lệnh:
$ cd ~ $ git clone https://github.com/openweave/happy.git $ git clone https://github.com/openweave/openweave-core.git
Cài đặt Happy
Từ thư mục gốc Happy, cài đặt Happy:
$ cd ~/happy $ make
Xác minh cài đặt vui vẻ
Các lệnh Happy bây giờ sẽ có thể truy cập được từ dòng lệnh:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes NODES Name Interface Type IPs
Cài đặt OpenWeave
Từ thư mục gốc OpenWeave, cài đặt OpenWeave:
$ cd ~/openweave-core $ make -f Makefile-Standalone
Định cấu hình Happy với OpenWeave
Để sử dụng OpenWeave với Happy, bạn cần cho Happy biết nơi tìm cài đặt Weave. Cập nhật cấu hình Hạnh phúc với con đường /src/test-apps
trong OpenWeave xây dựng của bạn:
$ happy-configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps
Xác nhận cấu hình:
$ happy-configuration User Happy Configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps
Xác minh cài đặt OpenWeave
Các lệnh dệt cần thiết trong Codelab này có thể truy cập được từ dòng lệnh:
$ 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
Nếu bạn nhận được lỗi weave-fabric-add: command not found
, cập nhật của bạn PATH
biến môi trường với đường dẫn sử dụng cho Happy nhị phân:
$ export PATH=$PATH:~/openweave-core/src/test-apps/happy/bin
3. Cấu trúc liên kết đầu tiên của bạn
Hãy tạo cấu trúc liên kết ba nút sau đây với Happy.
Cấu trúc liên kết này là một ví dụ về Mạng Khu vực Gia đình (HAN) đơn giản. Trong HAN này, hai nút được kết nối với nhau trong mạng Chủ đề và một trong những nút đó kết nối với nút thứ ba qua Wi-Fi. Nút này cũng có thể được kết nối với một bộ định tuyến không dây trong nhà để cung cấp kết nối internet cho toàn bộ HAN. Thông tin thêm về điều này sau.
Đầu tiên, tạo ba nút:
$ happy-node-add 01ThreadNode $ happy-node-add 02BorderRouter $ happy-node-add 03WiFiNode
Hãy đảm bảo rằng chúng tồn tại:
$ happy-node-list 01ThreadNode 02BorderRouter 03WiFiNode
Bây giờ hãy tạo một số mạng:
$ happy-network-add ThreadNetwork thread $ happy-network-add WiFiNetwork wifi
Xác minh rằng các mạng tồn tại:
$ happy-network-list ThreadNetwork WiFiNetwork
Kiểm tra trạng thái Hạnh phúc:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP WiFiNetwork wifi UP NODES Name Interface Type IPs 01ThreadNode 02BorderRouter 03WiFiNode
Chỉ để đưa một mạng lên là không đủ - chúng ta phải thêm các nút vào mạng. Theo sơ đồ cấu trúc liên kết của chúng tôi, hãy thêm từng nút vào (các) mạng thích hợp:
$ happy-node-join 01ThreadNode ThreadNetwork $ happy-node-join 02BorderRouter ThreadNetwork $ happy-node-join 02BorderRouter WiFiNetwork $ happy-node-join 03WiFiNode WiFiNetwork
Lưu ý rằng 02BorderRouter
đã được thêm vào cả ThreadNetwork
và WiFiNetwork
. Đó là bởi vì là một Bộ định tuyến biên giới trong HAN của chúng ta, nút này kết nối hai mạng riêng lẻ với nhau.
Kiểm tra trạng thái Hạnh phúc. Mỗi giao diện của nút được thiết lập:
$ 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
Cấu trúc liên kết của chúng tôi bây giờ trông như thế này:
Bước cuối cùng trong việc xây dựng mạng Happy của chúng tôi là gán địa chỉ IP cho từng giao diện trên mỗi nút. Chỉ định tiền tố IP cho một mạng và Happy sẽ tự động chỉ định địa chỉ IP cho bạn.
Vì giao thức Luồng sử dụng IPv6, hãy thêm tiền tố IPv6 vào mạng Luồng:
$ happy-network-address ThreadNetwork 2001:db8:1:2::
Kiểm tra trạng thái Hạnh phúc. Các giao diện Chủ đề trên mỗi nút Chủ đề có địa chỉ 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
Đối với mạng WiFi, hãy thêm cả tiền tố IPv4 và IPv6:
$ happy-network-address WiFiNetwork 2001:db8:a:b:: $ happy-network-address WiFiNetwork 10.0.1.0
Kiểm tra trạng thái Hạnh phúc một lần nữa. Tất cả các giao diện đều có địa chỉ IP được chỉ định, với hai địa chỉ cho mỗi giao diện 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
Đây là cấu trúc liên kết được cập nhật của chúng tôi:
4. Kiểm tra kết nối
Bây giờ hạnh phúc mạng của chúng tôi là lên và chạy, hãy kiểm tra kết nối của nó bằng cách ping các nút khác từ 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
Các happy-ping
lệnh cố gắng ping mỗi địa chỉ IP cho mỗi giao diện vào nút mục tiêu. Chúng ta có thể bỏ qua các địa chỉ IPv4 vì Thread chỉ sử dụng IPv6.
Lưu ý rằng chỉ có một IPv6 ping đã thành công: một trong những ngày 02BorderRouter
's wpan0
giao diện, đó là địa chỉ duy nhất 01ThreadNode
có thể trực tiếp đạt được:
Các địa chỉ IPv6 khác thất bại vì chuyển tiếp chưa được kích hoạt giữa wpan0
và wlan0
trên 02BorderRouter
. Như vậy, 01ThreadNode
không có ý tưởng 03WiFiNode
tồn tại, hoặc làm thế nào để đạt được nó. Happy đã cung cấp mạng mô phỏng, nhưng chưa kích hoạt tất cả các định tuyến và chuyển tiếp giữa các nút.
Thêm các tuyến đường
Để định tuyến lưu lượng IPv6 qua HAN, hãy thêm các tuyến thích hợp cho từng nút trong mỗi mạng, theo cả hai hướng (để ping biết cách quay trở lại nút nguồn).
Đối với mỗi nút, bạn sẽ cần biết:
- mạng lưới khu vực gần cửa ngõ trong trường hợp này,
02BorderRouter
cho cả - mạng mục tiêu — nơi sẽ đến sau cổng kết nối
Đối với mạng ba nút của chúng tôi, điều đó cho chúng tôi những điều sau:
từ Mạng nguồn | đến Mạng mục tiêu | qua Gateway |
| | |
| | |
Điều này có thể được thực hiện riêng cho mỗi nút với happy-node-route
, nhưng nó dễ dàng hơn để làm điều đó cho tất cả các nút trong mỗi mạng với 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
Để giải thích về những lá cờ dòng lệnh, sử dụng happy-network-route -h
.
Các happy-network-route
lệnh cũng bật IPv4 và IPv6 chuyển tiếp cho mỗi nút, khi cần thiết. Điều này cho phép lưu lượng truy cập định tuyến từ giao diện này sang giao diện khác trong một nút.
Bây giờ hãy thử lại 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
Cả hai ping IPv6 đều hoạt động! Với chuyển trên, nó biết làm thế nào để đạt được wlan0
giao diện. Ping IPv4 vẫn không thành công, vì chúng tôi chỉ định cấu hình các tuyến và chuyển tiếp IPv6 (cũng vì Thread không chạy qua IPv4).
Vì chúng tôi đã thêm các tuyến mạng cho cả hai bên, hãy ping qua các mạng:
$ 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
Ping IPv6 hoạt động như mong đợi. Bây giờ bạn có một IPv6 HAN mô phỏng, đầy đủ chức năng.
Để cho phép kết nối mọi thứ với nhau một cách an toàn và đáng tin cậy hơn, hãy thêm Weave lên trên HAN.
5. Thêm Weave
Weave là lớp ứng dụng mạng cung cấp xương sống truyền thông an toàn và đáng tin cậy cho các sản phẩm Nest. Chúng tôi có thể thêm chức năng Weave với OpenWeave, phiên bản nguồn mở của Weave.
Việc thực hiện Weave được gọi là "vải". Kết cấu Weave là mạng bao gồm tất cả các nút HAN, Dịch vụ Nest và bất kỳ thiết bị di động nào tham gia vào HAN. Nó nằm trên HAN và cho phép định tuyến dễ dàng hơn qua các công nghệ liên kết mạng cơ bản khác nhau (ví dụ: Thread hoặc Wi-Fi).
Tạo vải Weave cho HAN của bạn, sử dụng fab1
như vải ID, sau đó cấu hình tất cả các nút cho Weave:
$ weave-fabric-add fab1 $ weave-node-configure
Bây giờ Weave đã được định cấu hình, hãy kiểm tra trạng thái Hạnh phúc:
$ 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
Mỗi nút đã được thêm vào vải Weave, và mỗi giao diện có một địa chỉ IPv6 mới bắt đầu với fd00
. Để biết thêm thông tin về vải Weave, sử dụng weave-state
lệnh:
$ 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
Đây là cấu trúc liên kết được cập nhật của chúng tôi, với các giá trị Weave màu xanh lam:
Dệt vải
Có rất nhiều thông tin mới trong trạng thái Weave và Happy. Hãy bắt đầu với vải từ weave-state
:
FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
Sử dụng Weave một tiền tố IPv6 của fd00::/48
cho mỗi nút. Các địa chỉ trong khối này được gọi là Địa chỉ cục bộ duy nhất và được chỉ định để sử dụng trong các mạng riêng như HAN. Kết hợp mã đó với ID vải sẽ tạo Tiền tố toàn cầu Weave được hiển thị ở trên.
Dệt các nút
Mỗi nút trong kết cấu Weave được gán một ID nút duy nhất, cùng với Mã ghép nối:
NODES Name Weave Node Id Pairing Code 01ThreadNode 69ca9502eb6911e7 8ZJB5Q 02BorderRouter 686af236eb6911e7 B5YV3P 03WiFiNode 69826e60eb6911e7 L3VT3A
ID nút trên toàn cầu xác định một nút trong kết cấu Weave. Mã ghép nối được sử dụng làm "thông tin xác thực người tham gia" trong quá trình ghép nối và thường sẽ được in cùng với mã QR của sản phẩm.
Ví dụ: nếu bạn nhìn vào mã QR trên Nest Protect hoặc Nest Cam, bạn sẽ nhận thấy một chuỗi gồm 6 ký tự, thường được gọi là Khóa nhập. Đây là mã ghép nối Weave.
Weave sử dụng kết hợp Tiền tố chung, ID vải và ID nút để tạo địa chỉ IPv6 dành riêng cho Weave cho từng nút và giao diện trong kết cấu.
Dệt địa chỉ
Lưu ý rằng có bốn địa chỉ IPv6 mới trong Happy topo, tất cả bắt đầu với chúng tôi Weave toàn cầu Prefix của 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
Giao thức Weave sử dụng các địa chỉ này để giao tiếp trên vải Weave, thay vì địa chỉ IPv6 tiêu chuẩn được gán cho mỗi nút.
Dệt cổng mạng
Các nút dệt trên mạng Thread cần biết nơi thoát khỏi mạng đó. Cổng mạng Weave — thường là trên Bộ định tuyến biên giới luồng — cung cấp chức năng này.
Trong cấu trúc liên kết mẫu của chúng tôi, hãy chỉ định nút BorderRouter làm cổng mạng Weave:
$ weave-network-gateway ThreadNetwork 02BorderRouter
Lệnh này cho biết thêm một tuyến đường từ tất cả các nút chủ đề đến các subnet vải Weave ( fd:0:fab1::/48
) thông qua BorderRouter
nút của giao diện Thread ( wpan0
), cho phép mỗi nút chủ đề đến đạt được bất kỳ nút Weave ngoài mạng chủ đề. Đây là tương tự như happy-network-route
lệnh chúng ta sử dụng trước đó, nhưng cụ thể đối với các tuyến đường vải Weave.
6. Bảo trì cấu trúc liên kết
Điều làm cho Happy trở nên mạnh mẽ là cách nó dễ dàng quản lý tất cả các thiết lập và chia nhỏ cấu trúc liên kết mô phỏng.
Lưu cấu trúc liên kết Hạnh phúc của bạn để sử dụng sau này:
$ happy-state -s codelab.json
Nơi này một tệp JSON với topo hoàn chỉnh trong thư mục gốc của bạn ~/
thư mục. Các tập tin JSON là một bản sao của nhà nước hạnh phúc hiện tại của bạn, được tìm thấy tại ~/.happy_state.json
.
Sau khi được lưu, hãy xóa cấu trúc liên kết hiện tại:
$ happy-state-delete
Này xóa tất cả không gian tên mạng và cấu hình có liên quan tìm thấy trong ~/.happy-state.json
tập tin. Kiểm tra happy-state
và weave-state
để xác nhận một cấu hình rỗng:
$ 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
Để tải lại cấu hình đã lưu, hãy sử dụng một trong hai lệnh:
-
happy-state-load
- không hỗ trợ Plugin Weave -
weave-state-load
- hỗ trợ Plugin Weave
Vì vậy, nếu topo của bạn bao gồm Weave, luôn sử dụng weave-state-load
lệnh để các vải Weave và cấu hình có liên quan được áp dụng.
Tải lại cấu trúc liên kết Hạnh phúc đã lưu:
$ weave-state-load codelab.json
Kiểm tra tất cả các trạng thái để xác nhận tải thành công:
$ 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
Một số cấu trúc liên kết được xác định trước đã được cung cấp trong kho lưu trữ Happy, ở cả định dạng shell-script và JSON. Tìm thấy chúng ở ~/happy/topologies
.
OpenWeave cũng đi kèm với các cấu trúc liên kết Happy được xác định trước cho mục đích thử nghiệm. Tìm thấy chúng ở ~/openweave-core/src/test-apps/happy/topologies/standalone
.
7. Nó hoạt động như thế nào
Happy sử dụng không gian tên mạng Linux để mô phỏng các cấu trúc liên kết phức tạp. Thông thường, cấu hình mạng áp dụng trên toàn bộ hệ điều hành Linux. Không gian tên mạng cho phép bạn phân vùng cấu hình mạng để mỗi không gian tên có tập hợp giao diện và bảng định tuyến riêng.
Mỗi nút và mạng trong Happy là một không gian tên mạng, trong khi các liên kết giữa chúng là các giao diện mạng.
Ví dụ, bằng cách sử dụng cấu trúc liên kết của chúng tôi:
Hãy xem những không gian tên Happy đã tạo ra cho điều này:
$ ip netns list happy004 happy003 happy002 happy001 happy000
Nếu bạn đánh dấu vào netns
phần của tệp JSON trạng thái hạnh phúc, bạn có thể xem những gì các nút và các mạng mỗi namespace tương ứng với:
$ happy-state -j | grep "netns" -A 5 "netns": { "01ThreadNode": "000", "02BorderRouter": "001", "03WiFiNode": "002", "ThreadNetwork": "003", "WiFiNetwork": "004",
Nhật ký thời gian chạy
Các lệnh được cấp cho các nút là các lệnh đầu cuối cơ bản được thực thi từ bên trong không gian tên của mỗi nút. Một cách dễ dàng để thấy điều này là bật nhật ký thời gian chạy Happy.
Mở cửa sổ đầu cuối thứ hai và bật nhật ký, chúng sẽ chạy liên tục trên cửa sổ này:
$ happy-state -l
Quay lại cửa sổ đầu tiên và chạy ping Happy:
$ happy-ping 01ThreadNode 02BorderRouter
Kiểm tra các mục nhật ký gần đây nhất trong cửa sổ thiết bị đầu cuối thứ hai. Bạn sẽ thấy một dòng như thế này trong nhật ký:
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ping6 -c 1 2001:0db8:0001:0002:5e53:bbff:fe05:484b
Các happy-ping
lệnh là gì khác hơn là vui vẻ chạy ping6
lệnh trong happy000
namespace ( 01ThreadNode
).
Nhập một nút
Sử dụng happy-shell
để chạy các lệnh không hạnh phúc như thể đăng nhập vào một trong các nút (không gian tên mạng):
$ happy-shell 01ThreadNode root@01ThreadNode:#
Các thiết bị mô phỏng được chạy trong mỗi vùng tên và chúng chỉ có quyền truy cập vào cấu hình mạng được chỉ định thông qua Happy.
Kiểm tra cấu hình giao diện cho nút. Điều này sẽ khác với cấu hình trên toàn hệ điều hành của bạn và phải phản ánh những gì được liệt kê ở trạng thái Vui vẻ:
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)
Sử dụng exit
rời namespace của nút:
root@01ThreadNode:# exit
8. Kết nối với một dịch vụ
Với sự hiểu biết về cách Happy sử dụng không gian tên mạng Linux, bây giờ bạn có thể nhận ra rằng có thể kết nối mạng Happy mô phỏng với internet và truy cập các địa chỉ công cộng từ bên trong các nút mô phỏng. Điều này hữu ích để kết nối các thiết bị mô phỏng của bạn với một dịch vụ thực (như Nest Service over Weave).
Dịch vụ trong Weave là cơ sở hạ tầng dựa trên đám mây kết nối các nút HAN thành một mô hình dữ liệu, cung cấp khả năng truy cập từ xa và triển khai các bộ điều khiển thông minh để tạo ra một hệ sinh thái toàn diện.
Dịch vụ có thể được trình bày theo hai cách chính với Happy:
- Là một dịch vụ được mô phỏng trong không gian tên mạng của riêng nó (nút Happy)
- Như một dịch vụ đám mây thực sự trên internet
Topo được xác định trước đã được cung cấp trong ~/happy/topologies
như một ví dụ về mỗi kịch bản dịch vụ.
Dịch vụ mô phỏng trên nút Happy
Xóa bất kỳ cấu trúc liên kết Hạnh phúc hiện có nào:
$ happy-state-delete
Xác nhận tình trạng trống rỗng với happy-state
và weave-state
lệnh.
Tải cấu trúc liên kết được xác định trước với điểm truy cập (AP) và các nút dịch vụ:
$ weave-state-load ~/happy/topologies/thread_wifi_ap_service.json
Kiểm tra trạng thái Happy và Weave để xác nhận cấu trúc liên kết. Trong topo này, onhub
là AP, trong khi cloud
là dịch vụ mô phỏng. Lưu ý cả hai đều kết nối với một Internet
mạng kiểu 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
Đường hầm dệt
Một đường hầm Weave kết nối vải Weave với một dịch vụ. Đây là một tuyến an toàn chuyển các bản tin IPv6 UDP giữa HAN và dịch vụ. Trong topo này, BorderRouter
nút là cửa ngõ mạng Weave, có chức năng như các thiết bị đầu cuối đường hầm trên HAN.
Tạo đường hầm Weave:
$ weave-tunnel-start BorderRouter cloud
Kiểm tra lại trạng thái Hạnh phúc. Bạn sẽ thấy một giao diện đường hầm mới với một địa chỉ IPv6 Weave trên cloud
nút:
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
Giờ đây, bạn có thể ping thành công giữa các nút trên vải Weave và tiền tố toàn cầu Weave của dịch vụ:
$ happy-ping ThreadNode cloud [Ping] ping from ThreadNode to cloud on address fd00:0000:fab1:0005:1ab4:3002:0000:0011 -> 0% packet loss
Dịch vụ đám mây thực sự trên internet
Xóa bất kỳ cấu trúc liên kết Hạnh phúc hiện có nào:
$ happy-state-delete
Xác nhận tình trạng trống rỗng với happy-state
và weave-state
lệnh.
Tải cấu trúc liên kết được xác định trước với nút điểm truy cập (AP):
$ weave-state-load ~/happy/topologies/thread_wifi_ap_internet.json
Trong topo này, onhub
là AP. Kiểm tra trạng thái Hạnh phúc. Nó tương tự như cấu trúc liên kết trước đó, nếu không có sự Internet
mạng và cloud
nút:
$ 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
Vì mỗi nút Happy là một không gian tên mạng, chúng được phân vùng từ Internet công cộng theo mặc định. Kiểm tra điều này bằng cách nhập nút Happy và ping một địa chỉ internet công cộng. Chúng tôi sẽ sử dụng 8.8.8.8
, một trong những địa chỉ IPv4 google.com của.
$ happy-shell onhub root@onhub:# ping -c2 8.8.8.8 connect: Network is unreachable
Để kết nối onhub
nút với internet thì phải bắc cầu để giao diện đó vào cấu hình hệ điều hành cấp Linux.
Thoát khỏi nút:
root@onhub:# exit
Xác định giao diện cho kết nối internet của bạn với các route
lệnh:
$ 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
Tìm default
tuyến. Đây là kết nối internet cho máy Linux của bạn. Các Iface
cột chỉ ra mà giao diện đang được sử dụng cho kết nối đó. Trong ví dụ trên, đó là em1
.
Sử dụng happy-internet
để thiết lập cầu, sử dụng giao diện cho tuyến đường mặc định của bạn. Đối với --isp
cờ, sử dụng tên giao diện mà không trailing số. Trong ví dụ này, đó là em
. Nếu giao diện mặc định của bạn là eth1
, các --isp
cờ sẽ eth
.
$ happy-internet --node onhub --interface em1 --isp em --seed 249
Sẽ không có sự thay đổi rõ ràng trong happy-state
đầu ra, nhưng onhub
nút nên có khả năng kết nối internet. Hãy quay lại nút và kiểm tra:
$ 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
Sự thành công!
DNS
Các nút hạnh phúc không có khả năng DNS tích hợp. Nếu bạn cố gắng ping google.com, nó không thành công:
root@onhub:# ping -c2 google.com ping: unknown host google.com
May mắn thay, Happy cung cấp hỗ trợ cho DNS. Thoát khỏi nút và tìm máy chủ DNS cho máy Linux của bạn. Đảm bảo sử dụng giao diện mặc định thích hợp:
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
Sử dụng các địa chỉ DNS với happy-dns
:
$ happy-dns 172.16.255.1 172.16.255.153 172.16.255.53
Bây giờ hãy thử ping google.com từ bên trong onhub
nút:
$ 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
Thoát khỏi onhub
nút khi bạn đã hoàn tất:
root@onhub:# exit
Đường hầm dệt
Giống như dịch vụ mô phỏng, một đường hầm Weave phải được thiết lập giữa HAN mô phỏng trong Happy và dịch vụ. Với dịch vụ đám mây thực, hãy sử dụng địa chỉ IP hoặc URL của dịch vụ trong thiết lập đường hầm. Ví dụ:
$ weave-tunnel-start BorderRouter mycloud.service.com
9. Dọn dẹp
Điều quan trọng là phải luôn dọn dẹp các cấu trúc liên kết Hạnh phúc khi bạn hoàn thành chúng, để tránh các vấn đề với cấu hình mạng Linux của bạn.
Nếu bạn kích hoạt hỗ trợ DNS trong topo của bạn, loại bỏ nó bằng cách chạy lại lệnh đó với -d
(delete) cờ đầu tiên. Điều này phải được chạy trước khi bất kỳ nút Hạnh phúc nào bị xóa, để đảm bảo cấu hình mạng được cập nhật đúng cách.
$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53
Tiếp theo, xóa trạng thái Hạnh phúc:
$ happy-state-delete
Đôi khi, một số tệp trạng thái có thể vẫn còn sau khi xóa trạng thái. Nếu bạn gặp vấn đề và Happy không hoạt động như mong đợi, xóa nhà nước với happy-state-delete
và sau đó sử dụng các lệnh sau để buộc bất kỳ dọn dẹp còn lại:
$ ip netns | xargs -I {} sudo ip netns delete {} $ rm -rf ~/.*state.json $ rm -rf ~/.*state.json.lock
Máy của bạn sẽ trở lại cấu hình mạng bình thường.
10. Xin chúc mừng!
Bây giờ bạn biết:
- Cách sử dụng Happy để mô phỏng các mạng khu vực gia đình IoT của riêng bạn
- Cách kết nối các cấu trúc liên kết Hạnh phúc với Internet
- Kiến thức cơ bản về Weave qua OpenWeave, phiên bản Weave nguồn mở của Nest
Bước tiếp theo
Xây dựng Codelab này, hãy thử các bài tập sau:
- Tạo cấu trúc liên kết lớn hơn với nhiều nút trong mỗi Mạng luồng và mạng Wi-Fi, đồng thời thiết lập kết nối giữa tất cả các nút
- Tạo một kịch bản bash để nạp topo qua
happy-state-load
hoặcweave-state-load
- Khám phá lệnh Chúc mừng khác, chẳng hạn như
happy-traceroute
vàhappy-process-*
đọc thêm
Kiểm tra openweave.io cho một loạt các tài liệu tham khảo, bao gồm: