Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

스레드 경계 라우터 - 스레드 1.2 멀티캐스트

1. 소개

608c4c35050eb280.png

스레드란 무엇인가요?

스레드는 안전한 기기 간 통신과 기기와 클라우드 간 통신을 가능하게 하는 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 및 암호를 설정할 수 있습니다.

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

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 멀티캐스트 확인

이제 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를 참조하세요.

참조 문서: