1. 소개
Google Nest팀에서 출시한 OpenThread는 커넥티드 홈용 제품 개발을 가속화하기 위해 설계된 Thread® 네트워킹 프로토콜을 오픈소스로 구현한 제품입니다. 스레드 사양은 가정 및 상업용 건물 애플리케이션을 위한 IPv6 기반의 안정적이고 안전한 저전력 무선 기기 간 통신 프로토콜을 정의합니다.
Espressif는 FreeRTOS 및 LwIP를 기반으로 OpenThread 스택을 포팅하여 개발자가 스레드 네트워크를 빠르게 빌드할 수 있도록 지원합니다. 관련 소스 코드는 GitHub에서 얻을 수 있습니다. 이와 동시에 Espressif는 RTOS를 기반으로 스레드 보더 라우터도 구현했습니다.
이 Codelab에서는 실제 하드웨어에서 OpenThread를 프로그래밍하고, 스레드 네트워크를 생성 및 관리하며, 노드 간에 메시지를 전달합니다.
학습할 내용
- OpenThread CLI 바이너리를 빌드하여 ESP 보드에 플래시합니다.
- 보더 라우터를 빌드하여 ESP 스레드 보더 라우터 보드에 플래시하는 중입니다.
- ESP Monitor 및 OpenThread CLI를 사용한 스레드 노드 수동 관리
- 스레드 보더 라우터에 스레드 네트워크 형성
- 스레드 네트워크에 대한 기기 커미셔닝 보안
- 스레드 노드 간에 IPv6 주소를 핑합니다.
- UDP를 사용하여 스레드 노드 간에 메시지 전달
필요한 항목
하드웨어:
소프트웨어:
2. 시작하기
- ESP-IDF 설치
ESP-IDF 프로그래밍 가이드에 따라 소프트웨어 개발 환경을 설치하세요.
- 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를 통해 Joiner 기능을 사용 설정합니다.
$ idf.py menuconfig
구성요소 구성 > OpenThread > Joiner를 사용 설정한 다음 빌드 및 플래시하세요.
$ idf.py -p <your-local-port> build flash monitor
ESP 스레드 보더 라우터 보드에서 ot-br 바이너리 파일을 빌드하고 플래시하려면 먼저 RCP 바이너리 파일을 빌드해야 합니다. 이 RCP 바이너리 파일은 ESP 스레드 보더 라우터 보드의 기기에 명시적으로 플래시할 필요가 없습니다. 이는 보더 라우터 바이너리 파일에 포함되며 첫 번째 부팅 시 (또는 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
구성요소 구성 > OpenThread > 커미셔너를 활성화한 다음 빌드 및 플래시하세요.
$ idf.py -p <your-local-port> build flash monitor
4. 스레드 보더 라우터에 스레드 네트워크 형성
이제 ESP 스레드 보더 라우터 보드 (BR 커미셔닝)에서 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. networkkey를 통해 스레드 네트워크에 연결
이 Codelab에서는 IEEE 802.15.4 모듈이 포함된 ESP 보드 2개가 BR 형식 네트워크에 연결할 준비가 되어 있습니다. 이 세션에서는 네트워크에 Board1을 추가합니다.
BR에서 네트워크키 가져오기:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
이 네트워크 키를 IEEE 802.15.4 모듈이 포함된 ESP 보드 1개 (Board1 Joiner) 1개로 설정합니다.
## 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
잠시 후 기기 상태를 확인하세요. 하위 계정이어야 합니다.
> 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 >
6. 안전한 커미셔닝을 통해 Thread 네트워크에 참여하기
이 세션에서는 보안 커미셔닝을 통해 네트워크에 Board2를 추가합니다.
브라질 감독관으로부터 PSKc 및 panid를 받습니다.
## 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 커미셔닝 실행자에서 위원장을 시작하고 Joiner Credential과 함께 참여할 수 있는 기기의 eui64
(예: J01NME
)를 지정합니다. Joiner Credential은 모든 대문자 영숫자 문자 (가독성을 위해 I, O, Q, Z를 제외한 0~9 및 A~Y)로 이루어진 기기별 문자열로, 길이는 6~32자입니다.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Board2 Joiner로 전환합니다. BR 감독관에게 방금 설정한 Joiner Credential을 사용하여 Joiner 역할을 시작합니다.
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
약 1분 이내에 인증에 성공했다는 확인 메시지가 표시됩니다.
## Board2 Joiner ## ---------------------- > Join success
그런 다음 BR 감독관이 구성한 Thread 네트워크를 시작하고 참여할 수 있습니다.
스레드 프로토콜 작업을 시작합니다.
> 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 >
이제 아래와 같은 토폴로지를 가진 스레드 네트워크가 표시됩니다.
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 커미셔너로부터 Board2 MLE-ID를 핑하려면 BR 커미셔너에서 다음 명령을 실행할 수 있습니다.
## 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 보드를 사용하여 물리적 스레드 네트워크를 만들었습니다.
이제 다음 내용을 알게 되었습니다.
- OpenThread CLI 바이너리를 빌드하여 ESP 보드에 플래시합니다.
- ESP 스레드 보더 라우터 보드에 플래시 보더 라우터 빌드
- ESP Monitor 및 OpenThread CLI를 사용한 스레드 노드 수동 관리
- 스레드 보더 라우터에 스레드 네트워크 형성
- 스레드 네트워크에 대한 기기 커미셔닝 보안
- 스레드 노드 간에 IPv6 주소를 핑합니다.
- UDP를 사용하여 스레드 노드 간에 메시지 전달
추가 자료
다음과 같은 다양한 OpenThread 리소스는 openthread.io 및 GitHub를 확인하세요.
- 지원되는 플랫폼 — OpenThread를 지원하는 모든 플랫폼을 알아보세요.
- OpenThread 빌드 — OpenThread 빌드 및 구성에 관한 추가 세부정보
- Thread Primer - 이 Codelab에서 다루는 모든 스레드 개념을 다룹니다.
참조: