一、簡介
快樂是由Nest實驗室進行模擬網絡拓撲結構的輕量化編排創建的工具。 Happy對於物聯網家庭局域網的開發和測試很有用。
使用 Happy,您可以:
- 在單台 Linux 開發機器上測試網絡協議和其他分佈式執行程序,無需使用 IoT 設備硬件
- 跨網絡執行自動化功能測試
- 在同一系統上運行多個並發、並行網絡以提高測試吞吐量
在這個程式碼實驗室中,您將學習如何開始與快樂,還有的基本編織的物聯網設備。你會使用編織實現OpenWeave ,由Nest發布了一個開源版本。
你會學到什麼
- 如何構建 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 創建以下三節點拓撲。
此拓撲是簡單家庭局域網 (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
加入到兩個ThreadNetwork
和WiFiNetwork
。這是因為作為 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地址。
因為 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
這是我們更新的拓撲:
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是成功的:一來就02BorderRouter
的wpan0
接口,這是唯一的地址01ThreadNode
可以直接到達:
因為轉發尚未啟用與其他IPv6地址失敗wpan0
並wlan0
上02BorderRouter
。因此, 01ThreadNode
不知道03WiFiNode
存在,或者如何去實現它。 Happy 把模擬網絡弄出來了,但是沒有開啟所有節點間的路由和轉發。
添加路線
要通過 HAN 路由 IPv6 流量,請將正確的路由添加到每個網絡中的每個節點,雙向(因此 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 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。
為了實現將所有東西連接在一起的更安全可靠的方式,讓我們在 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 值:
編織面料
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。這是編織配對代碼。
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-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 拓撲:
$ 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 中的每個節點和網絡都是一個網絡命名空間,而它們之間的鏈接是網絡接口。
例如,使用我們的拓撲:
讓我們看看 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",
運行時日誌
向節點發出的命令是從每個節點的命名空間內執行的基本終端命令。一個簡單的方法是啟用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-state
和weave-state
的命令。
加載帶有接入點 (AP) 和服務節點的預定義拓撲:
$ weave-state-load ~/happy/topologies/thread_wifi_ap_service.json
檢查 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
您現在可以在 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-state
和weave-state
的命令。
加載具有接入點 (AP) 節點的預定義拓撲:
$ weave-state-load ~/happy/topologies/thread_wifi_ap_internet.json
在這種拓撲結構, onhub
為AP。檢查快樂狀態。它類似於以前的拓撲結構,無需Internet
網絡和cloud
節點:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes HomeThread thread UP 2001:0db8:0111:0001/64 HomeWiFi wifi UP 2001:0db8:0222:0002/64 10.0.1/24 NODES Name Interface Type IPs BorderRouter wpan0 thread 2001:0db8:0111:0001:ca3f:71ff:fe53:1559/64 fd00:0000:fab1:0006:1ab4:3000:0000:0006/64 wlan0 wifi 2001:0db8:0222:0002:32e7:dfff:fee2:107a/64 fd00:0000:fab1:0001:1ab4:3000:0000:0006/64 10.0.1.2/24 ThreadNode wpan0 thread 2001:0db8:0111:0001:c2fb:97ff:fe04:64bd/64 fd00:0000:fab1:0006:1ab4:3000:0000:000a/64 onhub wlan0 wifi 10.0.1.3/24 2001:0db8:0222:0002:3a3c:8dff:fe38:999b/64 $ weave-state State Name: weave NODES Name Weave Node Id Pairing Code BorderRouter 18B4300000000006 AAA123 ThreadNode 18B430000000000A AAA123 FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
由於每個 Happy 節點都是一個網絡命名空間,因此默認情況下它們與公共互聯網是分開的。通過輸入一個 Happy 節點並 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
成功!
域名系統
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
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-load
或weave-state-load
- 杭州快樂的命令,如
happy-traceroute
和happy-process-*
進一步閱讀
檢查openweave.io適用於各種文獻,其中包括: