Happy and Weave 入門

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

一、簡介

快樂是由Nest實驗室進行模擬網絡拓撲結構的輕量化編排創建的工具。 Happy對於物聯網家庭局域網的開發和測試很有用。

使用 Happy,您可以:

  • 在單台 Linux 開發機器上測試網絡協議和其他分佈式執行程序,無需使用 IoT 設備硬件
  • 跨網絡執行自動化功能測試
  • 在同一系統上運行多個並發、並行網絡以提高測試吞吐量

在這個程式碼實驗室中,您將學習如何開始與快樂,還有的基本編織的物聯網設備。你會使用編織實現OpenWeave ,由Nest發布了一個開源版本。

f6996428fb06dede.png

你會學到什麼

  • 如何構建 Happy 和 OpenWeave
  • 如何手動創建模擬物聯網網絡
  • 如何管理自定義拓撲
  • 如何將模擬的快樂網絡連接到互聯網
  • 編織的基礎

你需要什麼

  • 一台 Linux 機器,物理的或虛擬的
  • Git 客戶端或 cli
  • 蟒蛇 2.7
  • 對網絡和路由概念的基本理解

2. 開始

安裝工具鍊和依賴項

要構建 Happy and Weave,請確保您已安裝受支持的工具鍊和所有依賴項。

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

$ cd ~/happy
$ make

驗證快樂安裝

現在應該可以從命令行訪問快樂命令:

$ 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

使用 OpenWeave 配置 Happy

要將 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 安裝

此 Codelab 中所需的 Weave 命令可從命令行訪問:

$ weave-fabric-add -h

    weave-fabric-add creates a weave fabric.

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

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

    return:
        0    success
        1    fail

如果你的錯誤weave-fabric-add: command not found ,更新您的PATH與用於快樂的二進制文件的路徑環境變量:

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

3. 你的第一個拓撲

讓我們用 Happy 創建以下三節點拓撲。

a3295ee87fbd9764.png

此拓撲是簡單家庭局域網 (HAN) 的一個示例。在這個 HAN 中,兩個節點在 Thread 網絡中連接在一起,其中一個節點通過 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加入到兩個ThreadNetworkWiFiNetwork 。這是因為作為 HAN 中的邊界路由器,該節點將兩個獨立的網絡連接在一起。

檢查快樂狀態。每個節點的接口都打開了:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP
    WiFiNetwork         wifi      UP

NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread
 02BorderRouter        wpan0  thread
                       wlan0    wifi
     03WiFiNode        wlan0    wifi

我們的拓撲現在看起來像這樣:

2d054e6c4e54089c.png

啟動我們的 Happy 網絡的最後一步是為每個節點上的每個接口分配 IP 地址。為網絡指定IP前綴,Happy會自動為您分配IP地址。

因為 Thread 協議使用 IPv6,所以給 Thread 網絡添加一個 IPv6 前綴:

$ happy-network-address ThreadNetwork 2001:db8:1:2::

檢查快樂狀態。每個 Thread 節點上的 Thread 接口都有 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

再次檢查Happy 狀態。所有接口都分配了 IP 地址,每個 Wi-Fi 接口有兩個:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP                       2001:0db8:0001:0002/64

    WiFiNetwork         wifi      UP                       2001:0db8:000a:000b/64
                                                                        10.0.1/24


NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:3e36:13ff:fe33:732e/64

 02BorderRouter        wpan0  thread   2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64

                       wlan0    wifi                                  10.0.1.2/24
                                       2001:0db8:000a:000b:426c:38ff:fe90:01e6/64

     03WiFiNode        wlan0    wifi   2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64
                                                                      10.0.1.3/24

這是我們更新的拓撲:

84eecd23871618ca.png

4. 測試連通性

現在,我們的開心網是建立和運行,讓我們通過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 地址,因為 Thread 只使用 IPv6。

請注意,只有一個IPv6的ping是成功的:一來就02BorderRouterwpan0接口,這是唯一的地址01ThreadNode可以直接到達:

5447bcbdf7d539df.png

因為轉發尚未啟用與其他IPv6地址失敗wpan0wlan002BorderRouter 。因此, 01ThreadNode不知道03WiFiNode存在,或者如何去實現它。 Happy 把模擬網絡弄出來了,但是沒有開啟所有節點間的路由和轉發。

添加路線

要通過 HAN 路由 IPv6 流量,請將正確的路由添加到每個網絡中的每個節點,雙向(因此 ping 知道如何返回源節點)。

對於每個節點,您需要知道:

  • 最近的網絡網關,在這種情況下, 02BorderRouter兩個
  • 目標網絡——網關之後的去向

對於我們的三節點網絡,這給了我們以下內容:

來自源網絡

到目標網絡

通過網關

ThreadNetwork

WiFiNetwork

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

WiFiNetwork

ThreadNetwork

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

這可單獨完成對每個節點happy-node-route ,但它更容易做到這一點對於每個網絡中的所有節點happy-network-route

$ happy-network-route -a -i ThreadNetwork -t default -v 02BorderRouter -p 2001:db8:1:2::/64
$ happy-network-route -a -i WiFiNetwork -t default -v 02BorderRouter -p 2001:db8:a:b::/64

對於命令行標誌的說明,使用happy-network-route -h

happy-network-route指令還接通IPv4和IPv6轉發對於每個節點,根據需要。這允許流量從節點內的一個接口路由到另一個接口。

現在重試 ping:

$ happy-ping 01ThreadNode 02BorderRouter
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    10.0.1.2 -> 100% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    2001:0db8:0001:0002:a651:3eff:fe92:6dbc -> 0% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
    2001:0db8:000a:000b:426c:38ff:fe90:01e6 -> 0% packet loss

兩個 IPv6 ping 都有效!隨著轉發時,它知道如何到達wlan0接口。 IPv4 ping 仍然失敗,因為我們只配置了 IPv6 路由和轉發(也是因為 Thread 不在 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 ping 按預期工作。您現在擁有一個功能齊全的模擬 IPv6 HAN。

5bb53be0280b3320.png

為了實現將所有東西連接在一起的更安全可靠的方式,讓我們在 HAN 之上添加 Weave。

5. 添加編織

Weave 是一個網絡應用層,為 Nest 產品提供安全可靠的通信主幹。我們可以使用 OpenWeave(Weave 的開源版本)添加 Weave 功能。

Weave 的實現稱為“結構”。 Weave 結構是一個包含所有 HAN 節點、Nest 服務和任何參與 HAN 的移動設備的網絡。它位於 HAN 之上,可以更輕鬆地跨不同底層網絡鏈接技術(例如,Thread 或 Wi-Fi)進行路由。

創建組織織物為您HAN,使用fab1作為面料ID,然後配置所有節點的編織:

$ weave-fabric-add fab1
$ weave-node-configure

現在 Weave 已配置,檢查 Happy 狀態:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP                       2001:0db8:0001:0002/64

    WiFiNetwork         wifi      UP                       2001:0db8:000a:000b/64
                                                                        10.0.1/24


NODES      Name    Interface    Type                                          IPs
   01ThreadNode        wpan0  thread   2001:0db8:0001:0002:3e36:13ff:fe33:732e/64
                                       fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64

 02BorderRouter        wpan0  thread   fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64
                                       2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64

                       wlan0    wifi   fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64
                                                                      10.0.1.2/24
                                       2001:0db8:000a:000b:426c:38ff:fe90:01e6/64

     03WiFiNode        wlan0    wifi   2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64
                                                                      10.0.1.3/24
                                       fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64

每個節點已經被添加到所述組織織物,而每個接口具有開始新的IPv6地址fd00 。要獲得關於組織織物的更多信息,請使用weave-state的命令:

$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code
        01ThreadNode    69ca9502eb6911e7          8ZJB5Q
      02BorderRouter    686af236eb6911e7          B5YV3P
          03WiFiNode    69826e60eb6911e7          L3VT3A

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

這是我們更新的拓撲,藍色的 Weave 值:

ce3fa9082408355b.png

編織面料

Weave 和 Happy 狀態有很多新信息。讓我們開始從面料weave-state

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

編織用途IPv6前綴fd00::/48為每個節點。此塊中的地址稱為唯一本地地址,指定用於專用網絡(如 HAN)中。將其與 Fabric ID 相結合會生成上圖所示的 Weave Global Prefix。

編織節點

Weave 結構中的每個節點都分配有唯一的節點 ID 以及配對代碼:

NODES           Name       Weave Node Id    Pairing Code
        01ThreadNode    69ca9502eb6911e7          8ZJB5Q
      02BorderRouter    686af236eb6911e7          B5YV3P
          03WiFiNode    69826e60eb6911e7          L3VT3A

節點 ID 全局標識 Weave 結構中的節點。配對碼在配對過程中用作“加入者憑證”,通常會與產品的二維碼一起打印。

例如,如果您查看 Nest Protect 或 Nest Cam 上的二維碼,您會注意到一個 6 個字符的字符串,通常稱為 Entry Key。這是編織配對代碼。

e7c6fa3e24d61d1b.png

Weave 使用全局前綴、結構 ID 和節點 ID 的組合為結構中的每個節點和接口創建 Weave 特定的 IPv6 地址。

編織地址

請注意,有在快樂拓撲四個新的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 地址。

織網網關

Thread 網絡上的 Weave 節點需要知道從哪裡退出該網絡。 Weave 網絡網關(通常位於 Thread 邊界路由器上)提供此功能。

在我們的示例拓撲中,讓我們將 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

這將刪除所有的網絡命名空間,並在找到的相關配置~/.happy-state.json文件。入住happy-stateweave-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 拓撲:

$ 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 存儲庫中提供了許多預定義的拓撲結構,包括 shell 腳本和 JSON 格式。在找到他們~/happy/topologies

OpenWeave 還帶有用於測試目的的精選預定義 Happy 拓撲。在找到他們~/openweave-core/src/test-apps/happy/topologies/standalone

7. 工作原理

Happy 使用 Linux 網絡命名空間來模擬複雜的拓撲結構。通常,網絡配置適用於整個 Linux 操作系統。網絡命名空間允許您對網絡配置進行分區,以便每個命名空間都有自己的一組接口和路由表。

Happy 中的每個節點和網絡都是一個網絡命名空間,而它們之間的鏈接是網絡接口。

例如,使用我們的拓撲:

7d6654c2e4907f2a.png

讓我們看看 Happy 為此創建了哪些命名空間:

$ ip netns list
happy004
happy003
happy002
happy001
happy000

如果檢查netns快樂狀態JSON文件的部分,你可以看到什麼節點和網絡每個命名空間對應於:

$ happy-state -j | grep "netns" -A 5
"netns": {
    "01ThreadNode": "000",
    "02BorderRouter": "001",
    "03WiFiNode": "002",
    "ThreadNetwork": "003",
    "WiFiNetwork": "004",

49cfdce6ff9dd745.png

運行時日誌

向節點發出的命令是從每個節點的命名空間內執行的基本終端命令。一個簡單的方法是啟用Happy 運行時日誌。

打開第二個終端窗口並打開日誌,它們將在此窗口上連續運行:

$ happy-state -l

返回第一個窗口並運行 Happy ping:

$ happy-ping 01ThreadNode 02BorderRouter

檢查第二個終端窗口中的最新日誌條目。您應該在日誌中看到這樣的一行:

DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ping6 -c 1 2001:0db8:0001:0002:5e53:bbff:fe05:484b

happy-ping命令無非是快樂運行ping6在命令happy000命名空間( 01ThreadNode )。

輸入節點

happy-shell運行非快樂命令,如果登錄到節點(網絡命名空間)中的一種:

$ happy-shell 01ThreadNode
root@01ThreadNode:#

模擬設備運行在每個命名空間中,它們只能訪問通過 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

8. 連接到服務

了解了 Happy 如何使用 Linux 網絡名稱空間後,您現在可能會意識到可以將模擬的 Happy 網絡連接到 Internet 並從模擬節點內訪問公共地址。這對於將模擬設備連接到真實服務(如 Nest Service over Weave)非常有用。

Weave 中的服務是一個基於雲的基礎設施,它將 HAN 節點連接到一個數據模型中,提供遠程訪問,並實施智能控制器以創建一個綜合生態系統。

Happy 可以通過兩種主要方式來表示服務:

  • 作為自己網絡命名空間中的模擬服務(Happy 節點)
  • 作為互聯網上真正的雲服務

預先定義的拓撲已經在已經提供~/happy/topologies作為每個服務場景的示例。

Happy節點上的模擬服務

刪除任何現有的 Happy 拓撲:

$ happy-state-delete

確認與空的狀態happy-stateweave-state的命令。

加載帶有接入點 (AP) 和服務節點的預定義拓撲:

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

6d04cbfcc84038e2.png

檢查 Happy 和 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

編織隧道

Weave 隧道將 Weave 結構連接到服務。這是在 HAN 和服務之間傳輸 IPv6 UDP 消息的安全路由。在此拓撲中, BorderRouter節點是編織網絡網關,其用作該HAN隧道端點。

創建編織隧道:

$ weave-tunnel-start BorderRouter cloud

重新檢查快樂狀態。你應該看到在編織IPv6地址的新隧道接口cloud節點:

NODES      Name    Interface    Type                                          IPs

          cloud service-tun0     tun   fd00:0000:fab1:0005:1ab4:3002:0000:0011/64

                        eth0     wan                             192.168.100.3/24

c5ffca09d7cd3208.png

您現在可以在 Weave 結構上的節點和服務的 Weave 全局前綴之間成功 ping:

$ 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-stateweave-state的命令。

加載具有接入點 (AP) 節點的預定義拓撲:

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

c75127417ef3833a.png

在這種拓撲結構, 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 節點並 ping 一個公共互聯網地址來測試這一點。我們將使用8.8.8.8 ,google.com的IPv4地址之一。

$ happy-shell onhub
root@onhub:# ping -c2 8.8.8.8
connect: Network is unreachable

要將連接onhub節點到互聯網,就必須橋接對Linux操作系統級別的配置此接口。

退出節點:

root@onhub:# exit

確定與您的互聯網連接接口route命令:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.0     0.0.0.0         UG    0      0        0 em1

找到default路由。這是您的 Linux 機器的互聯網連接。所述Iface列指示正被用於該連接的接口。在上面的例子中,它的em1

happy-internet設立了橋,使用界面為你的默認路由。對於--isp標誌,使用接口名稱,後面不跟數字。在這個例子中,它的em 。如果你的默認界面是eth1 ,在--isp標誌是eth

$ happy-internet --node onhub --interface em1 --isp em --seed 249

會有在沒有明顯的變化happy-state輸出,但onhub節點應該有互聯網連接。讓我們回到節點並檢查:

$ happy-shell onhub
root@onhub:# ping -c2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.81 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.81 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.814/1.816/1.819/0.042 ms

成功!

c4d411ab1734131.png

域名系統

Happy 節點沒有內置 DNS 功能。如果您嘗試 ping google.com,則會失敗:

root@onhub:# ping -c2 google.com
ping: unknown host google.com

幸運的是,Happy 提供了對 DNS 的支持。退出節點並找到 Linux 機器的 DNS 服務器。確保使用適當的默認界面:

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

編織隧道

和模擬服務一樣,Happy 中的模擬HAN 和服務之間必須建立一個Weave 隧道。對於真正的雲服務,請在隧道設置中使用服務的 IP 地址或 URL。例如:

$ weave-tunnel-start BorderRouter mycloud.service.com

3ed2c3c0df67f4d2.png

9. 清理

處理完 Happy 拓撲後,務必清理它們,以避免 Linux 網絡配置出現問題。

如果您在拓撲啟用DNS支持,通過重新運行與該命令將其刪除-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模擬自己的物聯網家域網
  • 如何將 Happy 拓撲連接到 Internet
  • Weave 的基礎知識通過 OpenWeave,Nest 的 Weave 開源版本

下一步

以此 Codelab 為基礎,嘗試以下練習:

  • 在每個 Thread 和 Wi-Fi 網絡中創建具有多個節點的更大拓撲,並在所有節點之間建立連接
  • 創建一個bash腳本通過加載拓撲happy-state-loadweave-state-load
  • 杭州快樂的命令,如happy-traceroutehappy-process-*

進一步閱讀

檢查openweave.io適用於各種文獻,其中包括:

f6996428fb06dede.png