스레드 보더 라우터 - 스레드 1.2 멀티캐스트

1. 소개

608c4c35050eb280.png

스레드란 무엇인가요?

스레드는 안전한 기기 간 통신 및 기기와 클라우드 간 통신을 지원하는 IP 기반 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 포인트는 토폴로지 변경에 적응하여 단일 포인트 장애를 방지할 수 있습니다.

OpenThread란 무엇인가요?

Google에서 출시한 OpenThread는 Thread®의 오픈소스 구현입니다.

OpenThread 보더 라우터란 무엇인가요?

Google에서 출시한 OpenBR Border Router (OTBR)는 스레드 보더 라우터의 오픈소스 구현입니다.

Thread 1.2 멀티캐스트

스레드 1.2는 범위가 렐레 로컬보다 큰 멀티캐스트 주소에 대해 이기종 네트워크 (스레드 및 Wi-Fi/이더넷 네트워크 세그먼트)에서 멀티캐스트를 지원하는 일련의 기능을 정의합니다.

스레드 1.2 보더 라우터는 백본 라우터 (BBR) 데이터 세트를 등록하며 선택한 BBR 서비스는 멀티캐스트 인바운드/아웃바운드의 발신을 담당하는 기본 백본 라우터 (PBBR)입니다.

스레드 1.2 기기가 주소가 렐레 로컬보다 크면 Cocast 메시지를 전송하여 멀티캐스트 주소를 PBBR (멀티캐스트 리스너 등록, 줄여서 MLR)에 등록합니다. PBBR은 외부 인터페이스에 MLDv2를 사용하여 수신해야 하는 IPv6 멀티캐스트 그룹에 대해 더 광범위한 IPv6 LAN/WAN에 통신하며, 이는 로컬 스레드 네트워크를 대신하여 이루어집니다. 또한 PBBR은 대상이 하나 이상의 스레드 기기에서 구독된 경우에만 멀티캐스트 트래픽을 스레드 네트워크로 전달합니다.

Thread 1.2 Minimal Device의 경우, 부모에게 의존하여 멀티캐스트 주소를 집계하고 대신 MLR을 수행하거나 부모님이 Thread 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 애플리케이션을 빌드하고 nRF52840 DK 보드 2개를 플래시합니다.

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의 활성 데이터 세트를 구성합니다.

> 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 AP에 연결되도록 Wi-Fi 네트워크를 설정합니다.

raspi-config를 사용하여 Raspberry Pi OTBR의 Wi-Fi SSID와 암호를 설정할 수 있습니다.

최종 네트워크 토폴로지는 다음과 같습니다.

5d0f36fd69ebcc9a.png

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.

멀티캐스트 구독이 포함된 최종 네트워크 토폴로지는 다음과 같습니다.

b118448c98b2d583.png

이제 스레드 네트워크의 nRF52840 최종 기기 1과 Wi-Fi 네트워크의 노트북에서 IPv6 멀티캐스트 주소를 구독했으므로 다음 섹션에서 양방향 IPv6 멀티캐스트 연결 가능성을 확인합니다.

7. 인바운드 IPv6 멀티캐스트 확인

이제 Thread 네트워크의 nRF52840 End Device 1에 Wi-Fi 네트워크의 IPv6 멀티캐스트 주소 ff05::abcd를 사용하여 연결할 수 있습니다.

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

OTBR은 nRF52840 End Device 1과 Laptop에서 모두 ff05::abcd를 구독했기 때문에 두 개의 핑 응답을 받을 수 있습니다. 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를 참고하세요.

참조 문서: