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

1. 소개

26b7f4f6b3ea0700.png

OpenThread 구글 발표는의 오픈 소스 구현 스레드 네트워킹 프로토콜입니다. Google Nest는 개발자가 Nest 제품에 사용되는 기술을 널리 사용하여 커넥티드 홈 제품 개발을 가속화하기 위해 OpenThread를 출시했습니다.

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

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

배울 내용

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

필요한 것

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

2. 빌드 시스템 설정

힘내

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

힘내 다운로드

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

Mac OS X용 XCode

엑스 코드는 설치 및 Mac OS X에 OpenThread을 구축하는 데 필요합니다.

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 시뮬레이션

3. OpenThread 애플리케이션 빌드

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

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

이제 OpenThread 데몬을 빌드합니다.

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

4. 스레드 네트워크 시뮬레이션

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

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

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

6e3aa07675f902dc.png

노드 핑

1. 노드 1 시작

받는 이동 openthread 디렉토리는 사용한 시뮬레이션 나사 장치의 CLI 프로세스를 생성 ot-cli-ftd 이진.

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

참고 :이 표시되지 않는 경우 > 이 명령을 실행 한 후 프롬프트를 눌러 enter .

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

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

주 : 사용 된 파일의 설명 1 시뮬레이션 된 디바이스에 대한 프로세스를 생성 할 때이 코드 랩에 명시된 바와 같이 이상이다. 의 파일 기술자 0 다른 사용을 위해 예약되어 있습니다.

새 Operational Dataset을 만들고 활성 데이터 세트로 커밋합니다. Operational Dataset은 생성 중인 스레드 네트워크에 대한 구성입니다.

> 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
Network 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 = 메쉬 지역
  • 로 시작 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 networkkey e4344ca17d1dca2a33f064992f31f786
Done
> dataset panid 0xc169
Done

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

> dataset commit active
Done

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

> ifconfig up
Done

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

> thread start
Done

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

> state
child
Done

이분 내에서 당신의 접점 볼 수 childrouter . 스레드 라우터는 스레드 장치 간에 트래픽을 라우팅할 수 있습니다. 부모라고도 합니다.

> 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에 대한 Ping

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

> 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

눌러 enter 받는 돌아갑니다 > CLI 프롬프트.

네트워크 테스트

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

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

> thread stop
Done

노드 2로 전환하고 상태를 확인합니다. 2 분 내에, 노드는 리더 (노드 1) 오프라인이 개 검출 것을, 당신은 노드 2의 전환이 될 나타납니다 leader 네트워크 :

> state
router
Done
...
> state
leader
Done

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

> thread stop
Done
> factoryreset
>
> exit

또한 공장 초기화하고 노드 1을 종료합니다.

> factoryreset
>
> exit

참고 항목 OpenThread CLI 참조 가능한 모든 CLI 명령을 탐험.

5. 커미셔닝으로 노드 인증

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

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

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

d6a67e8a0d0b5dcb.png

1. 네트워크 생성

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

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

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

참고 :이 표시되지 않는 경우 > 이 명령을 실행 한 후 프롬프트를 눌러 enter .

새 Operational Dataset을 만들고 활성 데이터 세트로 커밋하고 스레드를 시작합니다.

> 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
Network 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 네트워크에위원회에 자격을 소목. 조이너는 인간 관리자가 위임된 스레드 네트워크에 추가하는 장치입니다.

> commissioner joiner add * J01NME
Done

3. 조이너 역할 시작

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

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

노드 2에서 사용 소목 역할 가능 J01NME 소목 자격 증명을.

> ifconfig up
Done
> joiner start J01NME
Done

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

Join success

조이너로서 장치(노드 2)는 위원(노드 1)과 성공적으로 인증되고 스레드 네트워크 자격 증명을 받았습니다.

이제 노드 2가 인증되었으므로 스레드를 시작합니다.

> thread start
Done

4. 네트워크 인증 확인

체크 state 지금 네트워크에 합류했다고 검증하기 위해, 노드 2에. 2 분 안에에서 노드 2 전환 childrouter :

> state
child
Done
...
> state
router
Done

5. 구성 재설정

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

> thread stop
Done
> factoryreset
>
> exit

당신은 언론에있을 수 있습니다 enter 육성에 몇 번 > 후 프롬프트 다시 factoryreset 명령을 사용합니다.

6. OpenThread Daemon으로 네트워크 관리

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

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

ot-ctl 제공하는 CLI이다 ot-daemon 관리하고 RCP를 구성 할 수 있습니다. 이것을 사용하여 우리는 RCP를 Thread 장치에 의해 생성된 네트워크에 연결할 것입니다.

ot 데몬 사용

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

  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 .

새 Operational Dataset을 만들고 활성 데이터 세트로 커밋하고 스레드를 시작합니다.

> 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
Network 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 ). 이드는 메쉬 지역 포함하지 않는 주소입니다 ff:fe00 주소입니다. 이 샘플 출력에서 EID는 fd55:cf34:dea5:7994:460:872c:e807:c4ab .

사용자로부터 특정의 EID를 확인 ipaddr 노드와 통신하는 데 사용되는 출력.

2. ot-데몬 시작

상기 제 2 터미널 창에서에 대한 탐색에서 openthread 디렉토리 및 시작 ot-daemon 우리는 노드 2.에게 전화 할게 RCP 노드에 대한 -v 는 로그 출력하고 실행되고 있는지 확인을 볼 수 있도록 플래그 자세한 정보를 :

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

성공하면, 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을 사용하여 네트워크에 참여

우리는 노드 2 (위탁하지 않은 ot-daemon 아직 스레드 네트워크에 RCP)를. 곳이다 ot-ctl 제공됩니다. ot-ctl OpenThread CLI 응용 프로그램과 같은 CLI를 사용합니다. 따라서 제어 할 수 있습니다 ot-daemon 다른 시뮬레이션 스레드 장치와 같은 방식으로 노드를.

제 단말기 창에서 시작 ot-ctl :

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

당신은 사용할 것이다 ot-ctl 당신과 함께 제 2 터미널 창에서 시작 노드 2합니다 (RCP 노드) 관리하려면이 세 번째 터미널 창에서 ot-daemon . 체크 state 노드 2의를 :

> 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. 네트워크 인증 확인

체크 state 지금 네트워크에 합류했다고 검증하기 위해, 노드 2에. 2 분 안에에서 노드 2 전환 childrouter :

> state
child
Done
...
> state
router
Done

5. 연결 확인

종료 ot-ctl 과의 EID를 사용하여 노드 1 Ctrl 키 + D를 사용하여 귀하의 호스트 시스템의 명령 행, 핑에 ping6 명령. 는 IF ot-daemon RCP 인스턴스가 성공적으로 결합하고, 스레드 네트워크와 통신, 핑이 성공합니다 :

$ 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

7. 축하합니다!

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

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

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

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