1. 소개
스레드란 무엇인가요?
Thread는 기기 간 및 기기-클라우드 간 보안 통신을 지원하는 IP 기반 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 토폴로지 변경사항에 적응하여 단일 장애점을 방지할 수 있습니다.
OpenThread란 무엇인가요?
Google에서 출시한 OpenThread는 Thread®의 오픈소스 구현입니다.
OpenThread 보더 라우터란 무엇인가요?
Google에서 출시한 OpenThread Border Router (OTBR)는 스레드 보더 라우터의 오픈소스 구현입니다.
IPv6 멀티캐스트
스레드는 레임 로컬보다 범위가 큰 멀티캐스트 주소의 경우 이종 네트워크 (스레드 및 Wi-Fi/이더넷 네트워크 세그먼트)에서 멀티캐스트를 지원하는 일련의 기능을 정의합니다.
스레드 경계 라우터는 백본 라우터 (BBR) 데이터 세트를 등록하고 선택된 BBR 서비스는 멀티캐스트 수신/전송 전달을 담당하는 기본 백본 라우터 (PBBR)입니다.
Thread 기기는 주소가 리얼름 로컬보다 큰 경우 CoAP 메시지를 전송하여 멀티캐스트 주소를 PBBR (멀티캐스트 리스너 등록, 줄여서 MLR)에 등록합니다. PBBR은 외부 인터페이스에서 MLDv2를 사용하여 로컬 Thread 네트워크를 대신하여 리슨해야 하는 IPv6 멀티캐스트 그룹에 관해 더 광범위한 IPv6 LAN/WAN에 통신합니다. 또한 PBBR은 하나 이상의 스레드 기기에서 대상을 구독하는 경우에만 스레드 네트워크로 멀티캐스트 트래픽을 전달합니다.
Thread 최소 최종 기기의 경우 상위 기기가 멀티캐스트 주소를 집계하고 대신 MLR을 실행하도록 하거나 상위 기기가 Thread 1.1인 경우 자체적으로 등록할 수 있습니다.
자세한 내용은 스레드 사양을 참고하세요.
빌드할 항목
이 Codelab에서는 Thread 보더 라우터와 Thread 기기 2대를 설정한 다음 Thread 기기와 Wi-Fi 기기에서 멀티캐스트 기능을 사용 설정하고 확인합니다.
학습할 내용
- IPv6 멀티캐스트를 지원하는 nRF52840 펌웨어를 빌드하는 방법
- Thread 기기에서 IPv6 멀티캐스트 주소를 구독하는 방법
필요한 항목
- Thread RCP, OpenThread CLI를 빌드 및 플래시하고 IPv6 멀티캐스트를 테스트하기 위한 Linux 워크스테이션
- 스레드 보더 라우터용 Raspberry Pi
- Nordic Semiconductor nRF52840 USB 도구 2개 (RCP용 1개, 스레드 엔드 기기용 2개)
2. OTBR 설정
OTBR을 설정하는 가장 빠른 방법은 OTBR 설정 가이드를 따르는 것입니다.
OTBR 설정이 완료되면 ot-ctl
를 사용하여 OTBR이 몇 초 이내에 기본 백본 라우터가 되었는지 확인합니다.
> bbr state Primary Done > bbr BBR Primary: server16: 0xF800 seqno: 21 delay: 5 secs timeout: 3600 secs Done
3. 스레드 기기 빌드 및 플래시
멀티캐스트로 Thread CLI 애플리케이션을 빌드하고 두 개의 nRF52840 DK 보드를 플래시합니다.
nRF52840 DK 펌웨어 빌드
안내에 따라 프로젝트를 클론하고 nRF52840 펌웨어를 빌드합니다.
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_MLR=ON
설명된 대로 nRF52840 보드 및 OpenThread로 Thread 네트워크 빌드 Codelab을 계속 진행합니다. 최종 기기에 CLI 이미지가 플래시된 후 두 번째 노드를 Thread 네트워크에 연결에 따라 Thread 기기를 Thread 네트워크에 추가합니다. 두 번째 Thread 최종 기기에도 반복합니다.
4. IPv6 멀티캐스트 주소 구독
nRF52840 최종 기기 1에서 ff05::abcd를 구독합니다.
> ipmaddr add ff05::abcd Done
ff05::abcd
가 성공적으로 구독되었는지 확인합니다.
> ipmaddr ff05:0:0:0:0:0:0:abcd <--- ff05::abcd subscribed ff33:40:fdde:ad00:beef:0:0:1 ff32:40:fdde:ad00:beef:0:0:1 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.
멀티캐스트 구독이 포함된 최종 네트워크 토폴로지는 다음과 같습니다.
이제 Thread 네트워크의 nRF52840 최종 기기 1과 Wi-Fi 네트워크의 노트북에서 모두 IPv6 멀티캐스트 주소를 구독했으므로 다음 섹션에서 양방향 IPv6 멀티캐스트 도달 가능성을 확인합니다.
5. 수신 IPv6 멀티캐스트 확인
이제 Wi-Fi 네트워크의 IPv6 멀티캐스트 주소 ff05::abcd
를 사용하여 Thread 네트워크의 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이 Wi-Fi 네트워크에서 Thread 네트워크로 IPv6 핑 요청 멀티캐스트 패킷을 전달할 수 있음을 보여줍니다.
6. 발신 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 핑 응답 멀티캐스트 패키지를 Thread 네트워크에서 Wi-Fi 네트워크로 전달할 수 있음을 보여줍니다.
7. 축하합니다
축하합니다. Thread Border Router를 설정하고 양방향 IPv6 멀티캐스트를 확인했습니다.
OpenThread에 관한 자세한 내용은 openthread.io를 참고하세요.
참조 문서: