1. 소개
스레드란 무엇인가요?
스레드는 기기 간 및 기기 간 안전한 통신을 가능하게 하는 IP 기반의 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 토폴로지 변화에 적응하여 단일 포인트 장애를 방지할 수 있습니다.
OpenThread란 무엇인가요?
Google에서 출시한 OpenThread는 Thread®의 오픈소스 구현입니다.
OpenThread 보더 라우터란 무엇인가요?
Google에서 출시한 OTBR (OpenThread Border Router)은 스레드 보더 라우터를 오픈소스로 구현한 결과물입니다.
스레드 1.2 멀티캐스트
스레드 1.2는 로컬 영역보다 범위가 큰 멀티캐스트 주소에 대해 이종 네트워크 (스레드 및 Wi-Fi/이더넷 네트워크 세그먼트)에서 멀티캐스트를 지원하는 일련의 기능을 정의합니다.
스레드 1.2 보더 라우터가 BBR (백본 라우터) 데이터 세트를 등록하며, 선택한 BBR 서비스는 PBBR (Primary Backbone Router)이며, 이는 순방향 멀티캐스트 인바운드/아웃바운드를 담당합니다.
스레드 1.2 기기는 주소가 영역 로컬보다 큰 경우 멀티캐스트 주소를 PBBR (멀티캐스트 리스너 등록, MLR)에 등록하라는 CoAP 메시지를 보냅니다. PBBR은 외부 인터페이스에 MLDv2를 사용하여 로컬 스레드 네트워크를 대신하여 수신해야 하는 IPv6 멀티캐스트 그룹에 대해 더 넓은 IPv6 LAN/WAN과 통신합니다. 또한 PBBR은 대상이 하나 이상의 스레드 기기에서 구독하는 경우에만 스레드 네트워크로 멀티캐스트 트래픽을 전달합니다.
스레드 1.2 최소 최종 기기의 경우 상위 요소에 의존하여 멀티캐스트 주소를 집계하고 대신 MLR을 수행하거나 상위 요소가 스레드 1.1인 경우 스스로 등록할 수 있습니다.
자세한 내용은 스레드 1.2 사양 섹션 5.24 영역-로컬 범위보다 큰 멀티캐스트 포워딩을 참고하세요.
빌드할 항목
이 Codelab에서는 스레드 보더 라우터와 두 개의 스레드 기기를 설정한 후 스레드 기기와 Wi-Fi 기기에서 멀티캐스트 기능을 사용 설정하고 확인합니다.
학습할 내용
- 스레드 1.2 멀티캐스트 기능으로 nRF52840 펌웨어를 빌드하는 방법
- 스레드 기기에서 IPv6 멀티캐스트 주소를 구독하는 방법
필요한 항목
- Raspberry Pi 3/4 기기 및 최소 8GB 용량이 있는 SD 카드
- Nordic Semiconductor nRF52840 DK 보드 3개
- 라우터에 IPv6 라우터 공지 보호가 사용 설정되지 않은 Wi-Fi AP
- Python3가 설치된 Linux/macOS 노트북 (Raspberry Pi도 작동)
2. OTBR 설정
스레드 보더 라우터 - 양방향 IPv6 연결 및 DNS 기반 서비스 검색 Codelab에 따라 Raspberry Pi에서 스레드 보더 라우터를 설정합니다.
완료되면 Raspberry Pi가 작동하는 스레드 네트워크를 생성하고 Wi-Fi 네트워크에 연결해야 합니다.
OTBR이 몇 초 이내에 기본 백본 라우터가 됩니다.
$ sudo ot-ctl bbr state Primary Done $ sudo ot-ctl bbr BBR Primary: server16: 0xD800 seqno: 23 delay: 1200 secs timeout: 3600 secs Done
3. 빌드 스레드 기기 및 플래시
멀티캐스트가 있는 Thread 1.2 CLI 애플리케이션을 빌드하고 2개의 nRF52840 DK 보드를 플래시합니다.
nRF52840 DK 펌웨어 빌드
안내에 따라 프로젝트를 클론하고 nRF52840 펌웨어를 빌드합니다.
$ mkdir -p ~/src $ cd ~/src $ git clone --recurse-submodules --depth 1 https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx/ $ script/build nrf52840 USB_trans -DOT_MLR=ON -DOT_THREAD_VERSION=1.2 $ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex
ot-cli-ftd.hex
에서 성공적으로 빌드된 HEX 펌웨어를 찾을 수 있습니다.
플래시 nRF52840 DK 펌웨어
nRF 명령줄 도구의 일부인 nrfjprog
를 사용하여 펌웨어를 nRF52840 DK에 플래시합니다.
$ nrfjprog -f nrf52 --chiperase --program ot-cli-ftd.hex --reset
4. 스레드 네트워크에 스레드 기기 연결하기
OTBR은 이전 단계에서 스레드 네트워크를 생성했습니다. 이제 nRF52840 DK를 스레드 네트워크에 추가할 수 있습니다.
OTBR에서 원시 활성 데이터 세트 가져오기:
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
nRF52840 DK 보드에 연결합니다.
$ screen /dev/ttyACM0 115200
nRF52840 DK의 활성 데이터 세트를 구성합니다.
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
스레드 스택을 시작하고 몇 초 동안 기다렸다가 기기가 성공적으로 연결되었는지 확인합니다.
> ifconfig up Done > thread start Done > state child
위 단계를 반복하여 다른 nRF52840 DK 보드를 스레드 네트워크에 연결합니다.
이제 스레드 기기 3개(OTBR와 nRF52840 DK 보드 2개)로 스레드 네트워크를 성공적으로 설정했습니다.
5. Wi-Fi 네트워크 설정
OTBR과 노트북의 Wi-Fi 네트워크를 설정하여 동일한 Wi-Fi AP에 연결합니다.
raspi-config를 사용하여 Raspberry Pi OTBR에서 Wi-Fi SSID와 암호를 설정할 수 있습니다.
최종 네트워크 토폴로지는 다음과 같습니다.
6. IPv6 멀티캐스트 주소 구독
nRF52840 최종 기기 1에서 ff05::abcd 구독:
> ipmaddr add ff05::abcd Done
ff05::abcd
의 구독이 완료되었는지 확인합니다.
> ipmaddr ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff02:0:0:0:0:0:0:2 ff03:0:0:0:0:0:0:2 ff02:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:1 ff03:0:0:0:0:0:0:fc Done
노트북에서 ff05::abcd 구독하기
노트북에서 멀티캐스트 주소를 구독하려면 Python 스크립트 subscribe6.py
가 필요합니다.
아래 코드를 복사하여 subscribe6.py
로 저장합니다.
import ctypes
import ctypes.util
import socket
import struct
import sys
libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')
subscribe6.py
를 실행하여 Wi-Fi 네트워크 인터페이스 (예: wlan0)에서 ff05::abcd
를 구독합니다.
$ sudo python3 subscribe6.py wlan0 ff05::abcd Subscribed ff05::abcd on interface wlan0. Press ENTER to quit.
멀티캐스트 구독을 사용하는 최종 네트워크 토폴로지는 아래와 같습니다.
이제 스레드 네트워크의 nRF52840 최종 기기 1과 Wi-Fi 네트워크의 노트북 모두에서 IPv6 멀티캐스트 주소를 구독했으므로 다음 섹션에서 양방향 IPv6 멀티캐스트 연결 가능성을 확인해 보겠습니다.
7. 인바운드 IPv6 멀티캐스트 확인
이제 Wi-Fi 네트워크의 IPv6 멀티캐스트 주소 ff05::abcd
를 사용하여 스레드 네트워크의 nRF52840 최종 기기 1과 노트북에 모두 도달할 수 있습니다.
Wi-Fi 인터페이스를 통해 OTBR에서 ff05::abcd를 핑합니다.
$ ping -6 -b -t 5 -I wlan0 ff05::abcd PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!) 64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms 64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!) # If using MacOS, use this command. The interface is typically not "wlan0" for Mac. $ ping6 -h 5 -I wlan0 ff05::abcd
nRF52840 최종 기기 1과 노트북에서 모두 ff05::abcd
를 구독했으므로 OTBR이 두 개의 핑 응답을 받을 수 있음을 알 수 있습니다. 이는 OTBR이 IPv6 핑 요청 멀티캐스트 패킷을 Wi-Fi 네트워크에서 스레드 네트워크로 전달할 수 있음을 보여줍니다.
8. 아웃바운드 IPv6 멀티캐스트 확인
nRF52840 최종 기기 2에서 ff05::abcd 핑:
> ping ff05::abcd 100 10 1 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms 108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms 108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms
nRF52840 최종 기기 2는 nRF52840 최종 기기 1과 노트북에서 모두 핑 응답을 수신할 수 있습니다. 이는 OTBR이 IPv6 핑 답장 멀티캐스트 패키지를 스레드 네트워크에서 Wi-Fi 네트워크로 전달할 수 있음을 보여줍니다.
9. 축하합니다
수고하셨습니다. 스레드 보더 라우터를 성공적으로 설정하고 양방향 IPv6 멀티캐스트를 확인했습니다.
OpenThread에 관한 자세한 내용은 openthread.io를 참고하세요.
참조 문서: