1. 소개
스레드란 무엇인가요?
스레드는 안전한 기기 간 통신과 기기와 클라우드 간 통신을 가능하게 하는 IP 기반 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 단일 지점 오류를 방지하기 위해 토폴로지 변경사항에 맞게 조정할 수 있습니다.
OpenThread란 무엇인가요?
Google에서 출시한 OpenThread는 Thread®의 오픈소스 구현입니다.
OpenThread Border Router란 무엇인가요?
Google에서 출시한 OpenThread Border Router (OTBR)는 스레드 경계 라우터의 오픈소스 구현입니다.
스레드 1.2 멀티캐스트
스레드 1.2는 local름 로컬보다 큰 범위를 가진 멀티캐스트 주소에 이기종 네트워크 (스레드 및 Wi-Fi/이더넷 네트워크 세그먼트) 간 멀티캐스트를 지원하는 일련의 기능을 정의합니다.
Thread 1.2 Border Router는 백본 라우터 (BBR) 데이터 세트를 등록하며 선택한 BBR 서비스는 멀티캐스트 인바운드/아웃바운드를 담당하는 기본 백본 라우터 (PBBR)입니다.
스레드 스레드 1.2 기기는 주소가 로컬 영역보다 큰 경우 PBBR (멀티캐스트 리스너 등록, 줄여서 MLR)에 멀티캐스트 주소를 등록하기 위해 CoAP 메시지를 보냅니다. PBBR은 외부 인터페이스에서 MLDv2를 사용하여 로컬 스레드 네트워크를 대신하여 수신 대기해야 하는 IPv6 멀티캐스트 그룹에 대해 더 많은 IPv6 LAN/WAN에 통신합니다. 또한 PBBR은 대상이 하나 이상의 스레드 기기에서 구독되는 경우에만 스레드 네트워크로 멀티캐스트 트래픽을 전달합니다.
스레드가 1.2 최소형 최종 기기의 경우 부모는 이 기기를 사용하여 멀티캐스트 주소를 집계하고 고객을 대신하여 MLR을 수행하거나, 스레드가 1.1인 경우 자체적으로 등록할 수 있습니다.
자세한 내용은 Thread-Local Scope보다 큰 스레드 1.2 사양 섹션 5.24 멀티캐스트 전달을 참조하세요.
빌드할 항목
이 Codelab에서는 스레드 경계 라우터와 스레드 기기 두 개를 설정한 다음 스레드 기기 및 Wi-Fi 기기에서 멀티캐스트 기능을 사용 설정하고 확인합니다.
학습할 내용
- 스레드 1.2 멀티캐스트 기능으로 nRF52840 펌웨어를 빌드하는 방법
- 스레드 기기에서 IPv6 멀티캐스트 주소를 구독하는 방법
필요한 항목
- Raspberry Pi 3/4 기기 및 최소 8GB 이상의 SD 카드.
- 북유럽 반도체 nRF52840 DK 보드 3개
- 라우터에서 IPv6 Router Advertisement Guard가 사용 설정되지 않은 Wi-Fi AP.
- Python3가 설치된 Linux/macOS 노트북 (Raspberry Pi도 작동함)
2 OTBR 설정
스레드 경계 라우터 - 양방향 IPv6 연결 및 DNS 기반 서비스 검색 Codelab을 따라 Raspberry에서 스레드 경계 라우터를 설정합니다.파이
완료되면 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 애플리케이션을 빌드하고 두 개의 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에서 원시 Active Dataset를 가져옵니다.
$ sudo ot-ctl dataset active -x 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff
nRF52840 DK 보드에 연결합니다.
$ screen /dev/ttyACM0 115200
nRF52840 DK의 Active Dataset를 구성합니다.
> dataset set active 0e080000000000000000000300000b35060004001fffc00208dead00beef00cafe0708fddead00beef00000510e50d3d0931b3430a59c261c684585a07030a4f70656e54687265616401022715041021cf5e5f1d80d2258d5cfd43416525e90c0302a0ff Done
스레드 스택을 시작하고 몇 초 동안 기다린 후 기기가 성공적으로 연결되었는지 확인합니다.
> ifconfig up Done > thread start Done > state child
다른 nRF52840 DK 보드를 스레드 네트워크에 연결하려면 위 단계를 반복합니다.
이제 OTBR 3개와 nRF52840 DK 보드 2개의 스레드 기기로 스레드 네트워크를 성공적으로 설정했습니다.
5 Wi-Fi 네트워크 설정
동일한 Wi-Fi AP에 연결되도록 OTBR 및 노트북에서 Wi-Fi 네트워크를 설정합니다.
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!)
nRF52840 End Device 1과 노트북 모두에서 ff05::abcd
을 구독 중이므로 OTBR에서 핑 답장을 받을 수 있습니다. 이는 OTBR이 Wi-Fi 네트워크에서 스레드 네트워크로 IPv6 핑 요청 멀티캐스트 패킷을 전달할 수 있음을 보여줍니다.
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를 참조하세요.
참조 문서: