Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

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

1. 소개

26b7f4f6b3ea0700.png

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

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

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

4806d16a8c137c6d.jpeg

실습 내용

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

준비물

하드웨어

  • Nordic Semiconductor nRF52840 개발 보드 3개
  • 보드 연결용 USB-마이크로 USB 케이블 3개
  • USB 포트가 3개 이상인 Linux 머신

소프트웨어:

  • GNU 도구 모음
  • Nordic nRF5x 명령줄 도구
  • Seger J-Link 소프트웨어
  • OpenThread
  • Git

2 시작하기

OpenThread 시뮬레이션

시작하기 전에 OpenThread 시뮬레이션 Codelab을 실행하여 기본 스레드 개념과 OpenThread CLI를 익히는 것이 좋습니다.

직렬 포트 터미널

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

Linux 머신

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

Nordic Semiconductor nRF52840 보드

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

A6693da3ce213856.png

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

시스템에 적합한 패키지를 다운로드하여 적절한 위치에 설치합니다. Linux에서는 /opt/SEGGER/JLink입니다.

nRF5x 명령줄 도구 설치

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

추출된 패키지를 루트 폴더 ~/에 배치합니다.

ARM GNU 도구 모음 설치

빌드에는 ARM GNU 도구 체인이 사용됩니다.

추출된 보관 파일을 Linux 시스템의 /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/에 배치하는 것이 좋습니다. 설치 안내는 보관함의 readme.txt 파일에 있는 안내를 따르세요.

설치 화면 (선택사항)

화면은 직렬 포트로 연결된 기기에 액세스하기 위한 간단한 도구입니다. 이 Codelab은 화면을 사용하지만, 원하는 모든 직렬 포트 터미널 애플리케이션을 사용할 수 있습니다.

$ sudo apt-get install screen

3. 저장소 클론

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

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

4. RCP 연결자 설정

빌드 및 플래시

연결자 및 기본 USB 기능으로 OpenThread nRF52840 예를 빌드합니다. 기기는 작업자 역할을 사용하여 스레드 네트워크에 안전하게 인증되고 의뢰됩니다. 네이티브 USB를 사용하면 USB CDC ACM을 nRF52840과 호스트 간에 직렬 전송으로 사용할 수 있습니다.

항상 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 보드의 외부 전원 핀 옆에 있는 마이크로 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 16진수 파일을 nRF52840 보드에 플래시합니다. --verify 플래그를 생략하면 플래시 프로세스가 오류 없이 실패할 수 있음을 알리는 경고 메시지가 표시됩니다.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --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 케이블의 마이크로 USB 끝을 분리한 다음 리셋 버튼 옆의 마이크로 USB nRF USB 포트에 다시 연결합니다. 에서 확인할 수 있습니다. nRF 전원 스위치를 USB로 설정합니다.

46e7b670d2464842.png

OpenThread 데몬 시작

RCP 디자인에서 OpenThread Daemon을 사용하여 스레드 기기와 통신하고 관리할 수 있습니다. 로그 출력을 확인하고 실행 중인지 확인할 수 있도록 -v 상세 플래그로 ot-daemon를 시작합니다.

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

성공하면 상세 모드의 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을 시작합니다.

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

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

> state
disabled
Done

5 FTD 설정

이 Codelab에 사용된 다른 두 스레드 노드는 표준 단일 칩 시스템 (SoC) 설계의 전체 스레드 기기 (FTD)입니다. 프로덕션 설정에서는 프로덕션 수준의 네트워크 인터페이스 드라이버인 wpantund를 사용하여 OpenThread NCP 인스턴스를 제어할 수 있지만 이 Codelab에서는 OpenThread인 ot-ctl를 사용합니다. CLI입니다.

한 기기는 이 네트워크에서 기기를 안전하게 인증하고 의뢰하기 위한 총괄 기능으로 작동합니다. 다른 기기는 수수료자가 스레드 네트워크에 인증할 수 있는 연결자로 기능합니다.

빌드 및 플래시

nRF52840 플랫폼용 OpenThread FTD 예시를 빌드하여 커밋자 및 조인자 역할을 사용 설정합니다.

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

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

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

nRF52840 보드의 외부 전원 핀 옆에 있는 마이크로 USB 포트에 USB 케이블을 연결한 다음 Linux 시스템에 연결합니다. RCP가 Linux 시스템에 계속 연결되어 있는 경우 이 새 보드는 직렬 포트 /dev/ttyACM1로 표시됩니다 (모든 nRF52840 보드는 직렬 포트 식별자에 ttyACM을 사용함).

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

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

c00d519ebec7e5f0.jpeg

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

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

보드에 '위원회'라는 라벨을 지정합니다.

네이티브 USB에 연결

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

플래시된 nRF52840 보드의 디버그 포트에서 USB 케이블의 마이크로 USB 끝을 분리한 다음 리셋 버튼 옆의 마이크로 USB nRF USB 포트에 다시 연결합니다. 에서 확인할 수 있습니다. nRF 전원 스위치를 USB로 설정합니다.

46e7b670d2464842.png

빌드 확인

터미널 창에서 GNU Screen을 사용하여 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 Commissioner 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 보드를 플래시하려면 위의 프로세스를 반복합니다. 완료되면 nRF USB 포트를 사용하여 보드를 PC에 다시 연결하고 nRF 전원 스위치를 VDD로 설정해야 합니다.

이 세 번째 보드가 연결될 때 다른 두 노드가 Linux 머신에 연결된 경우 직렬 포트 /dev/ttyACM2로 표시됩니다.

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

보드에 '조인' 라벨을 지정합니다.

화면을 사용하여 확인할 때는 명령줄에서 새 인스턴스 인스턴스를 만드는 대신 기존 인스턴스를 다시 연결하고 인스턴스 내에서 새 창을 만듭니다 (FTD 커머스에 사용함).

$ screen -r

Ctrl+a → 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 Commissioner와 동일한 Screen 인스턴스에 있으므로 Ctrl+a → n를 사용하여 전환할 수 있습니다.

Ctrl+a →

d 를 클릭하여 언제든지 화면을 종료할 수 있습니다.

6. 터미널 창 설정

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

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

  1. ot-daemon 서비스 / 로그
  2. ot-ctl을 통한 RCP 연결자
  3. OpenThread CLI를 통한 FTD Commissioner
  4. OpenThread CLI를 통한 FTD Joiner

자체 터미널 / 직렬 포트 구성 또는 도구를 사용하려면 언제든지 다음 단계로 건너뛰세요. 모든 기기에 가장 적합한 방식으로 터미널 창을 구성합니다.

화면 사용

사용 편의성을 위해 하나의 화면 세션만 시작합니다. 두 FTD를 설정할 때 이미 있어야 합니다.

화면 내의 모든 명령어는 Ctrl+a로 시작합니다.

기본 화면 명령어:

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

screen -r

화면 세션 종료

Ctrl+a → d

Screen 세션 내에서 새 창 만들기

Ctrl+a → c

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

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

Screen 세션에서 현재 창 종료

Ctrl+a → k

화면 분할

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

f1cbf1258cf0a5a.png

screen의 명령어는 Ctrl+a를 사용하여 액세스합니다. 모든 명령어는 이 액세스 키 조합으로 시작해야 합니다.

Codelab을 정확하게 따랐다면 동일한 화면 인스턴스에 창 두 개 (FTD 커머스, FTD 조인자)가 있어야 합니다. 화면 간에 분할하려면 먼저 기존 화면 세션을 입력합니다.

$ 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 조인자 ot-ctl를 보려면 이러한 서비스가 동일한 Screen 인스턴스 내에서 시작되어야 합니다. 이렇게 하려면 ot-daemon을 중지하고 ot-ctl을 종료한 다음 새 화면 창 (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 -r을 사용하여 다시 연결합니다.

화면에 관한 자세한 내용은 GNU Screen 빠른 참조를 참조하세요.

7 스레드 네트워크 만들기

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

## 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
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

나중에 사용할 네트워크 키 1234c0de7ab51234c0de7ab51234c0de를 기록해 둡니다.

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

> 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 조인자ot-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 열). 즉, 스레드 스레드가 네트워크에서 활성화되지 않습니다. 연결기에서 네트워크 키를 직접 입력하여 대역 외로 조인할 수 있습니다.

8 RCP 연결자 추가

방금 생성한 스레드 네트워크에 대역 외 프로세스를 사용하여 RCP 조인자를 추가해 보겠습니다. RCP 조인자에서 네트워크를 검색합니다.

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

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

참여하려면 활성 데이터 세트의 RCP 조인자에서 네트워크 키 (FTD 위원회에서 방금 가져옴)를 설정합니다.

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

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

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

RCP 연결자가 'Codelab' 네트워크에 참여하도록 스레드를 가져옵니다. 잠시 기다린 후 상태, 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

나중에 사용할 수 있도록 Mesh-Local IPv6 주소 (여기서 fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f)를 기록해 둡니다.

FTD Commissioner로 돌아가 라우터와 하위 표에서 두 기기가 동일한 네트워크에 속하는지 확인합니다. RLOC16을 사용하여 RCP 연결자를 식별합니다.

## 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 연결자의 메시-로컬 주소 (RCP 연결자의 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를 나타냅니다.

9. FTD 가입자 수수료

이제 세 번째 스레드 기기를 '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 참여자만 참여하도록 허용합니다. FTD 위원회에서 계속 식별할 수 있도록 FTD 조인자에서 eui64를 가져옵니다.

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

> eui64
2f57d222545271f1
Done

FTD Commissioner에서 커밋자를 시작하고 Joiner Credential과 함께 조인할 수 있는 기기의 eui64를 지정합니다(예: J01NME). 연결 사용자 인증 정보는 길이가 6~32자인 모든 대문자 영숫자 문자 (0~9 및 AY, 가독성을 위해 I, O, Q, Z는 제외)로 이루어진 기기별 문자열입니다.

## 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' 네트워크에 참여하도록 스레드를 불러온 후 즉시 상태와 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 Commissioner로 전환하고 라우터와 하위 표에서 기기가 '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 참여자는 네트워크에 최종 기기 (하위 요소)로 연결되었습니다. 업데이트된 토폴로지는 다음과 같습니다.

otcodelab_top01C_ed01.png

10. 작업 중인 대화목록

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

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

FTD 조인자를 추가한 후 스레드 네트워크에 하위 항목이 2개 있는 경우 최소 2분 정도 기다린 다음 FTD Commissioner에서 라우터와 하위 테이블을 다시 확인하세요.

## 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 참여자 (확장 MAC = e6cdd2d93249a243)가 자신을 라우터로 승급했습니다. RLOC16은 다릅니다 (0c02 대신 b800). RLOC16이 기기의 라우터 ID 및 하위 ID를 기반으로 하기 때문입니다. 최종 기기에서 라우터로 전환하면 라우터 ID와 하위 ID 값이 변경되고 RLOC16도 변경됩니다.

otcodelab_top01C.png

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

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

> state
router
Done
> rloc16
b800
Done

FTD 참여자 다운그레이드

라우터에서 최종 기기로 FTD 조인자를 수동으로 다운그레이드하여 이 동작을 테스트할 수 있습니다. 상태를 하위 요소로 변경하고 RLOC16을 확인합니다.

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

다시 FTD Commissioner로 돌아가면 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 Commissioner에서 스레드를 종료하여 스레드 네트워크에서 스레드를 삭제합니다.

## 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이 있습니다. 이는 RCP 연결자이며 ID 및 확장 MAC로 표시됩니다. 스레드 네트워크를 함께 유지하기 위해 상위 라우터를 FTD 위원에서 FTD 참여자로 전환했습니다. 그러면 라우터 ID가 3에서 46으로 변경되어 RCP 연결자에게 새 RLOC16이 생성됩니다.

## 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 회원이 FTD 회원에 자녀로 연결될 때까지 몇 분 정도 기다려야 할 수 있습니다. 상태 및 RLOC16에서 다음을 확인합니다.

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

> state
child
> rloc16
b801

FTD 총재 첨부

노드가 두 개인 스레드 네트워크는 그다지 재미있지 않습니다. FTD 총재를 다시 온라인 상태로 전환해 보겠습니다.

FTD Commissioner에서 스레드를 다시 시작합니다.

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

> ifconfig up
Done
> thread start
Done

2분 내에 'Codelab' 네트워크에 최종 기기로 자동 재연결한 후 라우터로 승격합니다.

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

> state
router
Done

FTD Joiner에서 라우터와 하위 표를 확인하여 다음을 확인합니다.

## 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

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

1일 문제해결

서로 다른 터미널 또는 화면 창에서 여러 기기로 스레드 네트워크를 관리하는 작업은 복잡할 수 있습니다. 문제가 발생하면 네트워크 또는 작업공간의 상태를 '재설정'하려면 이 도움말을 참고하세요.

Screen

설정이 너무 많아진 경우 (화면 창 또는 화면 안에 있는 화면이 너무 많음) 존재하지 않을 때까지 Ctrl+a → k를 눌러 화면 창을 계속 종료합니다.screen -ls 명령줄 출력에No Sockets found 에서 확인할 수 있습니다. 그런 다음 기기별로 화면 창을 다시 만듭니다. 화면이 멈춘 경우에도 기기 상태가 유지됩니다.

스레드 노드

이 Codelab에서 설명한 스레드 스레드 토폴로지가 아닌 다른 이유로 인해 스레드가 연결 해제된 경우 (예: Linux 머신의 전원을 끄는 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

12. 멀티캐스트 사용

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

IPv6 주소

범위

배송 완료

ff02::1

링크-로컬

모든 FTD 및 MED

ff02::2

링크-로컬

모든 FTD 및 경계 라우터

ff03::1

메시 로컬

모든 FTD 및 MED

ff03::2

메시 로컬

모든 FTD 및 경계 라우터

이 Codelab에서는 테두리 라우터를 사용하지 않으므로 FTD 및 MED 멀티캐스트 주소 두 개에 중점을 둡니다.

링크-로컬 범위는 단일 라디오 전송 또는 단일 '홉'으로 연결 가능한 모든 스레드 인터페이스로 구성됩니다. 네트워크 토폴로지는 ff02::1 멀티캐스트 주소에 대한 핑에 응답하는 기기를 지정합니다.

FTD 총재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

네트워크에는 2개의 다른 기기 (FTD 가입자 및 RCP 연결자)가 있지만 FTD 위원은 FTD 참여자의 링크-로컬 주소 (LLA)로부터 하나의 응답만 받았습니다. 즉, 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 조인자의 LLA입니다.

otcodelab_top02C_02_LL02.png

이는 FTD 조이너가 FTD 감독관과 RCP 연결자 모두에 직접 연결되어 Google 토폴로지를 확인합니다.

메시 로컬

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

FTD 총재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 커미셔너가 2개의 응답을 받았습니다. 하나는 FTD 참여자의 라우팅 로케이터 (RLOC, 끝자리가 b800)이고, 또 하나는 RCP 참여자의 Mesh-Local EID (ML-EID, 끝자리가 d55f)입니다. 메시 로컬 범위는 전체 스레드 네트워크를 구성하기 때문입니다. 기기의 네트워크 위치에 관계없이 ff03::1 주소를 구독하게 됩니다.

otcodelab_top02C_02_ML.png

FTD Joiner에서 ff03::1를 핑하여 동일한 동작을 확인합니다.

## 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

두 핑 출력에서 RCP 연결자의 응답 시간을 확인합니다. RCP 회원사는 FTD 회원 (23ms)에 도달하기보다 FTD 위원회 (68ms)에 도달하는 데 훨씬 더 오래 걸렸습니다. 이는 FTD 회원용의 1홉에 비해 FTD 감독자에 도달하려면 2홉이 있어야 하기 때문입니다.

메시 로컬 멀티캐스트 핑은 RCP 연결자가 아닌 두 FTD에 대해서만 RLOC로 응답한 것을 알 수도 있습니다. 이는 FTD가 네트워크 내의 라우터이고 RCP가 최종 기기이기 때문입니다.

RCP 조인자 상태를 확인하여 다음을 확인합니다.

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

> state
child

13. UDP를 사용하여 메시지 보내기

OpenThread에서 제공하는 애플리케이션 서비스 중 하나는 전송 계층 프로토콜인 UDP (사용자 데이터그램 프로토콜)입니다. OpenThread에 빌드된 애플리케이션은 UDP API를 사용하여 스레드 네트워크의 노드 간 또는 외부 네트워크 (스레드 네트워크에 경계 라우터가 있는 경우 인터넷 등)의 다른 기기로 메시지를 전달할 수 있습니다.

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

FTD Joiner의 Mesh-Local 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 Commissioner로 전환하고 UDP를 시작한 다음 ML-EID를 사용하여 FTD Joiner에 설정한 소켓에 연결합니다.

## 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

14. 축하합니다.

실제 스레드 네트워크를 만들었습니다.

b915c433e7027cc7.png

학습 내용:

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

다음 단계

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

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

추가 자료

Openthread.ioGitHub에서 다음을 포함한 다양한 OpenThread 리소스를 확인하세요.

참조: