Bắt đầu với Happy and Weave

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.

f6996428fb06dede.png

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.

a3295ee87fbd9764.png

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ả ThreadNetworkWiFiNetwork . Đó 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:

2d054e6c4e54089c.png

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:

84eecd23871618ca.png

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:

5447bcbdf7d539df.png

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 wpan0wlan0 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

ThreadNetwork

WiFiNetwork

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

WiFiNetwork

ThreadNetwork

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

Đ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.

5bb53be0280b3320.png

Để 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:

ce3fa9082408355b.png

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.

e7c6fa3e24d61d1b.png

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-stateweave-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:

7d6654c2e4907f2a.png

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",

49cfdce6ff9dd745.png

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-stateweave-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

6d04cbfcc84038e2.png

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

c5ffca09d7cd3208.png

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-stateweave-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

c75127417ef3833a.png

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!

c4d411ab1734131.png

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

3ed2c3c0df67f4d2.png

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ặc weave-state-load
  • Khám phá lệnh Chúc mừng khác, chẳng hạn như happy-traceroutehappy-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:

f6996428fb06dede.png