Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기
이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

OpenThread로 스레드 네트워크 시뮬레이션

26b7f4f6b3ea0700.png

Google에서 출시 한 OpenThread스레드 네트워킹 프로토콜의 오픈 소스 구현입니다. Google Nest는 OpenThread를 출시하여 Nest 제품에 사용 된 기술을 개발자가 커넥 티드 홈용 제품 개발을 가속화하기 위해 광범위하게 사용할 수 있도록했습니다.

스레드 사양 은 가정용 애플리케이션을위한 IPv6 기반의 안정적이고 안전한 저전력 무선 장치 간 통신 프로토콜을 정의합니다. OpenThread는 IPv6, 6LoWPAN, MAC 보안이있는 IEEE 802.15.4, 메시 링크 설정 및 메시 라우팅을 포함한 모든 스레드 네트워킹 계층을 구현합니다.

이 Codelab은 시뮬레이션 된 기기에서 스레드 네트워크를 시뮬레이션하는 과정을 안내합니다.

배울 것

  • OpenThread 빌드 도구 모음을 설정하는 방법
  • 스레드 네트워크를 시뮬레이션하는 방법
  • 스레드 노드를 인증하는 방법
  • OpenThread Daemon으로 스레드 네트워크를 관리하는 방법

필요한 것

  • 자식
  • Linux, 네트워크 라우팅에 대한 기본 지식

힘내

이 Codelab을 완료하려면 Git이 필요합니다. 계속하기 전에 다운로드하여 설치하십시오.

Git 다운로드

설치되면 특정 OS에 대한 지침에 따라 OpenThread를 다운로드하고 빌드합니다.

Mac OS X 용 XCode

Mac OS X 에서 OpenThread를 설치하고 빌드하려면 XCode가 필요합니다.

XCode 다운로드

XCode가 설치된 후 XCode 명령 줄 도구를 설치합니다.

$ xcode-select --install

Linux / Mac OS X에서 빌드

이 설치 지침은 Ubuntu Server 14.04 LTS 및 Mac OS X Sierra 10.12.6에서 테스트되었습니다.

OpenThread를 설치합니다. bootstrap 명령은 도구 체인이 설치되고 환경이 올바르게 구성되었는지 확인합니다.

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap
$ ./bootstrap

Windows 사용

Windows를 선호하는 경우이 Codelab의 Docker 버전을 사용해 보는 것이 좋습니다.

Docker의 OpenThread 시뮬레이션

설치가 완료되면 예제 OpenThread 애플리케이션을 빌드하십시오. 이 Codelab에서는 시뮬레이션 예제를 사용합니다.

$ cd ~/src/openthread
$ make -f examples/Makefile-simulation

이제 OpenThread Daemon을 빌드합니다.

$ cd ~/src/openthread
$ make -f src/posix/Makefile-posix DAEMON=1

이 Codelab에 사용할 예제 애플리케이션은 기본 명령 줄 인터페이스 (CLI)를 통해 OpenThread 구성 및 관리 인터페이스를 노출하는 최소 OpenThread 애플리케이션을 보여줍니다.

이 연습에서는 시뮬레이션 된 다른 스레드 장치에서 하나의 시뮬레이션 된 스레드 장치를 ping하는 데 필요한 최소한의 단계를 안내합니다.

아래 그림은 기본 스레드 네트워크 토폴로지를 설명합니다. 이 연습에서는 녹색 원 안에있는 두 개의 노드 인 스레드 리더와 스레드 라우터 사이에 단일 연결이있는 노드를 시뮬레이션합니다.

6e3aa07675f902dc.png

노드 핑

1. 노드 1 시작

openthread 디렉토리로 이동하고 ot-cli-ftd 바이너리를 사용하여 시뮬레이션 된 스레드 장치에 대한 CLI 프로세스를 생성합니다.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

이 바이너리는 POSIX 위에서 시뮬레이션 된 OpenThread 장치를 구현합니다. IEEE 802.15.4 무선 드라이버는 UDP 위에 구현됩니다 (IEEE 802.15.4 프레임은 UDP 페이로드 내에서 전달됨).

인수 1 은 시뮬레이션 된 장치에 대해 "공장에서 할당 된"IEEE EUI-64의 최하위 비트를 나타내는 파일 설명자입니다. 이 값은 IEEE 802.15.4 무선 에뮬레이션을 위해 UDP 포트에 바인딩 할 때도 사용됩니다 (포트 = 9000 + 파일 설명자). 이 Codelab에서 시뮬레이션 된 스레드 기기의 각 인스턴스는 다른 파일 설명자를 사용합니다.

참고 : 시뮬레이션 된 기기에 대한 프로세스를 생성 할 때이 Codelab에 명시된대로 1 이상의 파일 설명 자만 사용하십시오. 0 의 파일 설명자는 다른 용도로 예약되어 있습니다.

보이지 않는 경우

>

이 명령을 실행 한 후 프롬프트를 누르고

enter

.

새 운영 데이터 세트를 생성하고이를 활성 데이터 세트로 커밋합니다. 운영 데이터 세트는 생성중인 스레드 네트워크에 대한 구성입니다.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 20
Channel Mask: 07fff800
Ext PAN ID: d6263b6d857647da
Mesh Local Prefix: fd61:2344:9a52:ede0/64
Master Key: e4344ca17d1dca2a33f064992f31f786
Network Name: OpenThread-c169
PAN ID: 0xc169
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

이 데이터 세트를 활성 데이터 세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작 :

> thread start
Done

몇 초 동안 기다렸다가 장치가 스레드 리더가되었는지 확인하십시오. 리더는 라우터 ID 할당을 관리하는 장치입니다.

> state
leader
Done

노드 1의 스레드 인터페이스에 할당 된 IPv6 주소를 확인합니다 (출력은 다를 수 있음).

> ipaddr
fd61:2344:9a52:ede0:0:ff:fe00:fc00
fd61:2344:9a52:ede0:0:ff:fe00:5000
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
fe80:0:0:0:94da:92ea:1353:4f3b
Done

특정 IPv6 주소 유형에 유의하십시오.

  • fd = mesh-local로 시작
  • fe80 = 링크 로컬로 시작

메시 로컬 주소 유형은 다음과 같이 더 분류됩니다.

  • ff:fe00 = 라우터 로케이터 (RLOC) 포함
  • ff:fe00 = 엔드 포인트 식별자 (EID)를 포함하지 않음

콘솔 출력에서 ​​EID를 식별하고 나중에 사용할 수 있도록 기록해 둡니다. 위의 샘플 출력에서 ​​EID는 다음과 같습니다.

fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6

2. 노드 2 시작

새 터미널을 열고 openthread 디렉토리로 이동하여 CLI 프로세스를 생성하십시오. 두 번째로 시뮬레이션 된 스레드 장치입니다.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

보이지 않는 경우

>

이 명령을 실행 한 후 프롬프트를 누르고

enter

.

노드 1의 운영 데이터 세트와 동일한 값을 사용하여 스레드 마스터 키 및 PAN ID를 구성합니다.

> dataset masterkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

이 데이터 세트를 활성 데이터 세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작 :

> thread start
Done

장치는 자식으로 초기화됩니다. Thread Child는 부모 장치로만 유니 캐스트 트래픽을 송수신하는 스레드 장치 인 최종 장치와 동일합니다.

> state
child
Done

2 분 이내에 child 에서 router 상태가 전환되는 것을 볼 수 있습니다. 스레드 라우터는 스레드 장치간에 트래픽을 라우팅 할 수 있습니다. 부모라고도합니다.

> state
router
Done

네트워크 확인

메시 네트워크를 확인하는 쉬운 방법은 라우터 테이블을 보는 것입니다.

1. 연결 확인

노드 2에서 RLOC16을 가져옵니다. RLOC16은 장치 RLOC IPv6 주소의 마지막 16 비트입니다.

> rloc16
5800
Done

노드 1에서 노드 2의 RLOC16에 대한 라우터 테이블을 확인합니다. 먼저 노드 2가 라우터 상태로 전환되었는지 확인하십시오.

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC  |
+----+--------+----------+----------+-------+---------+-----+------------------+
| 20 | 0x5000 |       63 |         0 |     0 |      0 |   0 | 96da92ea13534f3b |
| 22 | 0x5800 |       63 |         0 |     3 |      3 |  23 | 5a4eb647eb6bc66c |

노드 1의 RLOC 0xa800 이 표에서 발견되어 메시에 연결되었음을 확인합니다.

2. 노드 2에서 노드 1을 핑합니다.

시뮬레이션 된 두 스레드 장치 간의 연결을 확인합니다. 노드 2에서 노드 1에 할당 된 EID를 ping 합니다.

> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
> 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1
hlim=64 time=12ms

> CLI 프롬프트로 돌아가려면 enter 를 누릅니다.

네트워크 테스트

이제 두 개의 시뮬레이션 된 스레드 장치간에 성공적으로 핑할 수 있으므로 하나의 노드를 오프라인으로 전환하여 메시 네트워크를 테스트합니다.

노드 1로 돌아가 스레드를 중지합니다.

> thread stop
Done

노드 2로 전환하고 상태를 확인하십시오. 2 분 내에 노드 2는 리더 (노드 1)가 오프라인 상태임을 감지하고 노드 2가 네트워크 leader 로 전환되는 것을 확인해야합니다.

> state
router
Done
...
> state
leader
Done

확인되면 종료하기 전에 스레드를 중지하고 노드 2를 공장 초기화합니다. 이 실습에서 사용한 스레드 네트워크 자격 증명이 다음 실습으로 넘어 가지 않도록 공장 초기화가 수행됩니다.

> thread stop
Done
> factoryreset
>
> exit

또한 공장 초기화 및 종료 노드 1 :

> factoryreset
>
> exit

사용 가능한 모든 CLI 명령을 탐색하려면 OpenThread CLI 참조참조 하십시오.

이전 연습에서는 두 개의 시뮬레이션 된 장치와 확인 된 연결을 사용하여 스레드 네트워크를 설정했습니다. 그러나 이렇게하면 인증되지 않은 IPv6 링크 로컬 트래픽 만 장치간에 전달됩니다. 그들간에 (그리고 스레드 경계 라우터를 통해 인터넷으로) 글로벌 IPv6 트래픽을 라우팅하려면 노드가 인증되어야합니다.

인증하려면 하나의 장치가 커미셔너 역할을해야합니다. 커미셔너는 새 스레드 장치에 대해 현재 선출 된 인증 서버이며 장치가 네트워크에 연결하는 데 필요한 네트워크 자격 증명을 제공하기위한 권한 부 여자입니다.

이 연습에서는 이전과 동일한 2 노드 토폴로지를 사용합니다. 인증을 위해 스레드 리더는 커미셔너로, 스레드 라우터는 조이너로 작동합니다.

d6a67e8a0d0b5dcb.png

1. 네트워크 생성

이전 연습을 계속하는 경우 이미 두 개의 터미널 창이 열려 있어야합니다. 그렇지 않은 경우 두 개가 열려 있고 사용할 준비가되었는지 확인하십시오. 하나는 노드 1로, 다른 하나는 노드 2로 작동합니다.

노드 1에서 CLI 프로세스를 생성합니다.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

보이지 않는 경우

>

이 명령을 실행 한 후 프롬프트를 누르고

enter

.

새 운영 데이터 세트를 만들고 활성 데이터 세트로 커밋 한 다음 Thread를 시작합니다.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 12
Channel Mask: 07fff800
Ext PAN ID: e68d05794bf13052
Mesh Local Prefix: fd7d:ddf7:877b:8756/64
Master Key: a77fe1d03b0e8028a4e13213de38080e
Network Name: OpenThread-8f37
PAN ID: 0x8f37
PSKc: f9debbc1532487984b17f92cd55b21fc
Security Policy: 0, onrcb
Done

이 데이터 세트를 활성 데이터 세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작 :

> thread start
Done

몇 초 동안 기다렸다가 장치가 스레드 리더가되었는지 확인합니다.

> state
leader
Done

2. 커미셔너 역할 시작

노드 1에있는 동안 커미셔너 역할을 시작합니다.

> commissioner start
Done

J01NME Joiner Credential이있는 모든 Joiner ( * 와일드 카드 사용)가 네트워크에서 커미셔닝하도록 허용합니다. Joiner는 관리자가 위임 된 스레드 네트워크에 추가하는 장치입니다.

> commissioner joiner add * J01NME
Done

3. Joiner 역할 시작

두 번째 터미널 창에서 새 CLI 프로세스를 생성합니다. 이것은 노드 2입니다.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 2

노드 2에서 J01NME Joiner Credential을 사용하여 Joiner 역할을 활성화합니다.

> ifconfig up
Done
> joiner start J01NME
Done

... 확인을 위해 몇 초간 기다리십시오 ...

Join success

결합 자로서 장치 (노드 2)는 커미셔너 (노드 ​​1)와 성공적으로 인증되었으며 스레드 네트워크 자격 증명을 받았습니다.

이제 Node 2가 인증되었으므로 Thread를 시작합니다.

> thread start
Done

4. 네트워크 인증 확인

노드 2의 state 를 확인하여 이제 네트워크에 연결되었는지 확인합니다. 2 분 이내에 노드 2가 child 에서 router 전환됩니다.

> state
child
Done
...
> state
router
Done

5. 구성 재설정

다음 연습을 준비하려면 구성을 재설정하십시오. 각 노드에서 Thread를 중지하고 공장 초기화를 수행 한 다음 시뮬레이션 된 Thread 장치를 종료합니다.

> thread stop
Done
> factoryreset
>
> exit

factoryreset 명령 후 > 프롬프트를 다시 가져 오려면 Enter 키를 몇 번 눌러야 enter 수 있습니다.

이 연습에서는 하나의 CLI 인스턴스 (단일 임베디드 SoC 스레드 장치)와 하나의 RCP (Radio Co-Processor) 인스턴스를 시뮬레이션 할 것입니다.

ot-daemon 은 UNIX 소켓을 입력 및 출력으로 사용하는 OpenThread Posix 앱의 모드이므로 OpenThread 코어가 서비스로 실행될 수 있습니다. 클라이언트는 OpenThread CLI를 프로토콜로 사용하여 소켓에 연결하여이 서비스와 통신 할 수 있습니다.

ot-ctl 은 RCP를 관리하고 구성하기 위해 ot-daemon 에서 제공하는 CLI입니다. 이를 사용하여 RCP를 스레드 장치가 생성 한 네트워크에 연결합니다.

ot-daemon 사용

이 연습에서는 다음에 해당하는 세 개의 터미널 창을 사용합니다.

  1. 시뮬레이션 된 스레드 장치의 CLI 인스턴스 (노드 1)
  2. ot-daemon 프로세스
  3. ot-ctl CLI 인스턴스

이전 연습에서 계속하는 경우 이미 두 개의 터미널 창이 열려 있어야합니다. 세 번째 창을 열어이 연습에 사용할 수있는 터미널 창이 3 개 있는지 확인합니다.

1. 노드 1 시작

첫 번째 터미널 창에서 시뮬레이션 된 스레드 장치에 대한 CLI 프로세스를 생성합니다.

$ cd ~/src/openthread
$ ./output/simulation/bin/ot-cli-ftd 1

보이지 않는 경우

>

이 명령을 실행 한 후 프롬프트를 누르고

enter

.

새 운영 데이터 세트를 만들고 활성 데이터 세트로 커밋 한 다음 Thread를 시작합니다.

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 07fff800
Ext PAN ID: 97d584bcd493b824
Mesh Local Prefix: fd55:cf34:dea5:7994/64
Master Key: ba6e886c7af50598df1115fa07658a83
Network Name: OpenThread-34e4
PAN ID: 0x34e4
PSKc: 38d6fd32c866927a4dfcc06d79ae1192
Security Policy: 0, onrcb
Done

이 데이터 세트를 활성 데이터 세트로 커밋합니다.

> dataset commit active
Done

IPv6 인터페이스를 불러옵니다.

> ifconfig up
Done

스레드 프로토콜 작업 시작 :

> thread start
Done

노드 1의 스레드 인터페이스에 할당 된 IPv6 주소를 확인합니다.

> ipaddr
fd55:cf34:dea5:7994:0:ff:fe00:fc00
fd55:cf34:dea5:7994:0:ff:fe00:d000
fd55:cf34:dea5:7994:460:872c:e807:c4ab
fe80:0:0:0:9cd8:aab6:482f:4cdc
Done
>

스레드 네트워크 시뮬레이션 단계에서 설명한대로 하나의 주소는 링크 로컬 ( fe80 )이고 세 개는 메시 로컬 ( fd )입니다. EID는 주소에 ff:fe00 을 포함하지 않는 메시 로컬 주소입니다. 이 샘플 출력에서 ​​EID는 fd55:cf34:dea5:7994:460:872c:e807:c4ab 입니다.

노드와 통신하는 데 사용되는 ipaddr 출력에서 특정 EID를 식별하십시오.

2. ot-daemon 시작

두 번째 터미널 창에서 openthread 디렉토리로 이동하여 Node 2라고 부르는 RCP 노드에 대해 ot-daemon 을 시작합니다. 로그 출력을보고 실행 중인지 확인할 수 있도록 -v verbose 플래그를 사용합니다.

$ cd ~/src/openthread
$ ./output/posix/bin/ot-daemon -v \
    'spinel+hdlc+forkpty://output/simulation/bin/ot-rcp?forkpty-arg=2'

성공하면 verbose 모드의 ot-daemon 이 다음과 유사한 출력을 생성합니다.

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun 7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun 7 2020 18:06:08

3. ot-ctl을 사용하여 네트워크에 연결

아직 어떤 스레드 네트워크에도 Node 2 ( ot-daemon RCP)를 의뢰하지 않았습니다. 이것이 ot-ctl 이 들어오는 곳입니다. ot-ctl 은 OpenThread CLI 앱과 동일한 CLI를 사용합니다. 따라서 시뮬레이션 된 다른 스레드 장치와 동일한 방식으로 ot-daemon 노드를 제어 할 수 있습니다.

세 번째 터미널 창에서 ot-ctl 시작합니다.

$ ./output/posix/bin/ot-ctl
>

ot-daemon 시작한 노드 2 (RCP 노드)의 state 를 확인하십시오.

> state
disabled
Done

특정 조이너에 대한 조인을 제한하려면 노드 2의 eui64 를 가져옵니다.

> eui64
18b4300000000001
Done

노드 1에서 커미셔너를 시작하고 해당 eui64로만 참여를 제한합니다.

> commissioner start
Done
> commissioner joiner add 18b4300000000001 J01NME
Done

노드 2에서 네트워크 인터페이스를 불러오고 네트워크에 연결합니다.

> ifconfig up
Done
> joiner start J01NME
Done

... 확인을 위해 몇 초간 기다리십시오 ...

Join success

결합 자로서 RCP (노드 2)는 커미셔너 (노드 ​​1)와 성공적으로 인증되었으며 스레드 네트워크 자격 증명을 받았습니다.

이제 노드 2를 스레드 네트워크에 연결합니다.

> thread start
Done

4. 네트워크 인증 확인

노드 2의 state 를 확인하여 이제 네트워크에 연결되었는지 확인합니다. 2 분 이내에 노드 2가 child 에서 router 전환됩니다.

> state
child
Done
...
> state
router
Done

5. 연결 확인

Ctrl + D 를 사용하여 ot-ctl 을 종료하고 호스트 시스템의 명령 줄에서 ping6 명령과 함께 EID를 사용하여 노드 1을 ping ping6 . ot-daemon RCP 인스턴스가 성공적으로 연결되어 스레드 네트워크와 통신하면 ping이 성공합니다.

$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab
PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms
64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms
--- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms

OpenThread를 사용하여 첫 번째 스레드 네트워크를 성공적으로 시뮬레이션했습니다. 대박!

이 Codelab에서 다음 방법을 배웠습니다.

  • OpenThread 빌드 도구 체인 설정
  • 스레드 네트워크 시뮬레이션
  • 스레드 노드 인증
  • OpenThread Daemon으로 스레드 네트워크 관리

자세히 알아 보려면 다음 참조를 살펴보십시오.