OTNS를 사용한 스레드 네트워크 시뮬레이션

1. 소개

5abd22afa2f2ee9a.png

스레드란? OTNS

스레드는 기기 간 및 기기 간 안전한 통신을 가능하게 하는 IP 기반의 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 토폴로지 변화에 적응하여 단일 장애점을 방지할 수 있습니다.

Google에서 출시한 OpenThread는 스레드의 오픈소스 구현입니다. OpenThread는 코드 크기와 메모리 공간이 작지만 스레드 사양에 정의된 모든 기능을 지원합니다.

OpenThread 네트워크 시뮬레이터 (OTNS)를 사용하면 posix 플랫폼에서 시뮬레이션된 OpenThread 노드를 실행하여 스레드 네트워크를 시뮬레이션할 수 있습니다. OTNS는 시뮬레이션된 스레드 네트워크를 시각화하고 운영할 수 있도록 사용하기 쉬운 웹 인터페이스 (OTNS-Web)를 제공합니다.

학습할 내용

  • OTNS 및 종속 항목 설치
  • OTNS용 OpenThread 빌드
  • OTNS-Web에서 노드를 추가/이동/삭제하는 방법
  • OTNS-Web의 기타 유용한 기능을 사용하여 네트워크 시뮬레이션 운영
  • OpenThread의 단일 장애점 확인

이 Codelab에서는 OTNS-CLI 및 OTNS-Web에 중점을 둡니다. Python 스크립팅과 같은 OTNS의 다른 기능은 다루지 않습니다.

필요한 항목

  • Linux x86_64 또는 Mac OS
  • Git
  • Go 1.13 이상.
  • 웹브라우저 OTNS-Web은 시뮬레이션을 표시하기 위해 웹브라우저를 사용합니다.
  • Thread Primer. 이 Codelab에서 배운 내용을 이해하려면 스레드의 기본 개념을 알아야 합니다.

2. 설치

Go 설치

OTNS를 빌드하려면 Go 1.13 이상이 필요합니다.

  1. https://golang.org/dl/에서 Go를 설치합니다.
  2. $(go env GOPATH)/bin (일반적으로 $HOME/go/bin)를 $PATH에 추가합니다.
$ export PATH=$PATH:$(go env GOPATH)/bin

OTNS 코드 가져오기

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

종속 항목 설치

$ ./script/install-deps
grpcwebproxy installed: /usr/local/google/home/simonlin/go/bin/grpcwebproxy

sudo의 비밀번호를 입력하라는 메시지가 표시될 수 있습니다.

OOT 설치

otns$GOPATH/bin에 설치합니다.

$ ./script/install
otns installed: /usr/local/google/home/simonlin/go/bin/otns

otns이(가) 제대로 설치되었는지 확인

  1. which otns를 실행하여 otns 실행 파일을 $PATH.에서 검색할 수 있는지 확인합니다.
  2. otns 명령어를 찾을 수 없는 경우 $(go env GOPATH)/bin$PATH.에 추가했는지 확인합니다.

3. OTNS용 OpenThread 빌드

GitHub에서 OpenThread 코드 가져오기

$ mkdir -p ~/src
$ git clone https://github.com/openthread/openthread ~/src/openthread

OTNS=1로 OpenThread 빌드

$ cd ~/src/openthread
$ ./script/cmake-build simulation -DOT_OTNS=ON -DOT_SIMULATION_VIRTUAL_TIME=ON -DOT_SIMULATION_VIRTUAL_TIME_UART=ON -DOT_SIMULATION_MAX_NETWORK_SIZE=999

OpenThread 실행 파일은 build 디렉터리에서 찾을 수 있습니다.

$ ls ~/src/openthread/build/simulation/examples/apps/cli/
ot-cli-ftd        ot-cli-mtd        ot-cli-radio

이제 OTNS를 실행할 차례입니다.

4. OTNS 실행

otns을 실행합니다.

$ cd ~/src/openthread/build/simulation/examples/apps/cli
$ otns
> ← OTNS-CLI prompt

성공적으로 시작되면 OTNS가 CLI 콘솔 (OTNS-CLI)로 전환되고 네트워크 시각화 및 관리를 위해 웹브라우저 (OTNS-Web)를 실행합니다.

a0e05178d66929b1.png

OTNS-Web에서 빈 페이지만 표시된다면 브라우저에서 WebGL이 사용 설정되지 않았을 수 있습니다. WebGL을 사용 설정하는 방법은https://superuser.com/a/836833 을 참고하세요.

다음 섹션에서는 OTNS-CLIOTNS-Web를 통해 OTNS 시뮬레이션을 관리하는 방법을 알아봅니다.

5. OTNS-CLI 알아보기 및 OTNS-웹

OTNS-CLI

OTNS-CLI는 OTNS 시뮬레이션을 관리하기 위한 명령줄 인터페이스 (CLI)를 제공합니다.

$ cd ~/src/openthread/build/simulation/examples/apps/cli
$ otns
> ← OTNS-CLI prompt

OTNS-CLI를 통해 명령어를 입력할 수 있습니다. 전체 명령어 목록은 OTNS CLI 참조를 확인하세요. 이 Codelab에서는 이러한 명령어 중 일부만 사용할 것이므로 걱정하지 마세요.

OTNS-웹

OTNS-Web는 OTNS의 네트워크 시각화 및 관리 도구입니다. 시뮬레이션된 스레드 네트워크의 노드, 메시지, 링크를 시각적으로 표현합니다. OTNS-Web의 다양한 요소를 확인합니다.

4c5b43509a2ca0d0.png

6. 노드 추가

OTNS-CLI를 통해 노드 추가

위치 (300, 100)에 라우터 추가

> add router x 300 y 100
1
Done

OTNS-Web에 생성된 노드가 표시됩니다. 노드는 라우터로 시작해서 몇 초 후에 리더가 됩니다.

6ca8c2e63ed9818d.png

OTNS-CLI을(를) 통해 노드 추가

> add fed x 200 y 100
2
Done
> add med x 400 y 100
3
Done
> add sed x 300 y 200
4
Done

노드가 하나의 파티션으로 병합될 때까지 몇 초 정도 기다립니다. OTNS-WEB에 노드가 표시됩니다.

3ee67903c01aa612.png

OTNS-Web까지 노드 추가

OTNS-Web를 통해 노드를 추가할 수도 있습니다. Action BarNew Router 버튼을 클릭합니다. New Router 버튼 바로 위에 노드가 생성되는 것을 확인할 수 있습니다. 노드를 OTNS-CLI를 통해 만든 리더 근처로 드래그합니다. 모든 노드가 결국 하나의 파티션으로 병합되어야 합니다.

420258bb92561146.png

또한 작업 모음에서 FED, MED, SED 버튼을 클릭하여 다른 유형의 노드를 생성합니다. 기존 노드 근처의 위치로 드래그하여 해당 스레드 네트워크에 연결합니다.

fe15d6f9726a099e.png

이제 많은 노드가 포함된 파티션 하나의 스레드 네트워크를 만들었습니다. 다음 섹션에서는 시뮬레이션 속도를 높이기 위해 시뮬레이션 속도를 조정합니다.

7. 속도 조정

현재 시뮬레이션은 1X 속도로 실행되어야 합니다. 즉, 지금까지 경과된 시뮬레이션 시간은 첫 번째 노드를 만든 후의 실제 시간과 동일합니다.

OTNS-CLI에서 속도 조정

OTNS-CLI를 통해 시뮬레이션 속도를 조정할 수 있습니다.

시뮬레이션 속도를 100X(으)로 설정

> speed 100
Done

노드가 이전보다 훨씬 더 자주 메시지를 보내는 것을 확인할 수 있습니다.

시뮬레이션 속도를 MAX(으)로 설정

> speed max
Done

OTNS는 최대한 빨리 시뮬레이션하는 것을 목표로 하고 있으므로 많은 수의 메시지를 보내는 노드를 볼 수 있습니다.

시뮬레이션 일시중지

> speed 0
Done

시뮬레이션 속도를 0로 설정하면 시뮬레이션이 일시중지됩니다.

일반 속도로 시뮬레이션 복원

> speed 1
Done

시뮬레이션 속도를 0보다 큰 값으로 설정하면 시뮬레이션이 재개됩니다.

OTNS-Web에서 속도 조정

속도 제어 버튼

Action Bar에서 속도 제어 버튼(9329157c1bd12672.png)을 찾으세요. 버튼은 현재 시뮬레이션 속도를 표시하며 시뮬레이션 속도를 조정하고 시뮬레이션을 일시중지/재개하는 데 사용할 수 있습니다.

시뮬레이션 속도 향상

속도가 MAX: f5f460b2586d299b.png에 도달할 때까지 39b88331779277ad.png 버튼을 클릭하여 시뮬레이션 속도를 높일 수 있습니다.

속도 저하 시뮬레이션

31cca8d5b52fa900.png 버튼을 클릭하여 시뮬레이션 속도를 늦출 수 있습니다.

시뮬레이션 일시중지

실행 중인 시뮬레이션을 일시중지하려면 46cc2088c9aa7ab6.png 버튼을 클릭하세요. 버튼이 ce25eda3496ffcd4.png 아이콘으로 변경됩니다.

시뮬레이션 재개

일시중지된 시뮬레이션을 재개하려면 ce25eda3496ffcd4.png 버튼을 클릭합니다. 버튼이 46cc2088c9aa7ab6.png 상태로 다시 변경됩니다.

시뮬레이션 속도를 10X(으)로 설정

시간을 절약하려면

OTNS-CLI : 시뮬레이션 속도를

10X 따라서 네트워크의 토폴로지 변경사항을 훨씬 더 빠르게 관찰할 수 있습니다.

> speed 10
Done

8. 라디오 켜기/끄기

이제 시뮬레이션은 2개의 라우터 (육각형)와 많은 하위 요소를 포함하며 10배속으로 실행됩니다.

2개의 라우터의 현재 리더 (빨간색 테두리)를 찾아 한 번 클릭하여 선택합니다.

8c6a2e191cdae0c7.png

무선 끄기

리더 노드의 라디오를 끄려면 작업 모음에서 7ca085f470491dd4.png 버튼을 클릭합니다.

a3bf58d9d125f95f.png

리더는 무선 기능이 사용 중지되어 있으면 메시지를 주고받을 수 없습니다.

다른 라우터가 새로운 리더가 될 때까지 약 12초 (시뮬레이션 시간에는 120초) 동안 기다립니다.

e3d32f85c4a1b990.png

스레드 네트워크는 새 리더로 새 파티션을 형성하여 리더 실패에서 자동으로 복구됩니다. 새 파티션에는 새로운 파티션 색상도 있습니다.

무선 켜기

라디오가 사용 중지된 리더를 선택합니다. Action Bar에서 2d9cecb8612b42aa.png 버튼을 클릭하여 무선 연결을 복원합니다.

7370a7841861aa3a.png

리더는 무선 연결이 복원된 후 네트워크에 다시 연결해야 합니다.

9. 노드 이동

OTNS를 사용하면 사용자가 OTNS-CLI 또는 OTNS-Web를 통해 쉽게 노드를 이동할 수 있습니다.

OTNS-CLI 간 노드 이동

노드 5를 새 위치로 이동합니다.

> move 5 600 300
Done

이제 노드 5는 다른 라우터에서 멀리 떨어져 있으므로 서로의 연결이 끊어지며 약 12초 (시뮬레이션 시간 동안 120초) 후에 둘 다 자체 파티션의 리더가 됩니다.

c06b4d0a4f183299.png

OTNS-Web을 통해 노드 이동

드래그하여 노드 5를 원래 위치로 다시 이동합니다. 두 파티션이 하나의 파티션으로 다시 병합되어야 합니다.

9ba305c4c5a5f892.png

10. 노드 삭제

OTNS-CLI를 통해 노드 삭제

노드 8을 삭제합니다.

> del 8
Done

노드 8이 시뮬레이션에서 사라집니다.

18156770d9f8bf83.png

OTNS-Web를 통해 노드 삭제

노드 5를 선택하고 Action Bar에서 7ff6afd565f4eafc.png 버튼을 클릭하여 노드 5를 삭제합니다.

d4079cceea0105f0.png

Node 1가 리더가 되고 Node 7는 어떠한 라우터에도 도달할 수 없으므로 분리되어야 합니다.

시뮬레이션 지우기 (모든 노드 삭제)

OTNS-Web를 통해 모든 노드를 삭제하여 시뮬레이션을 지울 수 있습니다.

Action Bar.에서 89618191721e79a0.png 버튼을 클릭하면 모든 노드가 한 번에 사라집니다.

계속하기 전에...

이 튜토리얼을 계속 진행할 수 있도록 직접 시뮬레이션에 노드를 추가합니다.

11. OTNS-CLI 노드 컨텍스트

OTNS-CLI는 개발자가 노드 상태를 진단하는 데 도움이 되도록 노드와 쉽게 상호작용할 수 있는 노드 컨텍스트 모드를 제공합니다.

노드 컨텍스트 모드 시작

노드 1의 노드 컨텍스트를 입력합니다.

> node 1
Done
node 1>

CLI 프롬프트가 현재 노드 컨텍스트를 나타내는 node 1>로 변경되었습니다. OpenThread CLI 명령어를 입력하면 마치 노드와 직접 상호작용하는 것처럼 노드에서 실행할 수 있습니다.

노드 컨텍스트에서 명령어 실행

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
OpenThread
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:d800
fdde:ad00:beef:0:2175:8a67:1000:6352
fe80:0:0:0:2075:82c2:e9e9:781d
Done

다른 노드 컨텍스트로 전환

node 1> node 2
Done
node 2> 

노드 컨텍스트 종료

node 1> exit
Done
>

12. 축하합니다

축하합니다. 첫 번째 OTNS 시뮬레이션을 성공적으로 실행했습니다.

지금까지 OTNS와 그 종속 항목을 설치하는 방법을 알아보았습니다. OTNS용 OpenThread를 빌드하고 OpenThread 시뮬레이션 인스턴스로 OTNS 시뮬레이션을 시작했습니다. OTNS-CLIOTNS-Web를 통해 다양한 방식으로 시뮬레이션을 조작하는 방법을 알아봤습니다.

지금까지 OTNS가 무엇인지, OTNS를 사용해 OpenThread 네트워크를 시뮬레이션하는 방법을 알아보았습니다.

다음 단계

다음 Codelab을 확인하세요.

참조 문서