ESP32H2 및 ESP 스레드 보더 라우터 보드로 스레드 네트워크 빌드

1. 소개

26b7f4f6b3ea0700.png

Google Nest팀에서 출시한 OpenThread는 커넥티드 홈용 제품 개발을 가속화하기 위해 설계된 Thread® 네트워킹 프로토콜의 오픈소스 구현입니다. 스레드 사양은 가정 및 상업용 건물 애플리케이션을 위한 IPv6 기반의 안정적이고 안전하며 저전력 무선 기기와 기기 간 통신 프로토콜을 정의합니다.

Espressif는 FreeRTOS 및 LwIP를 기반으로 OpenThread 스택을 포팅하여 개발자가 스레드 네트워크를 빠르게 빌드할 수 있도록 합니다. 관련 소스 코드는 GitHub에서 얻을 수 있습니다. 이와 동시에 Espressif는 RTOS를 기반으로 스레드 보더 라우터를 구현했습니다.

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

Espressif_hardware_setup.jpg

학습할 내용

  • OpenThread CLI 바이너리를 빌드하고 ESP 보드에 플래시
  • ESP 스레드 보더 라우터 보드에 보더 라우터 빌드 및 플래시
  • ESP Monitor 및 OpenThread CLI를 사용하여 스레드 노드 수동 관리
  • 스레드 보더 라우터에서 스레드 네트워크 형성
  • 스레드 네트워크에 대한 기기 커미셔닝 보호
  • 스레드 노드 간에 IPv6 주소를 핑합니다.
  • UDP를 사용하여 스레드 노드 간에 메시지 전달

필요한 항목

하드웨어:

  • IEEE 802.15.4 모듈이 포함된 ESP 보드 2개
  • ESP 스레드 보더 라우터 보드 1개

소프트웨어:

2. 시작하기

  1. ESP-IDF 설치

ESP-IDF 프로그래밍 가이드에 따라 소프트웨어 개발 환경을 설치하세요.

  1. ESP 스레드 보더 라우터 SDK를 클론합니다.

ESP-THREAD-BR은 공식 ESP 스레드 보더 라우터 SDK입니다. 스레드 보더 라우터를 빌드하기 위한 모든 기본적인 네트워크 기능을 지원하며 빠른 제품화를 위해 풍부한 제품 수준 기능을 통합합니다.

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

3. 빌드 및 플래시

IEEE 802.15.4 모듈로 ESP 보드에서 ot-cli-ftd 바이너리 파일을 빌드하고 플래시하는 방법에 대한 자세한 내용은 ESP-IDF 예 ot_cli를 참조하세요.

$ cd <your-idf-path>/examples/openthread/ot_cli
$ idf.py set-target <your-board-type>

Menuconfig를 통해 연결자 기능을 사용 설정합니다.

$ idf.py menuconfig

구성요소 config > OpenThread > 활성화를 선택한 다음 빌드 및 플래시

$ idf.py -p <your-local-port> build flash monitor

ESP 스레드 보더 라우터 보드에서 ot-br 바이너리 파일을 빌드하고 플래시하려면 먼저 RCP 바이너리 파일을 빌드해야 합니다. 이 RCP 바이너리 파일은 ESP 스레드 보더 라우터 보드의 기기에 명시적으로 플래시할 필요가 없습니다. Border Router 바이너리 파일에 포함되며 처음 부팅하거나 RCP 펌웨어가 변경된 경우 ESP32-H2 칩에 플래시됩니다. 자세한 내용은 ESP 스레드 BR 문서를 참조하세요.

$ cd <your-idf-path>/examples/openthread/ot_rcp
$ idf.py set-target esp32h2
$ idf.py build
$ cd <your-esp-thread-br-path>/examples/basic_thread_border_router
$ idf.py set-target esp32s3

Menuconfig를 통해 커미셔너 기능을 사용 설정합니다.

$ idf.py menuconfig

구성요소 config > OpenThread > Enable Commissioner로 이동한 다음 빌드 및 플래시를 선택합니다.

$ idf.py -p <your-local-port> build flash monitor

4. 스레드 보더 라우터에서 스레드 네트워크 구성

이제 ESP Thread Border Router Board (BR Commissioner)에서 OpenThread 명령줄을 사용하여 스레드 네트워크를 형성할 수 있습니다.

## BR Commissioner ##
----------------------
> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 21
Channel Mask: 0x07fff800
Ext PAN ID: 151975d11bea97b5
Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64
Network Key: 731ab6a60a64a0a0b14b259b86b2be01
Network Name: OpenThread-1444
PAN ID: 0x1444
PSKc: 54e7f18d2575014da94db09df29c5df0
Security Policy: 672 onrc 0
Done

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

> dataset commit active
Done

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

> ifconfig up
I (59329) OPENTHREAD: Platform UDP bound to port 49153
Done
I (59329) OT_STATE: netif up

스레드 프로토콜 작업을 시작합니다.

> thread start
I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
Done
> I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11
I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00
I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader
I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6
I (69099) OPENTHREAD: Platform UDP bound to port 49154

잠시 후 기기 상태를 확인합니다. 리더가 되어야 합니다.

> state
leader
Done
> 

5. 네트워크 키를 통해 스레드 네트워크에 연결

이 Codelab에서는 IEEE 802.15.4 모듈이 포함된 2개의 ESP 보드가 BR 형식의 네트워크에 조인할 준비가 되어 있습니다. 이 세션에서는 네트워크에 Board1을 추가합니다.

BR에서 네트워크 키를 가져옵니다.

## BR Commissioner ##
----------------------
> networkkey
731ab6a60a64a0a0b14b259b86b2be01
Done
> 

이 네트워크 키를 IEEE 802.15.4 모듈이 있는 하나의 ESP 보드 (Board1 연결자)에 설정합니다.

## Board1 Joiner ##
----------------------
> dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01
Done

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

> dataset commit active
Done

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

> ifconfig up
Done
I (20308) OT_STATE: netif up

스레드 프로토콜 작업을 시작합니다.

> thread start
I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
Done
> I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds
I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition 
I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444
I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444
I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled
I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition 
I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01
I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child

잠시 후 기기 상태를 확인합니다. Child여야 합니다.

> state
child
Done

역할을 라우터로 설정합니다.

> state router
Done
I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800
I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router
I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6
> 

esp_ot_tp_LR.jpg

6. 보안 커미셔닝을 통해 스레드 네트워크에 연결

이 세션에서는 보안 커미셔닝을 통해 네트워크에 Board2를 추가합니다.

브라질 커미셔너의 PSKc와 패닉을 확인하세요.

## BR Commissioner ##
----------------------
> pskc
54e7f18d2575014da94db09df29c5df0
Done
> panid
0x1444
Done

Board2에 네트워크 정보를 구성합니다.

## Board2 Joiner ##
----------------------
> dataset pskc 54e7f18d2575014da94db09df29c5df0
Done
> dataset panid 0x1444
Done

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

## Board2 Joiner ##
----------------------
> dataset commit active 
Done

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

## Board2 Joiner ##
----------------------
> ifconfig up
Done
I (29146) OT_STATE: netif up

Board2에서 eui64를 가져옵니다.

## Board2 Joiner ##
----------------------
> eui64
4831b7fffec02be1
Done

BR Commissioner에서 커미셔너를 시작하고 가입자 사용자 인증 정보와 함께 참여할 수 있는 기기의 eui64를 지정합니다(예: J01NME). Joiner Credential은 모든 대문자 영숫자 문자 (0~9 및 A~Y, 가독성을 위해 I, O, Q, Z 제외)로 구성된 기기별 문자열이며 길이는 6~32자입니다.

## BR Commissioner ##
----------------------
> commissioner start
Commissioner: petitioning
Done
Commissioner: active
> commissioner joiner add 4831b7fffec02be1 J01NME
Done

Board2 Joiner로 전환합니다. BR 커미셔너에서 설정한 조인자 사용자 인증 정보로 연결자 역할을 시작합니다.

## Board2 Joiner ##
----------------------
> ifconfig up
Done
> joiner start J01NME
Done

약 1분 이내에 인증이 완료되었다는 확인 메시지가 표시됩니다.

## Board2 Joiner ##
----------------------
>
Join success

그런 다음 BR 커미셔널에서 구성한 스레드 네트워크를 시작하고 참여할 수 있습니다.

스레드 프로토콜 작업을 시작합니다.

> thread start
I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached
Done
> I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801
I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child

역할을 라우터로 설정합니다.

> state router
Done
I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400
I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router
I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6
> 

이제 아래와 같은 토폴로지를 사용하는 스레드 네트워크가 만들어졌습니다.

esp_ot_tp_LRR.jpg

7. 스레드 노드 간 IPv6 주소 핑

ping 명령어를 사용하여 두 보드 간에 통신할 수 있습니다. ipaddr 명령어를 사용하여 각 보드의 IPv6 주소를 출력합니다.

## BR Commissioner ##
----------------------
> ipaddr
fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00          # Leader Anycast Locator (ALOC)
fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00          # Routing Locator (RLOC)
fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0     # Mesh-Local EID (ML-EID) 
fe80:0:0:0:687c:7248:cc14:9c4d              # Link-Local Address (LLA)
Done
> 
## Board1 Joiner ##
----------------------
> ipaddr
fd6a:b54b:d6a3:b05a:0:ff:fe00:2800          # Routing Locator (RLOC)
fd6a:b54b:d6a3:b05a:e461:db08:c833:1248     # Mesh-Local EID (ML-EID)
fe80:0:0:0:18ac:df04:4671:6a45              # Link-Local Address (LLA)
Done
## Board2 Joiner ##
----------------------
> ipaddr
fd6a:b54b:d6a3:b05a:0:ff:fe00:4400          # Routing Locator (RLOC)
fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc     # Mesh-Local EID (ML-EID)
fe80:0:0:0:a8cc:1483:f696:91a2              # Link-Local Address (LLA)
Done

예를 들어 BR Commissioner에서 Board2 MLE-ID를 핑하려면 BR Commissioner에서 다음 명령어를 실행합니다.

## BR Commissioner ##
----------------------
> ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc
16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms.
Done

8. UDP를 사용하여 스레드 노드 간에 메시지 전달

이 세션에서는 두 스레드 기기 간에 메시지를 전송하는 방법을 알아봅니다. 예를 들어 udp를 열고 포트 20617에서 바인딩한 후 BR의 모든 주소를 리슨합니다.

## BR Commissioner ##
----------------------
> udp open
Done
> udp bind :: 20617
I (1298739) OPENTHREAD: Platform UDP bound to port 20617
Done

그런 다음 Board1에서 BR MLE-ID 주소와 포트 20617으로 메시지를 전송합니다.

## Board1 Joiner ##
----------------------
> udp open
Done
> udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP

BR에서 수신된 메시지를 확인할 수 있습니다.

## BR Commissioner ##
----------------------
3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP

9. 축하합니다.

ESP 보드를 사용하여 물리적 스레드 네트워크를 만들었습니다.

esp_ot_final_topology.jpg

이제 다음과 같은 내용을 알게 되었습니다.

  • OpenThread CLI 바이너리를 빌드하고 ESP 보드에 플래시
  • ESP 스레드 보더 라우터 보드에 플래시 보더 라우터 빌드
  • ESP Monitor 및 OpenThread CLI를 사용하여 스레드 노드 수동 관리
  • 스레드 보더 라우터에서 스레드 네트워크 형성
  • 스레드 네트워크에 대한 기기 커미셔닝 보호
  • 스레드 노드 간에 IPv6 주소를 핑합니다.
  • UDP를 사용하여 스레드 노드 간에 메시지 전달

추가 자료

다음을 포함한 다양한 OpenThread 리소스는 openthread.ioGitHub를 확인하세요.

참조: