Erste Schritte mit Happy and Weave

1. Einleitung

Glücklich ist ein Werkzeug von Nest Labs für leichte Orchestrierung von simulierten Netzwerktopologien erstellt. Happy ist nützlich für die Entwicklung und das Testen von IoT-Heimnetzwerken.

Mit Happy können Sie:

  • Testen Sie Netzwerkprotokolle und andere verteilte Ausführungsprogramme auf einem einzigen Linux-Entwicklungscomputer, ohne IoT-Gerätehardware zu verwenden
  • Führen Sie automatisierte Funktionstests in einem Netzwerk durch
  • Führen Sie mehrere gleichzeitige, parallele Netzwerke auf demselben System aus, um den Testdurchsatz zu verbessern

In diesem Codelab, erfahren Sie , wie mit glücklichem zu beginnen, sowie die Grundlagen der Webart für IoT - Geräte. Die Webart Implementierung Sie verwenden werden , ist OpenWeave , eine Open-Source - Version von Nest freigegeben.

f6996428fb06dede.png

Was du lernst

  • So bauen Sie Happy und OpenWeave
  • So erstellen Sie manuell ein simuliertes IoT-Netzwerk
  • So verwalten Sie benutzerdefinierte Topologien
  • So verbinden Sie ein simuliertes Happy-Netzwerk mit dem Internet
  • Die Grundlagen von Weben

Was du brauchen wirst

  • Eine Linux-Maschine, physisch oder virtuell
  • Git-Client oder -cli
  • Python 2.7
  • Ein grundlegendes Verständnis von Netzwerk- und Routingkonzepten

2. Fangen Sie an

Toolchain und Abhängigkeiten installieren

Um Happy and Weave zu erstellen, stellen Sie sicher, dass Sie eine unterstützte Toolchain und alle Abhängigkeiten installiert haben.

$ 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

Holen Sie sich den Quellcode

Klonen Sie die Happy- und OpenWeave-Git-Repositorys über die Befehlszeile:

$ cd ~
$ git clone https://github.com/openweave/happy.git
$ git clone https://github.com/openweave/openweave-core.git

Installieren Sie Happy

Installieren Sie Happy aus dem Happy-Stammverzeichnis:

$ cd ~/happy
$ make

Überprüfen Sie die glückliche Installation

Happy-Befehle sollten jetzt über die Befehlszeile zugänglich sein:

$ happy-state
State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes

NODES      Name    Interface    Type                                          IPs

OpenWeave installieren

Installieren Sie OpenWeave aus dem OpenWeave-Stammverzeichnis:

$ cd ~/openweave-core
$ make -f Makefile-Standalone

Konfigurieren Sie Happy mit OpenWeave

Um OpenWeave mit Happy zu verwenden, müssen Sie Happy mitteilen, wo die Weave-Installation zu finden ist. Aktualisieren Sie die glückliche Konfiguration mit dem Pfad zu /src/test-apps in Ihrem OpenWeave Baujahr:

$ happy-configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps

Bestätigen Sie die Konfiguration:

$ happy-configuration
User Happy Configuration
        weave_path         ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps

Überprüfen Sie die OpenWeave-Installation

Weave-Befehle, die in diesem Codelab benötigt werden, sind über die Befehlszeile zugänglich:

$ 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

Wenn Sie den Fehler weave-fabric-add: command not found , aktualisieren Sie Ihren PATH - Umgebungsvariable mit dem Pfad für Happy - Binärdateien verwendet:

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

3. Ihre erste Topologie

Lassen Sie uns mit Happy die folgende Topologie mit drei Knoten erstellen.

a3295ee87fbd9764.png

Diese Topologie ist ein Beispiel für ein einfaches Home Area Network (HAN). In diesem HAN sind zwei Knoten in einem Thread-Netzwerk miteinander verbunden, und einer dieser Knoten verbindet sich über Wi-Fi mit einem dritten. Dieser Knoten kann auch zu Hause mit einem WLAN-Router verbunden werden, um eine Internetverbindung für den gesamten HAN bereitzustellen. Dazu später mehr.

Erstellen Sie zunächst die drei Knoten:

$ happy-node-add 01ThreadNode
$ happy-node-add 02BorderRouter
$ happy-node-add 03WiFiNode

Stellen wir sicher, dass sie existieren:

$ happy-node-list
01ThreadNode
02BorderRouter
03WiFiNode

Lassen Sie uns nun einige Netzwerke erstellen:

$ happy-network-add ThreadNetwork thread
$ happy-network-add WiFiNetwork wifi

Überprüfen Sie, ob die Netzwerke vorhanden sind:

$ happy-network-list
ThreadNetwork
WiFiNetwork

Überprüfen Sie den Status "Zufrieden":

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP
    WiFiNetwork         wifi      UP

NODES      Name    Interface    Type                                          IPs
   01ThreadNode
 02BorderRouter
     03WiFiNode

Es reicht nicht aus, nur ein Netzwerk aufzubauen – wir müssen den Netzwerken Knoten hinzufügen. Fügen Sie gemäß unserem Topologiediagramm jeden Knoten dem/den entsprechenden Netzwerk(en) hinzu:

$ happy-node-join 01ThreadNode ThreadNetwork
$ happy-node-join 02BorderRouter ThreadNetwork
$ happy-node-join 02BorderRouter WiFiNetwork
$ happy-node-join 03WiFiNode WiFiNetwork

Beachten Sie, dass 02BorderRouter wurde sowohl hinzugefügt ThreadNetwork und WiFiNetwork . Denn als Border Router innerhalb unseres HAN verbindet dieser Knoten die beiden einzelnen Netzwerke miteinander.

Überprüfen Sie den Status "Zufrieden". Die Schnittstellen jedes Knotens sind aktiv:

$ 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

Unsere Topologie sieht nun so aus:

2d054e6c4e54089c.png

Der letzte Schritt beim Aufbau unseres Happy-Netzwerks besteht darin, jeder Schnittstelle auf jedem Knoten IP-Adressen zuzuweisen. Geben Sie das IP-Präfix für ein Netzwerk an und Happy weist Ihnen automatisch IP-Adressen zu.

Da das Thread-Protokoll IPv6 verwendet, fügen Sie dem Thread-Netzwerk ein IPv6-Präfix hinzu:

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

Überprüfen Sie den Status "Zufrieden". Die Thread-Schnittstellen auf jedem Thread-Knoten haben IP-Adressen:

$ 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

Fügen Sie für das WLAN-Netzwerk sowohl IPv4- als auch IPv6-Präfixe hinzu:

$ happy-network-address WiFiNetwork 2001:db8:a:b::
$ happy-network-address WiFiNetwork 10.0.1.0

Überprüfen Sie den Happy-Zustand noch einmal. Alle Schnittstellen haben zugewiesene IP-Adressen, mit zwei für jede Wi-Fi-Schnittstelle:

$ 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

Hier ist unsere aktualisierte Topologie:

84eecd23871618ca.png

4. Testen Sie die Konnektivität

Nun , da unsere Happy - Netzwerk ist und läuft, lassen Sie uns die Konnektivität testen , indem Sie die anderen Knoten aus Pingen 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

Die happy-ping - Befehl versucht , jede IP - Adresse für jede Schnittstelle auf dem Zielknoten pingen. Wir können die IPv4-Adressen ignorieren, da Thread nur IPv6 verwendet.

Beachten Sie, dass nur eine IPv6 Ping erfolgreich war: die eine auf 02BorderRouter ‚s wpan0 - Schnittstelle, die die einzige Adresse ist 01ThreadNode direkt erreichen:

5447bcbdf7d539df.png

Die anderen IPv6 - Adressen sind fehlgeschlagen , da Weiterleitung zwischen nicht aktiviert wurde wpan0 und wlan0 auf 02BorderRouter . So 01ThreadNode hat keine Ahnung , 03WiFiNode vorhanden ist , oder wie es zu erreichen. Happy hat das simulierte Netzwerk aufgerufen, aber nicht das gesamte Routing und die Weiterleitung zwischen den Knoten aktiviert.

Routen hinzufügen

Um IPv6-Datenverkehr über den HAN zu leiten, fügen Sie die richtigen Routen zu jedem Knoten in jedem Netzwerk in beide Richtungen hinzu (damit der Ping weiß, wie er zum Quellknoten zurückkehrt).

Für jeden Knoten müssen Sie Folgendes wissen:

  • das nächste Netzwerk - Gateway-in diesem Fall 02BorderRouter für beide
  • das Zielnetzwerk – wohin nach dem Gateway

Für unser Drei-Knoten-Netzwerk ergibt sich daraus Folgendes:

vom Quellnetzwerk

zum Zielnetzwerk

über Gateway

ThreadNetwork

WiFiNetwork

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

WiFiNetwork

ThreadNetwork

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

Dies kann individuell für jeden Knoten mit erfolgen happy-node-route , aber es ist einfacher , es für alle Knoten mit in jedes Netzwerk zu tun 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

Eine Erläuterung der Befehlszeilen - Flags, verwenden Sie happy-network-route -h .

Der happy-network-route - Befehl schaltet auch IPv4 und IPv6 - Forwarding für jeden Knoten, je nach Bedarf. Dadurch kann der Verkehr innerhalb eines Knotens von einer Schnittstelle zu einer anderen geleitet werden.

Versuchen Sie nun den Ping erneut:

$ 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

Beide IPv6-Pings funktionieren! Mit Weiterleitung auf, weiß er , wie das erreichen wlan0 Schnittstelle. Der IPv4-Ping schlägt immer noch fehl, da wir nur IPv6-Routen und -Weiterleitung konfiguriert haben (auch weil Thread nicht über IPv4 läuft).

Da wir auf beiden Seiten Netzwerkrouten hinzugefügt haben, lassen Sie uns über Netzwerke pingen:

$ 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

Der IPv6-Ping funktioniert wie erwartet. Sie haben jetzt einen voll funktionsfähigen, simulierten IPv6-HAN.

5bb53be0280b3320.png

Um eine sicherere und zuverlässigere Möglichkeit zu ermöglichen, alles miteinander zu verbinden, fügen wir Weave über dem HAN hinzu.

5. Webart hinzufügen

Weave ist eine Netzwerkanwendungsschicht, die das sichere und zuverlässige Kommunikations-Backbone für Nest-Produkte bietet. Wir können die Weave-Funktionalität mit OpenWeave, der Open-Source-Version von Weave, hinzufügen.

Eine Implementierung von Weave wird als "Stoff" bezeichnet. Ein Weave Fabric ist ein Netzwerk, das alle HAN-Knoten, den Nest-Dienst und alle am HAN teilnehmenden Mobilgeräte umfasst. Es sitzt auf dem HAN und ermöglicht ein einfacheres Routing über die verschiedenen zugrunde liegenden Netzwerkverbindungstechnologien (z. B. Thread oder Wi-Fi).

Erstellen Sie die Webart Stoff für Ihren HAN, mit fab1 als Stoff - ID, dann konfigurieren , dass alle Knoten für Weave:

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

Nachdem Weave konfiguriert ist, überprüfen Sie den Status 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

Jeder Knoten ist mit dem Webstoff hinzugefügt, und jede Schnittstelle weist eine neue IPv6 - Adresse mit dem Start fd00 . Um weitere Informationen über die Webart Stoff zu erhalten, verwenden Sie die weave-state - Befehl ein :

$ 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

Hier ist unsere aktualisierte Topologie mit den Weave-Werten in Blau:

ce3fa9082408355b.png

Webstoff

Es gibt viele neue Informationen in den Bundesstaaten Weave und Happy. Beginnen wir mit dem Stoff aus weave-state :

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

Weave verwendet ein IPv6 - Präfix von fd00::/48 für jeden Knoten. Adressen in diesem Block werden als Unique Local Addresses bezeichnet und sind für die Verwendung in privaten Netzwerken wie einer HAN vorgesehen. Durch die Kombination mit der Fabric-ID wird das oben gezeigte globale Weave-Präfix generiert.

Knoten flechten

Jedem Knoten im Weave-Fabric wird eine eindeutige Knoten-ID zusammen mit einem Pairing-Code zugewiesen:

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

Die Knoten-ID identifiziert global einen Knoten im Weave-Fabric. Der Pairing-Code wird während des Pairing-Prozesses als "Joiner-Anmeldeinformationen" verwendet und normalerweise zusammen mit dem QR-Code eines Produkts gedruckt.

Wenn Sie sich beispielsweise den QR-Code auf einem Nest Protect oder einer Nest Cam ansehen, werden Sie eine sechsstellige Zeichenfolge bemerken, die oft als Zugangsschlüssel bezeichnet wird. Dies ist der Weave Pairing Code.

e7c6fa3e24d61d1b.png

Weave verwendet eine Kombination aus dem globalen Präfix, der Fabric-ID und der Node-ID, um Weave-spezifische IPv6-Adressen für jeden Knoten und jede Schnittstelle in der Fabric zu erstellen.

Adressen weben

Beachten Sie, dass es vier neue IPv6 - Adressen in der Happy - Topologie sind, alle beginnend mit unserer Weave globalen Präfix von 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-Protokolle verwenden diese Adressen, um über das Weave-Fabric zu kommunizieren, und nicht die jedem Knoten zugewiesenen Standard-IPv6-Adressen.

Weave-Netzwerk-Gateway

Weave-Knoten in einem Thread-Netzwerk müssen wissen, wo dieses Netzwerk zu verlassen ist. Ein Weave-Netzwerk-Gateway – normalerweise auf einem Thread-Border-Router – bietet diese Funktionalität.

In unserer Beispieltopologie legen wir den BorderRouter-Knoten als Weave-Netzwerk-Gateway fest:

$ weave-network-gateway ThreadNetwork 02BorderRouter

Mit diesem Befehl wird eine Route von allen Gewinden Knoten zum Webstoff Subnetzes ( fd:0:fab1::/48 ) über das BorderRouter Gewinde Schnittstelle des Knotens ( wpan0 ), die jeden Thread Knoten jede Webart Knoten über das Thema Netzwerk zu erreichen ermöglicht. Dies ist analog zu dem happy-network-route - Befehl wir früher verwendet, aber spezifisch für Webstoff Routen.

6. Topologiewartung

Was Happy so leistungsstark macht, ist die einfache Verwaltung des gesamten Auf- und Abbaus einer simulierten Topologie.

Speichern Sie Ihre Happy-Topologie zur späteren Verwendung:

$ happy-state -s codelab.json

Dies stellt eine JSON - Datei mit der vollständigen Topologie in Ihrem Stamm ~/ Ordnern. Die JSON - Datei ist eine Kopie Ihres aktuellen glücklichen Zustand, der bei gefunden ~/.happy_state.json .

Löschen Sie nach dem Speichern die aktuelle Topologie:

$ happy-state-delete

Dies löscht all Netzwerk - Namespaces und die damit verbundene gefundenen Konfigurationen in der ~/.happy-state.json Datei. Überprüfen Sie happy-state und weave-state eine leere Konfiguration zu bestätigen:

$ 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

Um eine gespeicherte Konfiguration neu zu laden, verwenden Sie einen von zwei Befehlen:

  • happy-state-load - nicht unterstützt Weave - Plugin
  • weave-state-load - unterstützt Weave - Plugin

Also , wenn Ihre Topologie Weave enthält, verwenden Sie immer den weave-state-load - Befehl , so dass der Webstoff und zugehörige Konfiguration angewandt wird.

Laden Sie die gespeicherte Happy-Topologie erneut:

$ weave-state-load codelab.json

Überprüfen Sie alle Zustände, um ein erfolgreiches Laden zu bestätigen:

$ 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

Im Happy-Repository wurden eine Reihe vordefinierter Topologien sowohl im Shell-Skript- als auch im JSON-Format bereitgestellt. Finden Sie sie auf ~/happy/topologies .

OpenWeave wird zu Testzwecken auch mit ausgewählten vordefinierten Happy-Topologien geliefert. Finden Sie sie auf ~/openweave-core/src/test-apps/happy/topologies/standalone .

7. Wie es funktioniert

Happy verwendet Linux-Netzwerk-Namespaces, um komplexe Topologien zu simulieren. Normalerweise gilt eine Netzwerkkonfiguration für das gesamte Linux-Betriebssystem. Mit Netzwerk-Namespaces können Sie Netzwerkkonfigurationen partitionieren, sodass jeder Namespace über einen eigenen Satz von Schnittstellen und Routing-Tabellen verfügt.

Jeder Knoten und jedes Netzwerk in Happy ist ein Netzwerknamensraum, während Verbindungen zwischen ihnen Netzwerkschnittstellen sind.

Verwenden Sie beispielsweise unsere Topologie:

7d6654c2e4907f2a.png

Mal sehen, welche Namespaces Happy dafür erstellt hat:

$ ip netns list
happy004
happy003
happy002
happy001
happy000

Wenn Sie das Kontroll netns Abschnitts der glücklichen Zustand JSON - Datei können Sie , was Knoten und Netzwerke jeweils Namensraum entspricht sehen:

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

49cfdce6ff9dd745.png

Laufzeitprotokolle

An Knoten ausgegebene Befehle sind grundlegende Terminalbefehle, die innerhalb des Namensraums jedes Knotens ausgeführt werden. Eine einfache Möglichkeit, dies zu sehen, besteht darin, Happy-Laufzeitprotokolle zu aktivieren.

Öffnen Sie ein zweites Terminalfenster und schalten Sie Protokolle ein, sie werden kontinuierlich in diesem Fenster ausgeführt:

$ happy-state -l

Gehen Sie zurück zum ersten Fenster und führen Sie einen Happy-Ping aus:

$ happy-ping 01ThreadNode 02BorderRouter

Überprüfen Sie die neuesten Logeinträge im zweiten Terminalfenster. Sie sollten eine Zeile wie diese in den Protokollen sehen:

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

Die happy-ping - Befehl ist nicht mehr als glücklich , den laufenden ping6 Befehl im happy000 Namensraum ( 01ThreadNode ).

Geben Sie einen Knoten ein

Verwenden happy-shell nicht-Happy Befehle auszuführen als protokolliert , wenn in einem der Knoten (Netzwerk - Namespaces):

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

Simulierte Geräte werden in jedem Namespace ausgeführt und haben nur Zugriff auf die von Happy angegebene Netzwerkkonfiguration.

Überprüfen Sie die Schnittstellenkonfiguration für den Knoten. Dies unterscheidet sich von Ihrer betriebssystemweiten Konfiguration und sollte widerspiegeln, was im Status "Zufrieden" aufgeführt ist:

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)

Verwenden exit des Knotens Namensraum zu verlassen:

root@01ThreadNode:# exit

8. Mit einem Dienst verbinden

Wenn Sie wissen, wie Happy Linux-Netzwerk-Namespaces verwendet, werden Sie jetzt vielleicht feststellen, dass es möglich ist, ein simuliertes Happy-Netzwerk mit dem Internet zu verbinden und von simulierten Knoten aus auf öffentliche Adressen zuzugreifen. Dies ist nützlich, um Ihre simulierten Geräte mit einem echten Dienst (wie dem Nest-Dienst über Weave) zu verbinden.

Der Service in Weave ist eine Cloud-basierte Infrastruktur, die HAN-Knoten zu einem Datenmodell verbindet, Fernzugriff bietet und intelligente Controller implementiert, um ein umfassendes Ökosystem zu schaffen.

Der Service kann mit Happy auf zwei Arten dargestellt werden:

  • Als simulierter Dienst im eigenen Netzwerknamensraum (Happy Node)
  • Als echter Cloud-Dienst im Internet

Vordefinierte Topologien wurden bereitgestellt ~/happy/topologies als Beispiel für jeden Dienst Szenario.

Simulierter Dienst auf einem Happy-Knoten

Entfernen Sie alle vorhandenen Happy-Topologien:

$ happy-state-delete

Bestätigen Sie einen leeren Zustand mit den happy-state und weave-state - Befehle.

Laden Sie eine vordefinierte Topologie mit Access Point (AP) und Service Nodes:

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

6d04cbfcc84038e2.png

Überprüfen Sie die Zustände Happy und Weave, um die Topologie zu bestätigen. In dieser Topologie onhub ist die AP, während cloud der simulierte Service. Hinweis sind beide mit einem Internet - Netzwerk des Typs 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

Tunnel flechten

Ein Weave-Tunnel verbindet das Weave-Fabric mit einem Dienst. Dies ist eine sichere Route, die IPv6-UDP-Nachrichten zwischen dem HAN und dem Dienst überträgt. In dieser Topologie der BorderRouter ist der Knoten der Webart Netzwerk - Gateway, der als der Tunnelendpunkt auf dem HAN.

Erstellen Sie den Weave-Tunnel:

$ weave-tunnel-start BorderRouter cloud

Überprüfen Sie den Status "Zufrieden". Sie sollten einen neuen Tunnel - Schnittstelle mit einer Webart IPv6 - Adresse auf dem sehen cloud - Knoten:

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

Sie können jetzt erfolgreich zwischen Knoten im Weave-Fabric und dem globalen Weave-Präfix des Dienstes pingen:

$ happy-ping ThreadNode cloud
[Ping] ping from ThreadNode to cloud on address
    fd00:0000:fab1:0005:1ab4:3002:0000:0011 -> 0% packet loss

Echter Cloud-Service im Internet

Entfernen Sie alle vorhandenen Happy-Topologien:

$ happy-state-delete

Bestätigen Sie einen leeren Zustand mit den happy-state und weave-state - Befehle.

Laden Sie eine vordefinierte Topologie mit einem Access Point (AP)-Knoten:

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

c75127417ef3833a.png

In dieser Topologie onhub ist die AP. Überprüfen Sie den Status "Zufrieden". Es ist ähnlich wie bei der vorherigen Topologie, ohne das Internet - Netzwerk und cloud - Knoten:

$ 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

Da jeder Happy-Knoten ein Netzwerk-Namespace ist, werden sie standardmäßig vom öffentlichen Internet partitioniert. Testen Sie dies, indem Sie einen Happy-Knoten eingeben und eine öffentliche Internetadresse anpingen. Wir verwenden 8.8.8.8 , von google.com IPv4 - Adressen.

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

Um die Verbindung onhub Knoten mit dem Internet, muss es an diese Schnittstelle auf der Linux - OS-Level - Konfiguration überbrückt werden.

Verlassen Sie den Knoten:

root@onhub:# exit

Bestimmen Sie die Schnittstelle für Ihre Internetverbindung mit dem route - Befehl:

$ 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

Finden Sie die default Dies ist die Internetverbindung für Ihren Linux-Rechner. Die Iface Spalte gibt an, welche Schnittstelle für die Konnektivität verwendet wird. In dem obigen Beispiel ist es em1 .

Verwenden Sie happy-internet die Brücke einzurichten, über die Schnittstelle für Ihre Standardroute. Für die --isp Flag, verwenden Sie den Namen der Schnittstelle ohne Zahlen Hinter. In diesem Beispiel ist es em . Wenn Ihre Standard - Schnittstelle ist eth1 , die --isp wäre Flagge eth .

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

Es wird in dem keine sichtbare Veränderung seines happy-state ausgegeben, aber der onhub Knoten sollte eine Internetverbindung verfügen. Gehen wir zurück in den Knoten und prüfen:

$ 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

Erfolg!

c4d411ab1734131.png

DNS

Happy Nodes verfügen nicht über integrierte DNS-Funktionen. Wenn Sie versuchen, google.com anzupingen, schlägt dies fehl:

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

Glücklicherweise bietet Happy DNS-Unterstützung. Beenden Sie den Knoten und suchen Sie die DNS-Server für Ihren Linux-Computer. Stellen Sie sicher, dass Sie die entsprechende Standardschnittstelle verwenden:

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

Verwenden Sie diese DNS - Adressen mit happy-dns :

$ happy-dns 172.16.255.1 172.16.255.153 172.16.255.53

Versuchen Sie nun google.com aus dem Pingen onhub Knoten:

$ 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

Verlassen Sie den onhub Knoten , wenn Sie fertig sind :

root@onhub:# exit

Tunnel flechten

Wie beim simulierten Dienst muss zwischen dem simulierten HAN in Happy und dem Dienst ein Weave-Tunnel eingerichtet werden. Verwenden Sie bei einem echten Cloud-Dienst die IP-Adresse oder URL des Dienstes in der Tunneleinrichtung. Zum Beispiel:

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

3ed2c3c0df67f4d2.png

9. Aufräumen

Es ist wichtig, Happy-Topologien immer zu bereinigen, wenn Sie damit fertig sind, um Probleme mit Ihrer Linux-Netzwerkkonfiguration zu vermeiden.

Wenn Sie DNS - Unterstützung in Ihrer Topologie aktiviert ist , entfernen Sie sie durch diesen Befehl mit dem rerunning -d (delete) Flag zuerst. Dies muss ausgeführt werden, bevor Happy-Knoten entfernt werden, um sicherzustellen, dass die Netzwerkkonfiguration ordnungsgemäß aktualisiert wird.

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

Löschen Sie als Nächstes den Status "Happy":

$ happy-state-delete

Gelegentlich können einige Statusdateien nach einer Statuslöschung verbleiben. Wenn Probleme und guten Rutsch ins laufen nicht wie erwartet funktioniert, löschen Sie den Zustand mit happy-state-delete und dann die folgenden Befehle verwenden alle verbleibenden sauber bis zu erzwingen:

$ ip netns | xargs -I {} sudo ip netns delete {}
$ rm -rf ~/.*state.json
$ rm -rf ~/.*state.json.lock

Ihr Gerät sollte wieder in seiner normalen Netzwerkkonfiguration sein.

10. Herzlichen Glückwunsch!

Sie wissen jetzt:

  • So verwenden Sie Happy, um Ihre eigenen IoT-Heimnetzwerke zu simulieren
  • So verbinden Sie Happy-Topologien mit dem Internet
  • Die Grundlagen von Weave über OpenWeave, Nests Open-Source-Version von Weave

Nächste Schritte

Versuchen Sie, aufbauend auf diesem Codelab, die folgenden Übungen:

  • Erstellen Sie eine größere Topologie mit mehreren Knoten in jedem Thread und Wi-Fi-Netzwerk und stellen Sie die Konnektivität zwischen allen Knoten her
  • Erstellen Sie einen Bash - Skript , um die Topologie über laden happy-state-load oder weave-state-load
  • Sehen Sie sich andere Glückliche Befehle, wie happy-traceroute und happy-process-*

Weiterlesen

Prüfen openweave.io für eine Vielzahl von Referenzen, einschließlich:

f6996428fb06dede.png