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

nRF52840 보드 및 OpenThread로 스레드 네트워크 구축

26b7f4f6b3ea0700.png

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

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

이 Codelab에서는 실제 하드웨어에서 OpenThread를 프로그래밍하고 스레드 네트워크를 만들고 관리하며 노드간에 메시지를 전달합니다.

4806d16a8c137c6d.jpeg

배울 것

  • OpenThread CLI 바이너리를 개발 보드에 빌드 및 플래싱
  • Linux 시스템과 개발 보드로 구성된 RCP 구축
  • OpenThread Daemon 및 ot-ctl 사용하여 RCP와 통신
  • Screen 및 OpenThread CLI를 사용하여 수동으로 스레드 노드 관리
  • 스레드 네트워크에서 장치의 안전한 시운전
  • IPv6 멀티 캐스트 작동 방식
  • UDP를 사용하여 스레드 노드간에 메시지 전달

필요한 것

하드웨어:

  • 3 Nordic Semiconductor nRF52840 개발 기판
  • 보드를 연결하기위한 USB-Micro-USB 케이블 3 개
  • USB 포트가 3 개 이상인 Linux 시스템

소프트웨어:

  • GNU 툴체인
  • Nordic nRF5x 명령 줄 도구
  • Segger J-Link 소프트웨어
  • OpenThread
  • 힘내

달리 명시되지 않는 한,이 Codelab의 콘텐츠는 Creative Commons Attribution 3.0 라이선스 에 따라 라이선스가 부여되며 코드 샘플은 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다 .

OpenThread 시뮬레이션

시작하기 전에 기본 스레드 개념 및 OpenThread CLI에 익숙해 지려면 OpenThread 시뮬레이션 Codelab 을 실행하는 것이 좋습니다.

직렬 포트 터미널

터미널을 통해 직렬 포트에 연결하는 방법을 잘 알고 있어야합니다. 이 Codelab은 Screen을 사용하고 사용 개요를 제공하지만 다른 터미널 소프트웨어를 사용할 수 있습니다.

Linux 머신

이 Codelab은 i386 또는 x86 기반 Linux 시스템을 사용하여 RCP (Radio Co-Processor) 스레드 장치의 호스트 역할을하고 모든 스레드 개발 보드를 플래시하도록 설계되었습니다. 모든 단계는 Ubuntu 14.04.5 LTS (Trusty Tahr)에서 테스트되었습니다.

Nordic Semiconductor nRF52840 보드

이 Codelab은 3 개의 nRF52840 PDK 보드를 사용 합니다.

a6693da3ce213856.png

우리는 SEGGER J-Link를 사용하여 온보드 JTAG 모듈이있는 nRF52840 보드를 프로그래밍합니다. Linux 시스템에 설치하십시오.

J-Link 소프트웨어 및 문서 팩 다운로드

컴퓨터에 적합한 패키지를 다운로드하고 적절한 위치에 설치하십시오. Linux에서는 /opt/SEGGER/JLink 입니다.

nRF5x 명령 줄 도구 설치

nRF5x 명령 줄 도구를 사용하면 OpenThread 바이너리를 nRF52840 보드에 플래시 할 수 있습니다. Linux 시스템에 적절한 nRF5x-Command-Line-Tools- <OS> 빌드를 설치하십시오.

nRF5x 명령 줄 도구 다운로드

압축을 푼 패키지를 루트 폴더 ~/ 에 넣으십시오.

ARM GNU 도구 모음 설치

ARM GNU 툴체인은 빌드에 사용됩니다.

ARM GNU Toolchain 휴대용 아카이브 다운로드

Linux 시스템의 /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ 에 추출 된 아카이브를 배치하는 것이 좋습니다. 설치 지침은 아카이브의 readme.txt 파일에있는 지침을 따르십시오.

설치 화면 (옵션)

Screen은 직렬 포트로 연결된 장치에 액세스하기위한 간단한 도구입니다. 이 Codelab은 Screen을 사용하지만 원하는 직렬 포트 터미널 응용 프로그램을 사용할 수 있습니다.

$ sudo apt-get install screen

OpenThread

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

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

OpenThread 데몬 빌드 :

$ script/cmake-build posix -DOT_DAEMON=ON

이제 nRF52840 보드에 OpenThread를 빌드하고 플래시 할 준비가되었습니다.

빌드 및 플래시

Joiner 및 기본 USB 기능을 사용하여 OpenThread nRF52840 예제를 빌드하십시오. 장치는 Joiner 역할을 사용하여 안전하게 인증되고 스레드 네트워크에 위임됩니다. 네이티브 USB를 사용하면 nRF52840과 호스트 간의 직렬 전송으로 USB CDC ACM을 사용할 수 있습니다.

항상 rm -rf build 를 실행하여 이전 빌드의 저장소를 먼저 정리하십시오.

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

OpenThread RCP 바이너리가있는 디렉터리로 이동하여 16 진수 형식으로 변환합니다.

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

nRF52840 보드의 외부 전원 핀 옆에있는 Micro-USB 디버그 포트에 USB 케이블을 연결 한 다음 Linux 시스템에 연결합니다. nRF52840 보드의 nRF 전원 스위치를 VDD로 설정 합니다. 올바르게 연결되면 LED5 가 켜집니다.

20a3b4b480356447.png

이것이 Linux 시스템에 연결된 첫 번째 보드 인 경우 직렬 포트 /dev/ttyACM0 으로 표시됩니다 (모든 nRF52840 보드는 직렬 포트 식별자로 ttyACM 을 사용합니다).

$ ls /dev/ttyACM*
/dev/ttyACM0

RCP에 사용되는 nRF52840 보드의 일련 번호를 확인합니다.

c00d519ebec7e5f0.jpeg

nRFx 명령 줄 도구의 위치로 이동하고 보드의 일련 번호를 사용하여 OpenThread RCP hex 파일을 nRF52840 보드에 플래시합니다.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

성공하면 다음 출력이 생성됩니다.

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

나중에 보드 역할을 혼동하지 않도록 보드에 "RCP"라는 레이블을 붙입니다.

기본 USB에 연결

OpenThread RCP 빌드를 사용하면 네이티브 USB CDC ACM을 직렬 전송으로 사용할 수 있으므로 nRF52840 보드의 nRF USB 포트를 사용하여 RCP 호스트 (Linux 시스템)와 통신해야합니다.

플래시 된 nRF52840 보드의 디버그 포트에서 USB 케이블의 Micro-USB 끝을 분리 한 다음 RESET 버튼 옆에있는 Micro-USB nRF USB 포트에 다시 연결합니다. nRF 전원 스위치를 USB로 설정합니다.

46e7b670d2464842.png

OpenThread 데몬 시작

RCP 설계에서 OpenThread Daemon을 사용하여 Thread 장치와 통신하고 관리합니다. -v verbose 플래그로 ot-daemon 을 시작하여 로그 출력을보고 실행 중인지 확인할 수 있습니다.

$ cd ~/src/openthread
$ ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200'

성공하면 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

ot-daemon 로그를 볼 수 있도록이 터미널 창을 열어 둡니다.

ot-ctl 을 사용하여 RCP 노드와 통신합니다. ot-ctl 은 OpenThread CLI 앱과 동일한 CLI를 사용합니다. 따라서 시뮬레이션 된 다른 스레드 장치와 동일한 방식으로 ot-daemon 노드를 제어 할 수 있습니다.

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

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

ot-daemon 시작한 노드 2 (RCP 노드)의 state 를 확인합니다.

> state
disabled
Done

이 Codelab에서 사용되는 다른 두 개의 스레드 노드는 표준 SoC (System-on-Chip) 설계의 FTD (Full Thread Devices)입니다. wpantund 사용하지 않으며 사용자는 OpenThread CLI를 사용하여 수동으로 관리합니다.

한 장치가 커미셔너 역할을하여 해당 네트워크에서 장치를 안전하게 인증하고 커미셔닝합니다. 다른 장치는 커미셔너가 스레드 네트워크에 인증 할 수있는 결합 자 역할을합니다.

빌드 및 플래시

커미셔너 및 조이너 역할을 활성화하여 nRF52840 플랫폼 용 OpenThread FTD 예제를 빌드합니다.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 UART_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

OpenThread FTD (Full Thread Device) CLI 바이너리가있는 디렉터리로 이동하여 16 진수 형식으로 변환합니다.

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

nRF52840 보드의 외부 전원 핀 옆에있는 Micro-USB 포트에 USB 케이블을 연결 한 다음 Linux 컴퓨터에 연결합니다. RCP가 여전히 Linux 시스템에 연결되어있는 경우이 새 보드는 직렬 포트 /dev/ttyACM1 (모든 nRF52840 보드는 직렬 포트 식별자로 ttyACM 을 사용합니다).

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

이전과 마찬가지로 FTD에 사용되는 nRF52840 보드의 일련 번호를 확인합니다.

c00d519ebec7e5f0.jpeg

nRFx 명령 줄 도구의 위치로 이동하고 보드의 일련 번호를 사용하여 OpenThread CLI FTD hex 파일을 nRF52840 보드에 플래시합니다.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

보드에 "위원"이라는 레이블을 붙입니다.

빌드 확인

터미널 창에서 GNU 화면을 사용하여 OpenThread CLI에 액세스하여 성공적인 빌드를 확인합니다. nRF52840 보드는 115200의 전송 속도를 사용합니다.

$ screen /dev/ttyACM1 115200

새 창에서 키보드의 Return 키를 몇 번 눌러 OpenThread CLI > 프롬프트를 표시합니다. IPv6 인터페이스를 불러 와서 주소를 확인하십시오.

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Ctrl + a 사용 →

d FTD 커미셔너 CLI 화면 에서 분리 하고 Linux 터미널로 돌아가 다음 보드를 플래싱 할 수 있습니다. 언제든지 CLI에 다시 들어가려면 명령 줄에서 screen -r 을 사용하십시오. 사용 가능한 화면 목록을 보려면 screen -ls 사용하십시오.

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

FTD Joiner 설정

기존 ot-cli-ftd.hex 빌드를 사용하여 위의 프로세스를 반복하여 세 번째 nRF52840 보드를 플래시합니다.

이 세 번째 보드가 연결될 때 다른 두 노드가 Linux 시스템에 연결되어 있으면 직렬 포트 /dev/ttyACM2 로 표시되어야합니다.

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

보드에 "Joiner"라는 레이블을 붙입니다.

Screen을 사용하여 확인할 때 명령 줄에서 Screen의 새 인스턴스를 만드는 대신 기존 인스턴스에 다시 연결하고 그 안에 새 창을 만듭니다 (FTD 커미셔너에 사용) :

$ screen -r

Ctrl + a를 사용하여 Screen 내에 새 창 만들기 →

c **. ** 새 명령 줄 프롬프트가 나타납니다. FTD Joiner 용 OpenThread CLI에 액세스합니다.

$ screen /dev/ttyACM2 115200

이 새 창에서 키보드의 Return 키를 몇 번 눌러 OpenThread CLI > 프롬프트를 표시합니다. IPv6 인터페이스를 불러 와서 주소를 확인하십시오.

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

이제 FTD Joiner CLI가 FTD 커미셔너와 동일한 Screen 인스턴스에 있으므로 Ctrl + a → n 사용하여 둘 사이를 전환 할 수 있습니다.

Ctrl + a 사용 →

d 언제든지 화면을 종료합니다.

앞으로는 스레드 장치간에 자주 전환 할 것이므로 모든 장치가 라이브 상태이고 쉽게 액세스 할 수 있는지 확인하십시오. 지금까지 Screen을 사용하여 두 개의 FTD에 액세스했으며이 도구를 사용하면 동일한 터미널 창에서 화면을 분할 할 수도 있습니다. 이를 사용하여 한 노드가 다른 노드에서 실행 된 명령에 어떻게 반응하는지 확인합니다.

이상적으로는 네 개의 창을 쉽게 사용할 수 있어야합니다.

  1. ot-daemon 서비스 / 로그
  2. ot-ctl 통한 RCP Joiner
  3. OpenThread CLI를 통한 FTD 커미셔너
  4. OpenThread CLI를 통한 FTD Joiner

자체 터미널 / 직렬 포트 구성 또는 도구를 사용하려면 다음 단계로 건너 뛰십시오. 사용자에게 가장 적합한 방식으로 모든 장치에 대한 터미널 창을 구성하십시오.

화면 사용

사용하기 쉽도록 하나의 Screen 세션 만 시작하십시오. 두 FTD를 설정할 때 이미 하나가 있어야합니다.

Screen 내의 모든 명령은 Ctrl + a로 시작합니다.

기본 화면 명령 :

Screen 세션에 다시 연결 (명령 줄에서)

screen -r

Screen 세션에서 나가기

Ctrl + a → d

Screen 세션 내에서 새 창 만들기

Ctrl + a → c

동일한 화면 세션에서 창 간 전환

Ctrl + a → n (앞으로) Ctrl + a → p (뒤로)

Screen 세션에서 현재 창을 종료합니다.

Ctrl + a → k

분할 화면

Screen을 사용하면 터미널을 여러 창으로 분할 할 수 있습니다.

f1cbf1258cf0a5a.png

screen 명령은 Ctrl + a를 사용하여 액세스합니다. 모든 명령은이 액세스 키 콤보로 시작해야합니다.

Codelab을 정확하게 따라왔다면 동일한 Screen 인스턴스에 두 개의 창 (FTD Commissioner, FTD Joiner)이 있어야합니다. 둘 사이에서 화면을 분할하려면 먼저 기존 Screen 세션을 입력하십시오.

$ screen -r

FTD 디바이스 중 하나에 있어야합니다. 화면에서 다음 단계를 따르십시오.

  1. Ctrl + a → S 창을 가로로 분할
  2. Ctrl + a → Tab 을 사용하여 커서를 새 빈 창으로 이동
  3. 새 창을 다음 창으로 전환하려면 Ctrl + a → n
  4. 상단 창과 같으면 Ctrl + a → n 다시 눌러 다른 FTD 디바이스를 봅니다.

이제 둘 다 표시됩니다. Ctrl + a → Tab 사용하여 전환합니다. 혼동을 피하기 위해 Ctrl + a → A 로 각 창의 제목을 변경하는 것이 좋습니다.

고급 사용

화면을 사분면으로 더 분할하고 ot-daemon 로그 및 RCP Joiner ot-ctl 보려면 이러한 서비스를 동일한 Screen 인스턴스 내에서 시작해야합니다. 이렇게하려면 ot-daemon 중지하고 ot-ctl 종료 한 다음 새 Screen 창에서 다시 시작합니다 (Ctrl + a → c ).

이 설정은 필요하지 않으며 사용자를위한 연습으로 남겨 둡니다.

다음 명령을 사용하여 창을 분할하고 탐색합니다.

새 창 만들기

Ctrl + a → c

창을 수직으로 분할

Ctrl + a →

창을 가로로 분할

Ctrl + a → S

다음 표시된 창으로 이동

Ctrl + a → Tab

표시된 창을 앞으로 또는 뒤로 전환

Ctrl + a → n 또는 p

현재 창 이름 바꾸기

Ctrl + a → A

Ctrl + a → d 를 눌러 언제든지 Screen을 종료하고 명령 줄에서 screen -r 로 다시 연결합니다.

Screen에 대한 자세한 내용은 GNU Screen 빠른 참조를 참조하십시오 .

이제 모든 터미널 창과 화면을 구성 했으므로 스레드 네트워크를 만들어 보겠습니다. FTD 커미셔너 에서 새 운영 데이터 세트를 생성하고이를 활성 데이터 세트로 커밋합니다. 운영 데이터 세트는 생성중인 스레드 네트워크에 대한 구성입니다.

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Master Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

나중에 사용할 마스터 키 1234c0de7ab51234c0de7ab51234c0de1234c0de7ab51234c0de7ab51234c0de .

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

> dataset commit active
Done

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

> ifconfig up
Done

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

> thread start
Done

잠시 후 장치 상태를 확인하십시오. 리더가되어야합니다. 또한 향후 참조를 위해 RLOC16을 받으십시오.

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

장치의 IPv6 주소를 확인하십시오.

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

이제 다른 스레드 장치에서 스캔 할 때 "codelab"네트워크가 표시됩니다.

RCP Joinerot-ctl 에서 :

## RCP Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

FTD Joiner 의 OpenThread CLI에서 :

## FTD Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

"codelab"네트워크가 목록에 나타나지 않으면 다시 스캔 해보십시오.

두 스캔 모두에서 네트워크가 조인 할 수없는 것 같습니다 (RCP 조이너 및 FTD 조이너의 J 열). 이것은 스레드 커미셔닝이 네트워크에서 활성화되지 않았 음을 의미합니다. 조이너 장치에 네트워크 마스터 키를 수동으로 입력하여 대역 외에 조인 할 수 있습니다.

대역 외 프로세스를 사용하여 방금 만든 스레드 네트워크에 RCP 조이너를 추가해 보겠습니다. RCP Joiner 에서 네트워크 검색 :

## RCP Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

가입하려면 활성 데이터 세트의 RCP Joiner에서 네트워크 마스터 키 (FTD 커미셔너로부터 방금 얻음)를 설정합니다.

## RCP Joiner ##
----------------

> dataset masterkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

데이터 세트가 올바르게 설정되었는지 확인합니다.

## RCP Joiner ##
----------------

> dataset
Master Key: 1234c0de7ab51234c0de7ab51234c0de

RCP Joiner가 "codelab"네트워크에 참여하도록 Thread를 불러옵니다. 몇 초 동안 기다렸다가 상태, RLOC16 및 해당 IPv6 주소를 확인하십시오.

## RCP Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

메시 로컬 IPv6 주소 ( fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f )를 fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f . 나중에 사용할 것입니다.

FTD 커미셔너로 돌아가서 라우터 및 하위 테이블을 확인하여 두 장치가 동일한 네트워크에 속해 있는지 확인합니다. RCP 결합자를 식별하려면 RLOC16을 사용하십시오.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

RCP Joiner의 메시-로컬 주소 (RCP Joiner의 ipaddr 출력에서 얻은 메시-로컬 주소)를 핑하여 연결을 확인합니다.

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

이제 다음 토폴로지 다이어그램에서 설명하는 두 개의 노드로 구성된 스레드 네트워크가 있습니다.

otcodelab_top01C_2nodes.png

토폴로지 다이어그램

Codelab의 나머지 부분을 살펴보면 네트워크 상태가 변경 될 때마다 새로운 스레드 토폴로지 다이어그램이 표시됩니다. 노드 역할은 다음과 같이 표시됩니다.

b75a527be4563215.png

라우터는 항상 오각형이고 최종 장치는 항상 원입니다. 각 노드의 숫자는 각 노드의 현재 역할 및 해당 시점의 상태에 따라 CLI 출력에 표시된 라우터 ID 또는 하위 ID를 나타냅니다.

이제 "codelab"네트워크에 세 번째 스레드 장치를 추가해 보겠습니다. 이번에는 더 안전한 대역 내 커미셔닝 프로세스를 사용할 것입니다. FTD Joiner 에서 네트워크를 검색합니다.

## FTD Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 |  57 |

J 열의 0 은 스레드 커미셔닝이 장치에서 활성화되지 않았 음을 나타냅니다.

이 다음 장치에서 시운전 할 때 구체적으로 설명하고 FTD Joiner 만 참여하도록 허용합니다. FTD Joiner에서 eui64 가져와 FTD 커미셔너가 식별 할 수 있도록합니다.

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

FTD 커미셔너 에서 커미셔너 를 시작하고 Joiner Credential과 함께 가입 할 수있는 장치의 eui64 를 지정합니다. Joiner Credential은 장치 별 암호입니다.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

FTD Joiner로 전환하고 다시 검색합니다.

## FTD Joiner ##
----------------

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 1 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -45 | 196 |

J 열의 1 로 표시된 것처럼 스레드 커미셔닝이 이제 네트워크에서 활성화됩니다. FTD 커미셔너에서 방금 설정 한 참여자 자격 증명으로 참여자 역할을 시작합니다.

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

1 분 내에 성공적인 인증 확인을받습니다.

## FTD Joiner ##
----------------

>
Join success

FTD Joiner가 "codelab"네트워크에 참여하도록 Thread를 불러오고 즉시 상태와 RLOC16을 확인합니다.

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

장치의 IPv6 주소를 확인하십시오. ALOC가 없습니다. 이는이 장치가 리더가 아니고 ALOC를 필요로하는 Anycast 특정 역할을 갖고 있지 않기 때문입니다.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

즉시 FTD 커미셔너로 전환하고 라우터 및 하위 테이블을 확인하여 "codelab"네트워크에 세 개의 장치가 있는지 확인합니다.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

RLOC16을 기반으로 FTD Joiner는 엔드 디바이스 (하위)로 네트워크에 연결되었습니다. 다음은 업데이트 된 토폴로지입니다.

otcodelab_top01C_ed01.png

이 Codelab의 스레드 장치는 라우터 적격 최종 장치 (REED)라고하는 특정 종류의 전체 스레드 장치 (FTD)입니다. 즉, 라우터 또는 최종 장치로 작동 할 수 있으며 최종 장치에서 라우터로 자신을 승격시킬 수 있습니다.

스레드는 최대 32 개의 라우터를 지원할 수 있지만 라우터 수를 16 ~ 23 개 사이로 유지하려고합니다. REED가 최종 장치 (하위)로 연결되고 라우터 수가 16 개 미만이면 2 분 이내에 임의의 시간이 지난 후 자동으로 라우터로 승격됩니다.

FTD 조이너를 추가 한 후 스레드 네트워크에 두 명의 자식이있는 경우 최소 2 분 동안 기다린 다음 FTD 커미셔너 에서 라우터 및 자식 테이블을 다시 확인합니다.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

FTD Joiner (Extended MAC = e6cdd2d93249a243 )가 라우터로 승격되었습니다. RLOC16은 다릅니다 ( b800 대신 0c02 ). RLOC16은 장치의 라우터 ID와 자식 ID를 기반으로하기 때문입니다. 최종 장치에서 라우터로 전환하면 해당 라우터 ID 및 하위 ID 값이 변경되고 RLOC16도 변경됩니다.

otcodelab_top01C.png

FTD Joiner 에서 새 상태 및 RLOC16을 확인합니다.

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

FTD Joiner 다운 그레이드

라우터에서 최종 장치로 FTD 조이너 를 수동으로 다운 그레이드하여이 동작을 테스트 할 수 있습니다. 상태를 하위로 변경하고 RLOC16을 확인하십시오.

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

FTD 커미셔너로 돌아 가면 FTD Joiner가 이제 자식 테이블 (ID = 3)에 나타나야합니다. 전환하는 동안 둘 다에있을 수도 있습니다.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

잠시 후 RLOC가 b800 라우터로 다시 전환됩니다.

otcodelab_top01C.png

지도자 제거

리더는 모든 스레드 라우터 중에서 스스로 선출됩니다. 이는 현재 리더가 스레드 네트워크에서 제거되면 다른 라우터 중 하나가 새 리더가됨을 의미합니다.

FTD 커미셔너 에서 Thread를 종료하여 Thread 네트워크에서 제거합니다.

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

2 분 내에 FTD Joiner 가 새로운 스레드 리더가됩니다. FTD 조이너의 상태 및 IPv6 주소를 확인하여 다음을 확인하십시오.

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

자식 테이블을 확인하십시오. 새로운 RLOC16이 있습니다. ID 및 확장 MAC으로 표시되는 RCP Joiner입니다. 스레드 네트워크를 함께 유지하기 위해 FTD 커미셔너에서 FTD 조이너로 상위 라우터를 전환했습니다. 그 결과 RCP Joiner에 대한 새로운 RLOC16이 생성됩니다 (라우터 ID가 3에서 46으로 변경 되었기 때문).

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

RCP Joiner 가 FTD Joiner에 어릴 때 연결될 때까지 몇 분 정도 기다려야 할 수 있습니다. 상태 및 RLOC16을 확인하여 다음을 확인하십시오.

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

FTD 커미셔너 다시 연결

두 개의 노드가있는 스레드 네트워크는 그다지 재미 없습니다. FTD 커미셔너를 다시 온라인 상태로 만드십시오.

FTD 커미셔너 에서 스레드를 다시 시작합니다.

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

2 분 이내에 엔드 디바이스로 "codelab"네트워크에 자동으로 다시 연결되고 라우터로 승격됩니다.

## FTD Commissioner ##
----------------------

> state
router
Done

FTD 조이너 에서 라우터 및 자식 테이블을 확인하여 다음을 확인합니다.

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

스레드 네트워크는 다시 세 개의 노드로 구성됩니다.

서로 다른 터미널 또는 화면 창에서 여러 장치로 스레드 네트워크를 관리하는 것은 복잡 할 수 있습니다. 문제가 발생한 경우 다음 팁을 사용하여 네트워크 또는 작업 공간의 상태를 "재설정"하십시오.

화면

구성에서 길을 잃은 경우 (너무 많은 화면 창 또는 화면 내 화면) Ctrl + a → k로 화면 창을 계속 죽이고 명령 줄의 screen -lsNo Sockets found 출력합니다. 그런 다음 각 장치에 대한 화면 창을 다시 만듭니다. 화면이 종료 된 경우에도 장치 상태가 유지됩니다.

스레드 노드

스레드 네트워크 토폴로지가이 Codelab에 설명 된 것과 같지 않거나 노드가 어떤 이유로 연결이 끊어진 경우 (아마도이를 구동하는 Linux 머신이 절전 모드로 전환 되었기 때문일 수 있음) 스레드를 종료하고 네트워크 자격 증명을 지운 다음 생성 에서 다시 시작하는 것이 가장 좋습니다. 스레드 네트워크 단계.

FTD를 재설정하려면 :

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

RCP는 ot-ctl 통해 동일한 방식으로 재설정 할 수 있습니다.

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

멀티 캐스트는 한 번에 장치 그룹에 정보를 전달하는 데 사용됩니다. 스레드 네트워크에서 특정 주소는 범위에 따라 여러 장치 그룹에서 멀티 캐스트 사용을 위해 예약됩니다.

IPv6 주소

범위

배달 됨

ff02::1

링크-로컬

모든 FTD 및 MED

ff02::2

링크-로컬

모든 FTD 및 경계 라우터

ff03::1

메시-로컬

모든 FTD 및 MED

ff03::2

메시-로컬

모든 FTD 및 경계 라우터

이 Codelab에서는 Border Router를 사용하지 않으므로 두 개의 FTD 및 MED 멀티 캐스트 주소에 집중하겠습니다.

링크-로컬 범위는 단일 무선 전송 또는 단일 "홉"으로 도달 할 수있는 모든 스레드 인터페이스로 구성됩니다. 네트워크 토폴로지는 ff02::1 멀티 캐스트 주소에 대한 ping에 응답하는 장치를 지정합니다.

FTD 커미셔너의 Ping ff02::1 :

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

네트워크에는 두 개의 다른 장치 (FTD 조이너 및 RCP 조이너)가 있지만 FTD 커미셔너는 FTD 조이너의 LLA (Link-Local Address)에서 하나의 응답 만 받았습니다. 즉, FTD 조이너는 FTD 커미셔너가 단일 홉으로 연결할 수있는 유일한 장치입니다.

otcodelab_top02C_02_LL.png

이제 FTD Joiner 에서 ff02::1 을 핑합니다.

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

두 가지 응답! 다른 장치의 IPv6 주소를 확인하면 첫 번째 주소 ( 4b1d )가 FTD 커미셔너의 LLA이고 두 번째 주소 ( 943b 끝남)가 RCP Joiner의 LLA임을 알 수 있습니다.

otcodelab_top02C_02_LL02.png

즉, FTD Joiner는 FTD 커미셔너와 RCP Joiner 모두에 직접 연결되어 토폴로지를 확인합니다.

메시-로컬

Mesh-Local 범위는 동일한 스레드 네트워크 내에서 도달 할 수있는 모든 스레드 인터페이스로 구성됩니다. ff03::1 멀티 캐스트 주소에 대한 핑에 대한 응답을 살펴 보겠습니다.

FTD 커미셔너의 Ping ff03::1 :

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

이번에 FTD 커미셔너는 FTD Joiner의 Routing Locator (RLOC, b800 )와 RCP Joiner의 Mesh-Local EID (ML-EID, d55f )로부터 두 개의 응답을 받았습니다. 메시 로컬 범위가 전체 스레드 네트워크를 구성하기 때문입니다. 네트워크에서 장치가 어디에 있든 상관없이 ff03::1 주소로 구독됩니다.

otcodelab_top02C_02_ML.png

FTD 조이너 에서 ff03::1 을 Ping하여 동일한 동작을 확인합니다.

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

두 ping 출력 모두에서 RCP Joiner에 대한 응답 시간을 기록하십시오. RCP Joiner는 FTD Joiner (23ms)에 도달하는 것보다 FTD 커미셔너 (68ms)에 도달하는 데 훨씬 더 오래 걸렸습니다. 이는 FTD 조이너에 대한 한 홉에 비해 FTD 커미셔너에 도달하려면 두 홉을 만들어야하기 때문입니다.

메시 로컬 멀티 캐스트 핑이 RCP 조이너가 아닌 두 FTD에 대해서만 RLOC로 응답 한 것을 알 수 있습니다. 이는 FTD가 네트워크 내의 라우터이고 RCP가 엔드 디바이스이기 때문입니다.

RCP Joiner 의 상태를 확인하여 확인하십시오.

## RCP Joiner ##
----------------

> state
child

OpenThread가 제공하는 애플리케이션 서비스 중 하나는 전송 계층 프로토콜 인 UDP (User Datagram Protocol)입니다. OpenThread에 구축 된 애플리케이션은 UDP API를 사용하여 스레드 네트워크의 노드간에 또는 외부 네트워크의 다른 장치 (예 : 스레드 네트워크에 테두리 라우터가있는 경우 인터넷)로 메시지를 전달할 수 있습니다.

UDP 소켓은 OpenThread CLI를 통해 노출됩니다. 두 FTD간에 메시지를 전달하는 데 사용하겠습니다.

FTD 결합 자에 대한 메시-로컬 EID 주소를 가져옵니다. 이 주소는 스레드 네트워크 내의 어느 곳에서나 연결할 수 있기 때문에 사용하고 있습니다.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

UDP를 시작하고 IPv6 주소의 소켓에 바인딩합니다.

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

FTD 커미셔너로 전환하고 UDP를 시작한 다음 ML-EID를 사용하여 FTD 조이너에서 설정 한 소켓에 연결합니다.

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

UDP 연결은 두 노드 사이에 있어야합니다. FTD 커미셔너로부터 메시지 보내기 :

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

FTD Joiner 에서 UDP 메시지가 수신되었습니다!

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

물리적 스레드 네트워크를 만들었습니다!

b915c433e7027cc7.png

이제 알 수 있습니다.

  • 스레드 장치 유형, 역할 및 범위의 차이
  • 스레드 장치가 네트워크 내에서 상태를 관리하는 방법
  • UDP를 사용하여 노드간에 간단한 메시지를 전달하는 방법

다음 단계

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

  • ot-cli-mtd 바이너리를 사용하여 FTD Joiner 보드를 MTD로 업데이트하고 라우터로 업그레이드하거나 리더가 되려고하지 않는지 확인합니다.
  • 네트워크에 더 많은 장치를 추가하고 (다른 플랫폼을 사용해보십시오!) 멀티 캐스트 주소에 대한 ping과 함께 라우터 및 자식 테이블을 사용하여 토폴로지를 스케치합니다.
  • pyspinel 을 사용하여 NCP 제어
  • OpenThread Border Router를 사용하여 NCP를 Border Router로 변환하고 Thread 네트워크를 인터넷에 연결합니다.

추가 읽기

openthread.ioGitHub 에서 다음을 비롯한 다양한 OpenThread 리소스를 확인하세요.

참고: