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

1. 소개

5abd22afa2f2ee9a.png

스레드 및 OTNS란 무엇인가요?

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

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

OpenNS 네트워크 시뮬레이터 (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의 비밀번호를 입력하라는 메시지가 표시될 수 있습니다.

OTT 설치하기

$GOPATH/binotns를 설치합니다.

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

otns가 제대로 설치되었는지 확인해 보겠습니다.

  1. which otns를 실행하여 $PATH.에서 otns 실행 파일을 검색할 수 있는지 확인합니다.
  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을 확인하세요.

참조 문서