Happy and Weave 시작하기

1. 소개

행복 시뮬레이션 네트워크 토폴로지의 경량 오케스트레이션 둥지 실험실에 의해 생성 된 도구입니다. Happy는 IoT 홈 영역 네트워크의 개발 및 테스트에 유용합니다.

Happy로 다음을 수행할 수 있습니다.

  • IoT 장치 하드웨어를 사용하지 않고 단일 Linux 개발 머신에서 네트워크 프로토콜 및 기타 분산 실행 프로그램 테스트
  • 네트워크에서 자동화된 기능 테스트 수행
  • 동일한 시스템에서 여러 개의 동시 병렬 네트워크를 실행하여 테스트 처리량 향상

이 코드 랩에서는 해피뿐만 아니라의 기초를 시작하는 방법을 학습합니다 위브 의 IoT 디바이스를위한. 당신이 사용할 것이다 직조 구현은 OpenWeave , 둥지가 발표 한 오픈 소스 버전.

f6996428fb06dede.png

배울 내용

  • Happy와 OpenWeve를 구축하는 방법
  • 시뮬레이션된 IoT 네트워크를 수동으로 만드는 방법
  • 사용자 정의 토폴로지를 관리하는 방법
  • 시뮬레이션된 Happy 네트워크를 인터넷에 연결하는 방법
  • 위브의 기본

필요한 것

  • Linux 머신(물리적 또는 가상)
  • Git 클라이언트 또는 CLI
  • 파이썬 2.7
  • 네트워킹 및 라우팅 개념에 대한 기본 이해

2. 시작하기

도구 체인 및 종속성 설치

Happy and Weave를 빌드하려면 지원되는 도구 모음과 모든 종속 항목이 설치되어 있는지 확인하세요.

$ sudo apt-get update
$ sudo apt-get install -y autotools-dev build-essential git lcov \
                           libdbus-1-dev libglib2.0-dev libssl-dev \
                           libudev-dev make python2.7 software-properties-common \
                           python-setuptools bridge-utils python-lockfile \
                           python-psutil
$ sudo apt-get install -y --force-yes gcc-arm-none-eabi
$ sudo apt-get update -qq

소스 코드 가져오기

명령줄에서 Happy 및 OpenWeave Git 리포지토리를 복제합니다.

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

해피 설치

Happy 루트 디렉터리에서 Happy를 설치합니다.

$ cd ~/happy
$ make

행복한 설치 확인

이제 명령줄에서 Happy 명령에 액세스할 수 있습니다.

$ happy-state
State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes

NODES      Name    Interface    Type                                          IPs

오픈위브 설치

OpenWeave 루트 디렉터리에서 OpenWeave를 설치합니다.

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

OpenWeave로 Happy 구성

OpenWeave를 Happy와 함께 사용하려면 Happy에 Weave 설치 위치를 알려야 합니다. 경로와 해피 구성 업데이트 /src/test-apps 하여 OpenWeave 빌드 내를 :

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

구성 확인:

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

OpenWeave 설치 확인

이 Codelab에 필요한 Weave 명령은 명령줄에서 액세스할 수 있습니다.

$ weave-fabric-add -h

    weave-fabric-add creates a weave fabric.

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

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

    return:
        0    success
        1    fail

당신이 오류가 나타나면 weave-fabric-add: command not found , 당신의 업데이트 PATH 해피 바이너리에 사용되는 경로 환경 변수를 :

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

3. 첫 번째 토폴로지

Happy로 다음 3노드 토폴로지를 생성해 봅시다.

a3295ee87fbd9764.png

이 토폴로지는 간단한 HAN(홈 영역 네트워크)의 예입니다. 이 HAN에서는 두 개의 노드가 스레드 네트워크에서 함께 연결되고 그 중 하나는 Wi-Fi를 통해 세 번째 노드에 연결됩니다. 이 노드는 가정의 무선 라우터에 연결하여 전체 HAN에 인터넷 연결을 제공할 수도 있습니다. 이에 대한 자세한 내용은 나중에 설명합니다.

먼저 세 개의 노드를 만듭니다.

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

그들이 존재하는지 확인합시다:

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

이제 몇 가지 네트워크를 생성해 보겠습니다.

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

네트워크가 존재하는지 확인하십시오.

$ happy-network-list
ThreadNetwork
WiFiNetwork

행복 상태 확인:

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP
    WiFiNetwork         wifi      UP

NODES      Name    Interface    Type                                          IPs
   01ThreadNode
 02BorderRouter
     03WiFiNode

네트워크를 가동하는 것만으로는 충분하지 않습니다. 네트워크에 노드를 추가해야 합니다. 토폴로지 다이어그램에 따라 적절한 네트워크에 각 노드를 추가합니다.

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

참고 02BorderRouter 모두 추가되었습니다 ThreadNetworkWiFiNetwork . 이는 HAN 내의 경계 라우터로서 이 노드가 두 개의 개별 네트워크를 함께 연결하기 때문입니다.

행복한 상태를 확인하십시오. 각 노드의 인터페이스가 작동 중입니다.

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
  ThreadNetwork       thread      UP
    WiFiNetwork         wifi      UP

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

이제 토폴로지는 다음과 같습니다.

2d054e6c4e54089c.png

Happy 네트워크를 시작하는 마지막 단계는 각 노드의 각 인터페이스에 IP 주소를 할당하는 것입니다. 네트워크에 대한 IP 접두사를 지정하면 Happy가 자동으로 IP 주소를 할당합니다.

스레드 프로토콜은 IPv6을 사용하므로 스레드 네트워크에 IPv6 접두사를 추가합니다.

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

행복한 상태를 확인하십시오. 각 스레드 노드의 스레드 인터페이스에는 IP 주소가 있습니다.

$ happy-state

State Name:  happy

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

    WiFiNetwork         wifi      UP

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

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

                       wlan0    wifi
     03WiFiNode        wlan0    wifi

WiFi 네트워크의 경우 IPv4 및 IPv6 접두사를 모두 추가합니다.

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

Happy 상태를 다시 한 번 확인합니다. 모든 인터페이스에는 각 Wi-Fi 인터페이스에 대해 2개의 IP 주소가 할당되어 있습니다.

$ 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. 연결 테스트

이제 우리의 해피 네트워크가 실행되고 있는지, 이제부터 다른 노드 핑하여 연결을 테스트 할 수 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 주소를 ping합니다. 스레드는 IPv6만 사용하기 때문에 IPv4 주소는 무시할 수 있습니다.

하나의 IPv6 ping이 성공했는지 참고 :에있는 한 02BorderRouterwpan0 유일한 주소입니다 인터페이스, 01ThreadNode 직접 도달 할 수는 :

5447bcbdf7d539df.png

전달 사이에 활성화되지 않았기 때문에 다른 IPv6 주소는 실패 wpan0wlan002BorderRouter . 따라서, 01ThreadNode 아무 생각이 없습니다 03WiFiNode 존재, 또는 어떻게 도달 할 수 있습니다. Happy는 시뮬레이션된 네트워크를 가져왔지만 노드 간의 모든 라우팅 및 전달을 활성화하지 않았습니다.

경로 추가

HAN을 통해 IPv6 트래픽을 라우팅하려면 양방향으로 각 네트워크의 각 노드에 적절한 경로를 추가하십시오(핑이 소스 노드로 돌아가는 방법을 알 수 있도록).

각 노드에 대해 다음을 알아야 합니다.

  • 가장 가까운 네트워크 게이트웨이이 경우, 02BorderRouter
  • 대상 네트워크 - 게이트웨이 다음에 갈 곳

3노드 네트워크의 경우 다음을 제공합니다.

소스 네트워크에서

대상 네트워크로

게이트웨이를 통해

ThreadNetwork

WiFiNetwork

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

WiFiNetwork

ThreadNetwork

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

이는 각 노드에 대해 개별적으로 수행 할 수 있습니다 happy-node-route 하지만, 각 네트워크의 모든 노드에 대해 그것을 할 쉽게 happy-network-route .

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

명령 줄 플래그에 대한 설명은 사용 happy-network-route -h .

happy-network-route 필요에 따라 명령은 각 노드에 대한 IPv4 및 IPv6 포워딩 켜집니다. 이를 통해 트래픽이 노드 내에서 한 인터페이스에서 다른 인터페이스로 라우팅될 수 있습니다.

이제 ping을 다시 시도하십시오.

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

두 IPv6 핑 모두 작동합니다! 에 전달과 함께, 그것은 도달하는 방법을 알고 wlan0 인터페이스를. IPv6 경로 및 전달만 구성했기 때문에(Thread가 IPv4를 통해 실행되지 않기 때문에) IPv4 ping은 여전히 ​​실패합니다.

양쪽에 네트워크 경로를 추가했으므로 네트워크 간에 ping을 실행해 보겠습니다.

$ happy-ping 01ThreadNode 03WiFiNode
[Ping] ping from 01ThreadNode to 03WiFiNode on address
    2001:0db8:000a:000b:9aae:2bff:fe71:62fa -> 0% packet loss
[Ping] ping from 01ThreadNode to 03WiFiNode on address
    10.0.1.3 -> 100% packet loss

IPv6 ping이 예상대로 작동합니다. 이제 완전한 기능을 갖춘 시뮬레이션된 IPv6 HAN이 있습니다.

5bb53be0280b3320.png

모든 것을 함께 연결하는 보다 안전하고 안정적인 방법을 사용하려면 HAN 위에 Weave를 추가해 보겠습니다.

5. 직조 추가

Weave는 Nest 제품에 안전하고 안정적인 통신 백본을 제공하는 네트워크 애플리케이션 계층입니다. Weave의 오픈 소스 버전인 OpenWeave를 사용하여 Weave 기능을 추가할 수 있습니다.

Weave의 구현을 "패브릭"이라고 합니다. Weave 패브릭은 모든 HAN 노드, Nest 서비스 및 HAN에 참여하는 모든 모바일 장치로 구성된 네트워크입니다. HAN 위에 위치하며 다양한 기본 네트워크 링크 기술(예: 스레드 또는 Wi-Fi)에서 더 쉽게 라우팅할 수 있습니다.

사용하여 HAN의 직물 원단을 만들기 fab1 다음 위브 모든 노드를 구성, 패브릭 ID로 :

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

이제 Weave가 구성되었으므로 Happy 상태를 확인합니다.

$ happy-state

State Name:  happy

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

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


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

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

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

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

각 노드는 직조 직물에 첨가되었고, 각 인터페이스로 시작하는 새로운 IPv6 주소를 가지고 fd00 . 직조 원단에 대한 자세한 정보를 얻으려면 사용 weave-state 명령을 :

$ weave-state

State Name: weave

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

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

다음은 Weave 값이 파란색으로 표시된 업데이트된 토폴로지입니다.

ce3fa9082408355b.png

직물을 짜다

Weave 및 Happy 상태에는 많은 새로운 정보가 있습니다. 에서 직물과하자의 시작 weave-state :

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

위브 사용의 IPv6 접두사 fd00::/48 각 노드에 대해. 이 블록의 주소를 고유 로컬 주소라고 하며 HAN과 같은 사설 네트워크 내에서 사용하도록 지정됩니다. 이를 Fabric ID와 결합하면 위에 표시된 Weave Global Prefix가 생성됩니다.

노드 위브

Weave 패브릭의 각 노드에는 페어링 코드와 함께 고유한 노드 ID가 할당됩니다.

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

노드 ID는 Weave 패브릭의 노드를 전역적으로 식별합니다. 페어링 코드는 페어링 프로세스 중에 "가입 자격 증명"으로 사용되며 일반적으로 제품의 QR 코드와 함께 인쇄됩니다.

예를 들어 Nest Protect 또는 Nest Cam의 QR 코드를 보면 종종 입력 키라고 하는 6자 문자열을 볼 수 있습니다. 위브 페어링 코드입니다.

e7c6fa3e24d61d1b.png

Weave는 전역 접두사, 패브릭 ID 및 노드 ID의 조합을 사용하여 패브릭의 각 노드 및 인터페이스에 대한 Weave 특정 IPv6 주소를 생성합니다.

주소를 짜다

해피 토폴로지의 네 개의 새로운 IPv6 주소가 있다는 것을 참고, 모든 우리의 직물 글로벌 접두어로 시작하는 fd00:0000:fab1::/48 .

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

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

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

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

Weave 프로토콜은 각 노드에 할당된 표준 IPv6 주소 대신 이러한 주소를 사용하여 Weave 패브릭을 통해 통신합니다.

네트워크 게이트웨이 위브

스레드 네트워크의 Weave 노드는 해당 네트워크를 종료할 위치를 알아야 합니다. 일반적으로 스레드 경계 라우터에 있는 Weave 네트워크 게이트웨이가 이 기능을 제공합니다.

샘플 토폴로지에서 BorderRouter 노드를 Weave 네트워크 게이트웨이로 지정하겠습니다.

$ weave-network-gateway ThreadNetwork 02BorderRouter

이 명령은 직물 원단 서브넷에 대한 모든 스레드 노드에서 경로를 추가합니다 ( fd:0:fab1::/48 )를 통해 BorderRouter 노드의 스레드 인터페이스 ( wpan0 스레드의 네트워크를 벗어난 위브 노드에 도달하는 각 스레드 노드 수 있습니다). 이것은 유사 happy-network-route 직조 원단 노선에 우리가 이전에 사용 명령하지만, 특정.

6. 토폴로지 유지 관리

Happy를 강력하게 만드는 것은 시뮬레이션된 토폴로지의 모든 설정과 분해를 쉽게 관리하는 방법입니다.

나중에 사용할 수 있도록 Happy 토폴로지를 저장합니다.

$ happy-state -s codelab.json

이 곳 루트에서 전체 토폴로지와 JSON 파일 ~/ 폴더에 있습니다. JSON 파일에서 확인할되어 현재 행복한 상태의 복사본입니다 ~/.happy_state.json .

저장되면 현재 토폴로지를 삭제합니다.

$ happy-state-delete

이 모든 네트워크 네임 스페이스와에있는 관련 구성 삭제 ~/.happy-state.json 파일을. 확인 happy-stateweave-state 빈 구성을 확인합니다 :

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes

NODES      Name    Interface    Type                                          IPs


$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code

FABRIC     Fabric Id           Global Prefix

저장된 구성을 다시 로드하려면 다음 두 명령 중 하나를 사용하십시오.

  • happy-state-load - 위브 플러그인을 지원하지 않습니다
  • weave-state-load - 지원 위브 플러그인

토폴로지는 직물을 포함 그렇다면, 항상 사용 weave-state-load 직조 원단 및 관련 구성이 적용되도록 명령을 사용합니다.

저장된 해피 토폴로지를 다시 로드합니다.

$ 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

셸 스크립트 및 JSON 형식 모두로 미리 정의된 여러 토폴로지가 Happy 저장소에 제공되었습니다. 그들을 찾기 ~/happy/topologies .

OpenWeaver에는 테스트 목적으로 미리 정의된 Happy 토폴로지도 함께 제공됩니다. 그들을 찾기 ~/openweave-core/src/test-apps/happy/topologies/standalone .

7. 작동 원리

Happy는 Linux 네트워크 네임스페이스를 사용하여 복잡한 토폴로지를 시뮬레이션합니다. 일반적으로 네트워크 구성은 전체 Linux OS에 적용됩니다. 네트워크 네임스페이스를 사용하면 각 네임스페이스에 고유한 인터페이스 및 라우팅 테이블 집합이 있도록 네트워크 구성을 분할할 수 있습니다.

Happy의 각 노드와 네트워크는 네트워크 네임스페이스이며, 이들 간의 링크는 네트워크 인터페이스입니다.

예를 들어 토폴로지를 사용하면 다음과 같습니다.

7d6654c2e4907f2a.png

이를 위해 Happy가 생성한 네임스페이스를 살펴보겠습니다.

$ ip netns list
happy004
happy003
happy002
happy001
happy000

당신이 선택하면 netns 행복한 상태 JSON 파일의 부분을, 당신은 무엇 노드 및 네트워크 각 네임 스페이스와 일치하는지에 볼 수 있습니다 :

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

49cfdce6ff9dd745.png

런타임 로그

노드에 실행되는 명령은 각 노드의 네임스페이스 내에서 실행되는 기본 터미널 명령입니다. 이를 확인하는 쉬운 방법은 Happy 런타임 로그를 활성화하는 것입니다.

두 번째 터미널 창을 열고 로그를 켜면 이 창에서 계속 실행됩니다.

$ happy-state -l

첫 번째 창으로 돌아가서 Happy ping을 실행합니다.

$ happy-ping 01ThreadNode 02BorderRouter

두 번째 터미널 창에서 가장 최근의 로그 항목을 확인합니다. 로그에 다음과 같은 줄이 표시되어야 합니다.

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

happy-ping 행복 실행보다 명령은 아무것도 더 ping6 의 명령 happy000 네임 스페이스 ( 01ThreadNode ).

노드 입력

사용 happy-shell 노드 (네트워크 네임 스페이스) 중 하나에 로그인 한 것처럼 비 해피 명령을 실행 :

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

시뮬레이션된 장치는 각 네임스페이스 내에서 실행되며 Happy를 통해 지정된 네트워크 구성에만 액세스할 수 있습니다.

노드의 인터페이스 구성을 확인하십시오. 이는 OS 전체 구성과 다르며 행복 상태에 나열된 항목을 반영해야 합니다.

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 over Weave)에 연결하는 데 유용합니다.

Weave의 서비스는 HAN 노드를 데이터 모델로 연결하고 원격 액세스를 제공하며 지능형 컨트롤러를 구현하여 포괄적인 생태계를 만드는 클라우드 기반 인프라입니다.

서비스는 Happy로 두 가지 기본 방식으로 표현될 수 있습니다.

  • 자체 네트워크 네임스페이스에서 시뮬레이션된 서비스로(해피노드)
  • 인터넷에서 실제 클라우드 서비스로

사전 정의 된 토폴로지에서 제공 한 ~/happy/topologies 각 서비스 시나리오의 예로서.

해피 노드에서 시뮬레이션된 서비스

기존 해피 토폴로지를 제거하십시오.

$ happy-state-delete

와 빈 상태 확인 happy-stateweave-state 명령을.

액세스 포인트(AP) 및 서비스 노드가 있는 사전 정의된 토폴로지를 로드합니다.

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

6d04cbfcc84038e2.png

토폴로지를 확인하려면 Happy 및 Weave 상태를 확인하십시오. 이 토폴로지에서 onhub 동안 AP입니다 cloud 모의 서비스입니다. 둘 모두에 연결되어있는 참고 Internet 유형의 네트워크 wan :

$ happy-state

State Name:  happy

NETWORKS   Name         Type   State                                     Prefixes
     HomeThread       thread      UP                       2001:0db8:0111:0001/64

       HomeWiFi         wifi      UP                       2001:0db8:0222:0002/64
                                                                        10.0.1/24

       Internet          wan      UP                               192.168.100/24


NODES      Name    Interface    Type                                          IPs
   BorderRouter        wpan0  thread   2001:0db8:0111:0001:f624:13ff:fe4a:6def/64
                                       fd00:0000:fab1:0006:1ab4:3000:0000:0005/64

                       wlan0    wifi                                  10.0.1.2/24
                                       fd00:0000:fab1:0001:1ab4:3000:0000:0005/64
                                       2001:0db8:0222:0002:9e31:97ff:fe73:29f0/64

     ThreadNode        wpan0  thread   2001:0db8:0111:0001:c237:fbff:fecc:b082/64
                                       fd00:0000:fab1:0006:1ab4:3000:0000:0009/64

          cloud         eth0     wan                             192.168.100.3/24

          onhub        wlan0    wifi                                  10.0.1.3/24
                                       2001:0db8:0222:0002:3266:20ff:fe98:6ee2/64

                        eth0     wan                             192.168.100.2/24


$ weave-state

State Name: weave

NODES           Name       Weave Node Id    Pairing Code
        BorderRouter    18B4300000000005          AAA123
          ThreadNode    18B4300000000009          AAA123

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

직조 터널

Weave 터널은 Weave 패브릭을 서비스에 연결합니다. HAN과 서비스 간에 IPv6 UDP 메시지를 전송하는 보안 경로입니다. 이러한 토폴로지에서, BorderRouter 노드는 직조 네트워크 게이트웨이는 HAN의 터널 엔드 포인트로서 기능한다.

Weave 터널 만들기:

$ weave-tunnel-start BorderRouter cloud

행복 상태를 다시 확인하십시오. 당신은에 직물 IPv6 주소로 새 터널 인터페이스가 나타납니다 cloud 노드를 :

NODES      Name    Interface    Type                                          IPs

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

                        eth0     wan                             192.168.100.3/24

c5ffca09d7cd3208.png

이제 Weave 패브릭의 노드와 서비스의 Weave 전역 접두사 간에 성공적으로 ping할 수 있습니다.

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

인터넷에서 실제 클라우드 서비스

기존 해피 토폴로지를 제거하십시오.

$ happy-state-delete

와 빈 상태 확인 happy-stateweave-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 노드는 네트워크 네임스페이스이므로 기본적으로 공용 인터넷에서 분할됩니다. 해피 노드를 입력하고 공용 인터넷 주소를 ping하여 이를 테스트하십시오. 우리는 사용합니다 8.8.8.8 , google.com의 IPv4 주소 중 하나를.

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

연결 대상 onhub 인터넷에 노드를, 그것은 리눅스 OS 수준의 구성에 해당 인터페이스에 다리를해야합니다.

노드를 종료합니다.

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에 ping을 시도하면 실패합니다.

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

다행히 Happy는 DNS를 지원합니다. 노드를 종료하고 Linux 시스템의 DNS 서버를 찾으십시오. 적절한 기본 인터페이스를 사용해야 합니다.

root@onhub:# exit
$ nmcli dev list iface em1 | grep domain_name_servers
DHCP4.OPTION[13]:                       domain_name_servers = 172.16.255.1 172.16.255.153 172.16.255.53

이러한 DNS 주소를 사용하여 happy-dns :

$ happy-dns 172.16.255.1 172.16.255.153 172.16.255.53

이제 내에서 google.com ping을 시도 onhub 노드 :

$ happy-shell onhub
root@onhub:# ping -c2 google.com
PING google.com (64.233.191.113) 56(84) bytes of data.
64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=1 ttl=46 time=36.9 ms
64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=2 ttl=46 time=37.0 ms

--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 36.978/36.995/37.013/0.193 ms

종료 onhub 이 완료되면 노드를 :

root@onhub:# exit

직조 터널

시뮬레이션된 서비스와 마찬가지로 Happy의 시뮬레이션된 HAN과 서비스 사이에 Weave 터널을 설정해야 합니다. 실제 클라우드 서비스의 경우 터널 설정에서 서비스의 IP 주소 또는 URL을 사용합니다. 예를 들어:

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

3ed2c3c0df67f4d2.png

9. 청소

Linux 네트워크 구성 문제를 방지하기 위해 작업이 끝나면 항상 Happy 토폴로지를 정리하는 것이 중요합니다.

당신이 당신의 토폴로지에서 DNS 지원을 활성화하는 경우에 그 명령을 다시 실행하여 제거 -d 첫 번째 (삭제) 플래그. 네트워크 구성이 올바르게 업데이트되도록 하려면 Happy 노드가 제거되기 전에 실행해야 합니다.

$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53

다음으로 행복 상태를 삭제합니다.

$ happy-state-delete

경우에 따라 일부 상태 파일은 상태 삭제 후에도 남아 있을 수 있습니다. 당신이 문제에 실행 해피가 예상대로 작동하지 않는 경우에 상태를 삭제 happy-state-delete 나머지 정리를 강제로 다음 명령을 사용하여 다음과 :

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

컴퓨터가 정상적인 네트워크 구성으로 돌아가야 합니다.

10. 축하합니다!

이제 알 수 있습니다.

  • Happy를 사용하여 자신의 IoT 홈 영역 네트워크를 시뮬레이션하는 방법
  • 해피 토폴로지를 인터넷에 연결하는 방법
  • Nest의 Weave 오픈 소스 버전인 OpenWeave를 통한 Weave의 기본 사항

다음 단계

이 Codelab을 기반으로 다음 연습을 시도해 보세요.

  • 각 스레드 및 Wi-Fi 네트워크에 여러 노드가 있는 더 큰 토폴로지를 만들고 모든 노드 간에 연결 설정
  • 를 통해 토폴로지를로드하는 bash는 스크립트를 작성 happy-state-load 또는 weave-state-load
  • 같은 다른 해피 명령, 탐색 happy-traceroutehappy-process-*

추가 읽기

확인 openweave.io 참조를 포함하는 다양한 :

f6996428fb06dede.png