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를 사용하여 스레드 노드 간에 메시지 전달
필요한 항목
하드웨어:
소프트웨어:
- ESP-IDF.
- ESP-THREAD-BR이 있어야 합니다.
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를 통해 연결자 기능을 사용 설정합니다.
$ 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 >
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 >
이제 아래와 같은 토폴로지를 사용하는 스레드 네트워크가 만들어졌습니다.
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 보드를 사용하여 물리적 스레드 네트워크를 만들었습니다.
이제 다음과 같은 내용을 알게 되었습니다.
- OpenThread CLI 바이너리를 빌드하고 ESP 보드에 플래시
- ESP 스레드 보더 라우터 보드에 플래시 보더 라우터 빌드
- ESP Monitor 및 OpenThread CLI를 사용하여 스레드 노드 수동 관리
- 스레드 보더 라우터에서 스레드 네트워크 형성
- 스레드 네트워크에 대한 기기 커미셔닝 보호
- 스레드 노드 간에 IPv6 주소를 핑합니다.
- UDP를 사용하여 스레드 노드 간에 메시지 전달
추가 자료
다음을 포함한 다양한 OpenThread 리소스는 openthread.io 및 GitHub를 확인하세요.
- 지원되는 플랫폼 — OpenThread를 지원하는 모든 플랫폼 살펴보기
- OpenThread 빌드 — OpenThread 빌드 및 구성에 관한 세부정보
- Thread Primer — 이 Codelab에서 다루는 모든 Thread 개념을 다룹니다.
참조: