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

1. 소개

26b7f4f6b3ea0700.png

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

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

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

4806d16a8c137c6d.jpeg

배울 내용

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

필요한 것

하드웨어:

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

소프트웨어:

  • GNU 툴체인
  • Nordic nRF5x 명령줄 도구
  • Segger J-링크 소프트웨어
  • 오픈스레드
  • 힘내

2. 시작하기

OpenThread 시뮬레이션

시작하기 전에, 당신은을 통해 실행할 수 있습니다 OpenThread 시뮬레이션 코드 랩 의 기본 스레드 개념과 OpenThread CLI에 익숙 얻을.

직렬 포트 터미널

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

리눅스 머신

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

Nordic Semiconductor nRF52840 보드

이 코드 랩은 세 가지 사용 nRF52840 PDK 보드 .

a6693da3ce213856.png

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

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

컴퓨터에 적합한 패키지를 다운로드하여 적절한 위치에 설치합니다. 리눅스입니다 /opt/SEGGER/JLink .

nRF5x 명령줄 도구 설치

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

nRF5x 명령줄 도구 다운로드

루트 폴더에 압축을 푼 패키지를 놓고 ~/

ARM GNU 툴체인 설치

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

ARM GNU 툴체인 휴대용 아카이브 다운로드

우리는 추출 된 아카이브에 배치하는 것이 좋습니다 /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ 리눅스 시스템에서. 아카이브의의 지시에 따라 readme.txt 설치 지침에 대한 파일을.

설치 화면(선택 사항)

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

$ sudo apt-get install screen

3. 리포지토리 복제

오픈스레드

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 조이너 설정

빌드 및 플래시

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

이전 실행하여 첫 번째 빌드의 항상 REPO를 청소 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

USB 케이블을 nRF52840 보드의 외부 전원 핀 옆에 있는 Micro-USB 디버그 포트에 연결한 다음 Linux 시스템에 연결합니다. VDD에 nRF52840 보드의 NRF 전원 스위치를 설정합니다. 제대로 연결되면, LED5이 켜져 있습니다.

20a3b4b480356447.png

이 리눅스 시스템에 연결된 1 기판 인 경우에는 시리얼 포트, 그것은 표시 /dev/ttyACM0 (모든 nRF52840 보드 사용 ttyACM 직렬 포트 식별자).

$ ls /dev/ttyACM*
/dev/ttyACM0

RCP에 사용되는 nRF52840 보드의 일련 번호를 확인하십시오.

c00d519ebec7e5f0.jpeg

nRFx 명령줄 도구의 위치로 이동하고 보드의 일련 번호를 사용하여 OpenThread RCP 16진수 파일을 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의 사용을 가능하게하기 때문에, 당신은 RCP 호스트 (리눅스 시스템)와 통신 할 nRF52840 보드에 NRF의 USB 포트를 사용해야합니다.

의 디버그 포트에서 USB 케이블의 마이크로 USB 끝을 분리 한 후 옆에있는 RESET 버튼에 마이크로 USB NRF의 USB 포트에 다시 연결, nRF52840 보드를 내 보였다. USB에 NRF 전원 스위치를 설정합니다.

46e7b670d2464842.png

OpenThread 데몬 시작

RCP 설계에서 OpenThread Daemon을 사용하여 Thread 장치와 통신하고 관리합니다. 시작 ot-daemon-v 는 로그 출력하고 실행되고 있는지 확인을 볼 수 있도록 플래그 자세한 정보를 :

$ 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 다른 시뮬레이션 스레드 장치와 같은 방식으로 노드를.

제 2 단자 창의 시작 ot-ctl :

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

체크 state 는 시작 노드 2합니다 (RCP 노드)의 ot-daemon :

> state
disabled
Done

5. FTD 설정

이 Codelab에서 사용되는 다른 두 개의 스레드 노드는 표준 SoC(시스템 온 칩) 설계의 FTD(전체 스레드 장치)입니다. 그들은 사용하지 않는 wpantund , 사용자는 수동으로 OpenThread CLI로 관리합니다.

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

빌드 및 플래시

커미셔너 및 조이너 역할이 활성화된 상태에서 nRF52840 플랫폼에 대한 OpenThread FTD 예제를 빌드합니다.

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

OpenThread FTD(전체 스레드 장치) CLI 바이너리가 있는 디렉터리로 이동하여 16진수 형식으로 변환합니다.

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

USB 케이블을 nRF52840 보드의 외부 전원 핀 옆에 있는 Micro-USB 포트에 연결한 다음 Linux 시스템에 연결합니다. RCP는 여전히 리눅스 머신에 연결되어있는 경우,이 새로운 보드가 시리얼 포트로 나타나야 /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 --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

보드에 "커미셔너"라는 레이블을 지정합니다.

기본 USB에 연결

OpenThread FTD 빌드가 직렬 전송으로 네이티브 USB CDC ACM의 사용을 가능하게하기 때문에, 당신은 RCP 호스트 (리눅스 시스템)와 통신 할 nRF52840 보드에 NRF의 USB 포트를 사용해야합니다.

의 디버그 포트에서 USB 케이블의 마이크로 USB 끝을 분리 한 후 옆에있는 RESET 버튼에 마이크로 USB NRF의 USB 포트에 다시 연결, nRF52840 보드를 내 보였다. USB에 NRF 전원 스위치를 설정합니다.

46e7b670d2464842.png

빌드 확인

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

$ screen /dev/ttyACM1 115200

새로운 창에서 Enter 키를 눌러 키보드에 몇 번 OpenThread CLI를 불러옵니다 > 프롬프트. IPv6 인터페이스를 불러오고 주소를 확인합니다.

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

Ctrl+a 사용 →

d 다음 판 점멸 할 수있는 리눅스 단말 그래서에 FTD 위원 CLI 화면과 창으로부터 분리. 언제든지, 사용의 CLI를 다시 입력 screen -r 명령 줄에서. 가능한 화면의 목록을 보려면, 사용 screen -ls :

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

FTD 조이너 설정

기존의 사용, 세 번째 nRF52840 보드를 플래시 위의 과정을 반복 ot-cli-ftd.hex 빌드를.

이 세 번째 보드가 연결되어있는 경우 다른 두 노드가 리눅스 머신에 부착 된 경우, 직렬 포트로 표시한다 /dev/ttyACM2 :

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

보드에 "Joiner"라는 레이블을 지정하십시오.

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

$ screen -r

Ctrl+a로 화면 안에 새 창 만들기 →

c

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

$ screen /dev/ttyACM2 115200

이 새로운 창에서 Enter 키를 눌러 키보드에 몇 번 OpenThread CLI를 불러옵니다 > 프롬프트. IPv6 인터페이스를 불러오고 주소를 확인합니다.

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

지금 FTD 소목 CLI는 FTD 위원으로 화면의 동일한 인스턴스에 있는지, 당신은 Ctrl + A → 사용하여 전환 할 수 n .

Ctrl+a 사용 →

d 종료 화면으로 언제든지.

6. 터미널 창 설정

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

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

  1. ot-daemon 서비스 / 로그
  2. 를 통해 RCP 소목 ot-ctl
  3. OpenThread CLI를 통해 FTD 위원
  4. OpenThread CLI를 통해 FTD 소목

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

화면 사용

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

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

기본 화면 명령:

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

screen -r

화면 세션 나가기

Ctrl + A → d

Screen 세션 내에서 새 창 만들기

Ctrl + A → c

동일한 Screen 세션에서 창 간 전환

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 소목 ot-ctl , 그 서비스는이 같은 화면 인스턴스 내에서 시작해야합니다. 이렇게, 정지하려면 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 화면 빠른 참조 .

7. 스레드 네트워크 생성

이제 모든 터미널 창과 화면이 구성되었으므로 스레드 네트워크를 생성해 보겠습니다. FTD 위원에서 새 운영 데이터 집합을 생성하고 활성 하나를 커밋합니다. Operational Dataset은 생성 중인 스레드 네트워크에 대한 구성입니다.

## 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" 네트워크는 이제 다른 스레드 장치에서 스캔할 때 표시됩니다.

에서 ot-ctl RCP 소목에 :

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

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

FTD 소목에 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 Joiner를 추가해 보겠습니다. 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 Joiner에 네트워크 키(방금 FTD 커미셔너로부터 얻음)를 설정합니다.

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

데이터 세트를 확인하여 올바르게 설정되었는지 확인하십시오.

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

RCP Joiner가 "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

메쉬 로컬 IPv6 주소의 메이크 노트 ( fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f 여기가) 나중에 사용할 수 있습니다.

FTD 위원에 돌아 가기, 두 장치가 동일한 네트워크의 일부입니다 확인하는 라우터와 자식 테이블을 확인합니다. 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 소목에서 네트워크를 검색 :

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

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

0 제 j 열의 시운전 장치에 활성화되어 있지 않은 나사를 나타낸다.

이 다음 장치에서 시운전할 때 구체적으로 설명하고 FTD Joiner만 참여하도록 허용합니다. 아직도 FTD 소목에서 얻을 eui64 FTD 위원이 식별 할 수 있도록 :

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

> eui64
2f57d222545271f1
Done

FTD 위원에서 위원을 시작하고 지정 eui64 소목 자격 증명과 함께 가입 할 수있는 장치를. Joiner Credential은 장치별 암호입니다.

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

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

FTD 소목, 그리고 다시 검색으로 전환 :

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

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

에 의해 지시 된 바와 같이 1 제 j 열에서 스레드 시운전 이제 네트워크에서 활성이다. 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 위원으로 전환하고 세 개의 장치가 "코드 랩"네트워크에 존재 함을 확인하는 라우터와 자식 테이블을 확인 :

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

10. 작동 중인 스레드

이 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

(MAC = 확장 FTD 소목 e6cdd2d93249a243 ) 라우터에 자신을 승진시켰다. RLOC16이 다릅니다 ( b800 대신 0c02 ). RLOC16은 장치의 라우터 ID와 자식 ID를 기반으로 하기 때문입니다. 최종 장치에서 라우터로 전환할 때 라우터 ID와 자식 ID 값이 변경되고 RLOC16도 변경됩니다.

otcodelab_top01C.png

FTD 소목에 새로운 상태 및 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 위원에 돌아 가기는 FTD 소목 이제 자식 테이블 (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 위원에서 스레드 네트워크에서 제거 스레드를 종료 :

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

> thread stop
Done
> ifconfig down
Done

이분 내에서 FTD 소목는 새로운 스레드의 리더가된다. FTD Joiner의 상태 및 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 소목 장이 자식으로 FTD 소목에 첨부 몇 분을 기다려야 할 수도 있습니다. 상태와 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

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

11. 문제 해결

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

화면

혹시 구성 (너무 많은 화면 창 또는 화면 내 화면)에서 분실하는 경우, 없음 존재 때까지 Ctrl + A → K로 화면 창을 죽이고 계속 screen -ls 출력 명령 줄에 No Sockets found . 그런 다음 각 장치에 대한 화면 창을 다시 만듭니다. Screen이 종료된 경우에도 장치 상태가 유지됩니다.

스레드 노드

스레드의 네트워크 토폴로지로이 코드 랩에 설명되지 않은, 또는 노드가 어떤 이유로 (을 전원 리눅스 머신이 잠 갔다 아마도 때문에)에 대한 분리 경우, 스레드를 가지고 네트워크 자격 증명을 취소하고 만들기부터 다시 시작하는 것이 가장 좋습니다 스레드 네트워크 공정.

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 멀티 캐스트 주소를.

ff02::1 FTD 위원에서 :

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

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

네트워크에는 두 개의 다른 장치(FTD Joiner 및 RCP Joiner)가 있지만 FTD 커미셔너는 FTD Joiner의 LLA(링크-로컬 주소)로부터 하나의 응답만 받았습니다. 이는 FTD 조이너가 FTD 커미셔너가 단일 홉으로 도달할 수 있는 유일한 장치임을 의미합니다.

otcodelab_top02C_02_LL.png

이제 핑 ff02::1 FTD 소목에서 :

## 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 조이너 모두에 직접 연결되어 토폴로지를 확인한다는 것을 의미합니다.

메시 로컬

메시-로컬 범위는 동일한 스레드 네트워크 내에서 도달할 수 있는 모든 스레드 인터페이스로 구성됩니다. 하자가에 핑에 응답을 참조 ff03::1 멀티 캐스트 주소.

ff03::1 FTD 위원에서 :

## 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 목공 라우팅 로케이터에서 하나 (RLOC, 끝나는받은 b800 (끝나는 ML-EID)와 RCP 목공 메시 - 지역 EID에서 하나를 d55f ). 메쉬 로컬 범위가 전체 스레드 네트워크를 구성하기 때문입니다. 장치가 네트워크에, 그것이에 가입됩니다 상관없이 ff03::1 주소를 입력합니다.

otcodelab_top02C_02_ML.png

ff03::1 FTD 소목에서 같은 동작을 확인합니다 :

## 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 Joiner는 FTD Joiner(23ms)에 도달하는 것보다 FTD Commissioner(68ms)에 도달하는 데 훨씬 더 오래 걸렸습니다. FTD 조이너의 경우 하나의 홉에 비해 FTD 커미셔너에 도달하려면 두 개의 홉을 만들어야 하기 때문입니다.

또한 메시-로컬 멀티캐스트 핑이 RCP 조이너가 아닌 두 개의 FTD에 대해서만 RLOC로 응답했음을 알 수 있습니다. 이는 FTD가 네트워크 내의 라우터이고 RCP가 최종 장치이기 때문입니다.

확인하기 위해 RCP 소목의 상태를 확인합니다 :

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

> state
child

13. UDP로 메시지 보내기

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

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

FTD 소목의 메쉬-지역 EID 주소를 가져옵니다. Thread 네트워크 내 어디에서나 연결할 수 있기 때문에 이 주소를 사용하고 있습니다.

## 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 소목에서 UDP 메시지가 수신되었습니다!

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

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

14. 축하합니다!

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

b915c433e7027cc7.png

이제 알 수 있습니다.

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

다음 단계

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

  • 사용하여 MTD로 FTD 소목 보드를 재부팅 ot-cli-mtd 이진, 그것은 결코 리더가 될 수있는 라우터 또는 시도 자체를 업그레이드하지 관찰
  • 네트워크에 더 많은 장치를 추가하고(다른 플랫폼을 사용해 보십시오!) 멀티캐스트 주소에 대한 ping과 함께 라우터 및 자식 테이블을 사용하여 토폴로지를 스케치합니다.
  • 사용 pyspinel를 연락 사무소를 제어 할 수
  • 사용하여 국경 라우터에 NCP를 변환 OpenThread 국경 라우터 와 인터넷에 스레드 네트워크 연결

추가 읽기

확인 openthread.ioGitHub의를 OpenThread 자원을 포함하는 다양한 :

참조: