Начало работы с Happy and Weave

1. Введение

Happy — это инструмент, созданный лабораторией Nest для легкой оркестровки смоделированных сетевых топологий. Happy полезен для разработки и тестирования домашних сетей IoT.

С Хэппи вы можете:

  • Тестируйте сетевые протоколы и другие распределенные программы выполнения на одном компьютере для разработки Linux без использования оборудования IoT-устройства.
  • Выполнение автоматизированного функционального тестирования в сети
  • Запустите несколько одновременных параллельных сетей в одной системе, чтобы повысить производительность тестирования.

В этой лаборатории кода вы узнаете, как начать работу с Happy, а также познакомитесь с основами Weave для устройств IoT. Реализация Weave, которую вы будете использовать, — это OpenWeave , версия с открытым исходным кодом, выпущенная Nest.

f6996428fb06dede.png

Что вы узнаете

  • Как построить 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.

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 был добавлен как в 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

Теперь наша топология выглядит так:

2d054e6c4e54089c.png

Последним шагом в создании нашей сети 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

Вот наша обновленная топология:

84eecd23871618ca.png

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 может напрямую обратиться:

5447bcbdf7d539df.png

Не удалось использовать другие адреса IPv6, так как не включена переадресация между wpan0 и wlan0 на 02BorderRouter . Таким образом, 01ThreadNode понятия не имеет о существовании 03WiFiNode или о том, как к нему добраться. Happy запустил смоделированную сеть, но не включил всю маршрутизацию и пересылку между узлами.

Добавить маршруты

Чтобы направить трафик IPv6 через HAN, добавьте правильные маршруты к каждому узлу в каждой сети в обоих направлениях (чтобы команда 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 для каждого узла. Это позволяет маршрутизировать трафик от одного интерфейса к другому внутри узла.

Теперь повторите пинг:

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

5bb53be0280b3320.png

Чтобы обеспечить более безопасный и надежный способ соединения всего вместе, давайте добавим 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, выделенными синим цветом:

ce3fa9082408355b.png

Ткать ткань

В состояниях 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 символов, которую часто называют ключом входа. Это Код Сопряжения Плетения.

e7c6fa3e24d61d1b.png

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 — это сетевое пространство имен, а ссылки между ними — это сетевые интерфейсы.

Например, используя нашу топологию:

7d6654c2e4907f2a.png

Давайте посмотрим, какие пространства имен 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",

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 — это не что иное, как 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

6d04cbfcc84038e2.png

Проверьте состояния 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

c5ffca09d7cd3208.png

Теперь вы можете успешно выполнять эхо-запросы между узлами в структуре 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

c75127417ef3833a.png

В этой топологии 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

Успех!

c4d411ab1734131.png

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

3ed2c3c0df67f4d2.png

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 , чтобы найти множество ссылок, в том числе:

f6996428fb06dede.png