1. Введение
Happy — это инструмент, созданный лабораторией Nest для легкой оркестровки смоделированных сетевых топологий. Happy полезен для разработки и тестирования домашних сетей IoT.
С Хэппи вы можете:
- Тестируйте сетевые протоколы и другие распределенные программы выполнения на одном компьютере для разработки Linux без использования оборудования IoT-устройства.
- Выполнение автоматизированного функционального тестирования в сети
- Запустите несколько одновременных параллельных сетей в одной системе, чтобы повысить производительность тестирования.
В этой лаборатории кода вы узнаете, как начать работу с Happy, а также познакомитесь с основами Weave для устройств IoT. Реализация Weave, которую вы будете использовать, — это OpenWeave , версия с открытым исходным кодом, выпущенная Nest.

Что вы узнаете
- Как построить Happy и OpenWeave
- Как вручную создать смоделированную сеть IoT
- Как управлять пользовательскими топологиями
- Как подключить смоделированную сеть Happy к Интернету
- Основы плетения
Что вам понадобится
- Linux-машина, физическая или виртуальная
- Git-клиент или cli
- Питон 2.7
- Базовое понимание концепций сетей и маршрутизации
2. Начать
Установите набор инструментов и зависимости
Чтобы собрать Happy и 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 теперь должны быть доступны из командной строки:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes NODES Name Interface Type IPs
Установить OpenWeave
Установите OpenWeave из корневого каталога OpenWeave:
$ cd ~/openweave-core $ make -f Makefile-Standalone
Настройте Happy с OpenWeave
Чтобы использовать OpenWeave с Happy, вам нужно сообщить Happy, где найти установку Weave. Обновите конфигурацию Happy, указав путь к /src/test-apps в вашей сборке OpenWeave:
$ happy-configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps
Подтвердите конфигурацию:
$ happy-configuration
User Happy Configuration
weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps
Проверьте установку OpenWeave
Команды Weave, необходимые в этой лаборатории кода, доступны из командной строки:
$ 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 среды PATH, указав путь, используемый для двоичных файлов Happy:
$ 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, добавьте префикс IPv6 в сеть Thread:
$ 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
Еще раз проверьте состояние счастья. Всем интерфейсам назначены 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. Проверьте подключение
Теперь, когда наша сеть Happy настроена и работает, давайте проверим ее подключение, пропинговав другие узлы с 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 пытается пропинговать каждый IP-адрес для каждого интерфейса на целевом узле. Мы можем игнорировать адреса IPv4, потому что Thread использует только IPv6.
Обратите внимание, что только один ping IPv6 был успешным: на интерфейсе 02BorderRouter wpan0 , который является единственным адресом, к 01ThreadNode может напрямую обратиться:

Не удалось использовать другие адреса IPv6, так как не включена переадресация между wpan0 и wlan0 на 02BorderRouter . Таким образом, 01ThreadNode понятия не имеет о существовании 03WiFiNode или о том, как к нему добраться. Happy запустил смоделированную сеть, но не включил всю маршрутизацию и пересылку между узлами.
Добавить маршруты
Чтобы направить трафик IPv6 через HAN, добавьте правильные маршруты к каждому узлу в каждой сети в обоих направлениях (чтобы команда ping знала, как вернуться к исходному узлу).
Для каждого узла вам необходимо знать:
- ближайший сетевой шлюз — в данном случае
02BorderRouterдля обоих - целевая сеть — куда идти после шлюза
Для нашей трехузловой сети это дает нам следующее:
из исходной сети | в целевую сеть | через шлюз |
| | |
| | |
Это можно сделать индивидуально для каждого узла с помощью happy-node-route , но проще сделать это для всех узлов в каждой сети с помощью happy-network-route .
$ happy-network-route -a -i ThreadNetwork -t default -v 02BorderRouter -p 2001:db8:1:2::/64 $ happy-network-route -a -i WiFiNetwork -t default -v 02BorderRouter -p 2001:db8:a:b::/64
Для объяснения флагов командной строки используйте happy-network-route -h .
Команда happy-network-route также при необходимости включает переадресацию IPv4 и IPv6 для каждого узла. Это позволяет маршрутизировать трафик от одного интерфейса к другому внутри узла.
Теперь повторите пинг:
$ happy-ping 01ThreadNode 02BorderRouter
[Ping] ping from 01ThreadNode to 02BorderRouter on address
10.0.1.2 -> 100% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
2001:0db8:0001:0002:a651:3eff:fe92:6dbc -> 0% packet loss
[Ping] ping from 01ThreadNode to 02BorderRouter on address
2001:0db8:000a:000b:426c:38ff:fe90:01e6 -> 0% packet loss
Оба пинга IPv6 работают! При включенной пересылке он знает, как добраться до интерфейса wlan0 . Пинг IPv4 по-прежнему не работает, потому что мы настроили только маршруты и переадресацию IPv6 (также потому, что Thread не работает поверх IPv4).
Поскольку мы добавили сетевые маршруты в обе стороны, давайте пропингуем сети:
$ 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 работает как положено. Теперь у вас есть полнофункциональная смоделированная HAN IPv6.

Чтобы обеспечить более безопасный и надежный способ соединения всего вместе, давайте добавим Weave поверх HAN.
5. Добавляем переплетение
Weave — это уровень сетевых приложений, обеспечивающий безопасную и надежную коммуникационную основу для продуктов Nest. Мы можем добавить функциональность Weave с помощью OpenWeave, версии Weave с открытым исходным кодом.
Реализация Weave называется «ткань». Ткань Weave — это сеть, которая включает в себя все узлы HAN, службу Nest и любые мобильные устройства, участвующие в HAN. Он находится поверх HAN и обеспечивает более простую маршрутизацию по различным базовым технологиям сетевых каналов (например, Thread или Wi-Fi).
Создайте структуру Weave для своей HAN, используя fab1 в качестве идентификатора структуры, затем настройте все узлы для Weave:
$ 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
Каждый узел был добавлен в структуру Weave, и каждый интерфейс имеет новый IPv6-адрес, начинающийся с fd00 . Чтобы получить больше информации о ткани Weave, используйте команду 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
Weave использует префикс IPv6 fd00::/48 для каждого узла. Адреса в этом блоке называются уникальными локальными адресами и предназначены для использования в частных сетях, таких как HAN. В сочетании с идентификатором Fabric создается глобальный префикс Weave, показанный выше.
Узлы плетения
Каждому узлу в ткани Weave назначается уникальный идентификатор узла вместе с кодом сопряжения:
NODES Name Weave Node Id Pairing Code
01ThreadNode 69ca9502eb6911e7 8ZJB5Q
02BorderRouter 686af236eb6911e7 B5YV3P
03WiFiNode 69826e60eb6911e7 L3VT3A
Идентификатор узла глобально идентифицирует узел в структуре Weave. Код сопряжения используется в качестве «удостоверения участника» в процессе сопряжения и обычно печатается вместе с QR-кодом продукта.
Например, если вы посмотрите на QR-код Nest Protect или Nest Cam, вы заметите строку из 6 символов, которую часто называют ключом входа. Это Код Сопряжения Плетения.

Weave использует комбинацию глобального префикса, идентификатора фабрики и идентификатора узла для создания специфичных для Weave IPv6-адресов для каждого узла и интерфейса в фабрике.
Сплетите адреса
Обратите внимание, что в топологии Happy есть четыре новых адреса IPv6, все они начинаются с нашего глобального префикса Weave fd00:0000:fab1::/48 .
NODES Name Interface Type IPs
01ThreadNode wpan0 thread 2001:0db8:0001:0002:3e36:13ff:fe33:732e/64
fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64
02BorderRouter wpan0 thread fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64
2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64
wlan0 wifi fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64
10.0.1.2/24
2001:0db8:000a:000b:426c:38ff:fe90:01e6/64
03WiFiNode wlan0 wifi 2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64
10.0.1.3/24
fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64
Протоколы Weave используют эти адреса для связи через ткань Weave, а не стандартные адреса IPv6, назначенные каждому узлу.
Сетевой шлюз Weave
Узлы Weave в сети Thread должны знать, где выйти из этой сети. Сетевой шлюз Weave — обычно на пограничном маршрутизаторе потоков — обеспечивает эту функциональность.
В нашем примере топологии давайте назначим узел BorderRouter в качестве сетевого шлюза Weave:
$ weave-network-gateway ThreadNetwork 02BorderRouter
Эта команда добавляет маршрут от всех узлов Thread к подсети структуры Weave ( fd:0:fab1::/48 ) через интерфейс Thread узла BorderRouter ( wpan0 ), что позволяет каждому узлу Thread достигать любого узла Weave за пределами сети Thread. Это аналогично команде happy-network-route , которую мы использовали ранее, но специфичной для маршрутов ткани Weave.
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 -
weave-state-load— поддерживает плагин Weave
Поэтому, если ваша топология включает Weave, всегда используйте команду weave-state-load , чтобы применялась ткань Weave и соответствующая конфигурация.
Перезагрузите сохраненную топологию 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-script, так и в формате 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, вы увидите, каким узлам и сетям соответствует каждое пространство имен:
$ 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 — это не что иное, как Happy, запускающая команду ping6 в пространстве имен happy000 ( 01ThreadNode ).
Введите узел
Используйте happy-shell для запуска не-Happy-команд, как если бы вы вошли в один из узлов (сетевые пространства имен):
$ 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 к Интернету и получить доступ к публичным адресам из смоделированных узлов. Это полезно для подключения смоделированных устройств к реальному сервису (например, Nest Service через Weave).
Услуга в Weave представляет собой облачную инфраструктуру, которая соединяет узлы HAN в модель данных, обеспечивает удаленный доступ и внедряет интеллектуальные контроллеры для создания комплексной экосистемы.
Услуга может быть представлена двумя основными способами с помощью Happy:
- Как смоделированная служба в собственном сетевом пространстве имен (Happy node)
- Как настоящий облачный сервис в Интернете
Предопределенные топологии представлены в ~/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 — это точка доступа, а 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 со службой. Это безопасный маршрут, по которому передаются сообщения IPv6 UDP между HAN и службой. В этой топологии узел BorderRouter является сетевым шлюзом Weave, который функционирует как конечная точка туннеля в HAN.
Создайте туннель Weave:
$ weave-tunnel-start BorderRouter cloud
Перепроверьте счастливое состояние. Вы должны увидеть новый интерфейс туннеля с адресом Weave 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 службы:
$ 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 является точкой доступа. Проверьте счастливое состояние. Это похоже на предыдущую топологию, без 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 и пропинговав общедоступный интернет-адрес. Мы будем использовать 8.8.8.8 , один из IPv4-адресов google.com.
$ 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
Успех!

DNS
Счастливые узлы не имеют встроенных возможностей DNS. Если вы попытаетесь пропинговать google.com, произойдет сбой:
root@onhub:# ping -c2 google.com ping: unknown host google.com
К счастью, Happy обеспечивает поддержку DNS. Выйдите из узла и найдите DNS-серверы для вашего компьютера с Linux. Обязательно используйте соответствующий интерфейс по умолчанию:
root@onhub:# exit $ nmcli dev list iface em1 | grep domain_name_servers DHCP4.OPTION[13]: domain_name_servers = 172.16.255.1 172.16.255.153 172.16.255.53
Используйте эти DNS-адреса с happy-dns :
$ happy-dns 172.16.255.1 172.16.255.153 172.16.255.53
Теперь попробуйте пропинговать google.com из узла onhub :
$ happy-shell onhub root@onhub:# ping -c2 google.com PING google.com (64.233.191.113) 56(84) bytes of data. 64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=1 ttl=46 time=36.9 ms 64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=2 ttl=46 time=37.0 ms --- google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 36.978/36.995/37.013/0.193 ms
Выйдите из узла onhub , когда закончите:
root@onhub:# exit
Переплетите туннель
Как и смоделированный сервис, туннель Weave должен быть настроен между смоделированным HAN в Happy и сервисом. В реальной облачной службе используйте 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-state-delete
Иногда некоторые файлы состояния могут оставаться после удаления состояния. Если вы столкнулись с проблемами, и Happy не работает должным образом, удалите состояние с помощью happy-state-delete а затем используйте следующие команды, чтобы принудительно выполнить оставшуюся очистку:
$ ip netns | xargs -I {} sudo ip netns delete {}
$ rm -rf ~/.*state.json
$ rm -rf ~/.*state.json.lock
Ваша машина должна вернуться к своей нормальной сетевой конфигурации.
10. Поздравляем!
Теперь вы знаете:
- Как использовать Happy для имитации собственных домашних сетей IoT
- Как подключить топологию Happy к интернету
- Основы Weave через OpenWeave, версию Weave с открытым исходным кодом от Nest.
Следующие шаги
Основываясь на этой Codelab, попробуйте выполнить следующие упражнения:
- Создайте более крупную топологию с несколькими узлами в каждой сети Thread и Wi-Fi и установите связь между всеми узлами.
- Создайте bash-скрипт для загрузки топологии через
happy-state-loadилиweave-state-load - Изучите другие команды Happy, такие как
happy-tracerouteиhappy-process-*
дальнейшее чтение
Посетите openweave.io , чтобы найти множество ссылок, в том числе:
