스레드 경계 라우터-양방향 IPv6 연결 및 DNS 기반 서비스 검색

1. 소개

699d673d05a55535.png

스레드 경계 라우터란 무엇입니까?

스레드는 안전한 장치 대 장치 및 장치 대 클라우드 통신을 가능하게 하는 IP 기반 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 단일 실패 지점을 피하기 위해 토폴로지 변경에 적응할 수 있습니다.

스레드 경계 라우터는 스레드 네트워크를 Wi-Fi 또는 이더넷과 같은 다른 IP 기반 네트워크에 연결합니다. 스레드 네트워크는 다른 네트워크에 연결하기 위해 보더 라우터가 필요합니다. 스레드 경계 라우터는 최소한 다음 기능을 지원합니다.

  • 스레드와 Wi-Fi/이더넷 네트워크 간의 양방향 IP 연결.
  • 를 통해 양방향 서비스 검색 mDNS를 하고 (와이파이 / 이더넷 링크) SRP (스레드 네트워크).
  • IP 기반 링크를 통해 스레드 파티션을 병합하는 Thread-over-infrastructure.
  • 스레드 장치를 인증하고 스레드 네트워크에 연결하기 위한 외부 스레드 커미셔닝(예: 휴대폰).

OpenThread 국경 라우터 구글 발표 (OTBR)는 스레드 국경 라우터의 오픈 소스 구현입니다.

무엇을 만들 것인가

이 코드랩에서는 스레드 경계 라우터를 설정하고 경계 라우터를 통해 휴대폰을 스레드 종단 장치에 연결합니다.

배울 내용

  • OTBR 설정 방법
  • OTBR을 사용하여 스레드 네트워크를 구성하는 방법
  • SRP 기능으로 OpenThread CLI 장치를 구축하는 방법
  • SRP에 서비스를 등록하는 방법
  • 스레드 최종 장치를 발견하고 도달하는 방법.

필요한 것

  • Raspberry Pi 3/4 장치 및 최소 8GB 용량의 SD 카드.
  • 2 개 노르딕 세미 컨덕터 nRF52840의 dev에 보드.
  • 없는 와이파이 AP 의 IPv6 라우터 광고 경비대는 라우터에 사용 가능.
  • iOS 14 이상이 설치된 iOS 전화 또는 Android 8.1 이상이 설치된 Android 전화.

2. OTBR 설정

라즈베리 파이 설정

과 신선한 라즈베리 파이 장치를 설정하는 간단 rpi-imager 의 지시에 따라 도구를 raspberrypi.org를 다운로드 (대신 도구의 최신 라즈베리 파이 OS를 사용 2021년 5월 7일-raspios - 버스터 - armhf - 라이트 ) 직접. 이 코드랩의 휴대폰 단계를 완료하려면 Raspberry Pi를 Wi-Fi AP에 연결해야 합니다. 에 따라 무선 연결을 설정하는 가이드. 당신이 지침을 찾을 수 있습니다, SSH와 라즈베리 파이에 로그인하는 것이 편리하다 여기 .

OTBR 코드 받기

당신의 라즈베리 파이에 로그인 및 복제 ot-br-posix GitHub의에서 :

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

OTBR 빌드 및 설치

OTBR에는 스레드 경계 라우터를 부트스트랩하고 설정하는 두 개의 스크립트가 있습니다.

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

OTBR이 지정됩니다 (예를 들어 와이파이 / 이더넷) 스레드 인터페이스 및 인프라 네트워크 인터페이스 모두에서 작동 INFRA_IF_NAME . 스레드 인터페이스는 OTBR 자체에 의해 만들어지고 이름이 wpan0 기본적으로하고 인프라 인터페이스의 디폴트 값이 wlan0 경우 INFRA_IF_NAME 명시 적으로 지정되지 않았습니다. 당신의 라즈베리 파이가 이더넷 케이블로 연결되어있는 경우 (예 : 이더넷 인터페이스의 이름을 지정 eth0 )

$ INFRA_IF_NAME=eth0 ./script/setup

OTBR이 성공적으로 설치되었는지 확인하십시오.

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago
  Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2)
 Main PID: 2444 (code=exited, status=2)

것으로 예상된다 otbr-agent 그것이 필요하기 때문에 서비스가 활성화되지 RCP 실행하는 칩.

변경 사항을 적용하려면 Raspberry Pi를 재부팅하십시오.

RCP 펌웨어 빌드 및 플래시

OTBR은 15.4 무선 칩 지원 라디오 코 프로세서 (RCP) 모드. 이 모드에서 OpenThread 스택은 호스트 측에서 실행되고 IEEE802.15.4 트랜시버를 통해 프레임을 전송/수신합니다.

에 따라 이 코드 랩의 4 단계 빌드를하고 nRF52840 RCP 장치를 깜박입니다. 당신은 추가 옵션이 필요 -DOT_THREAD_VERSION=1.2 빌드 단계를 :

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

OTBR 시작 및 상태 확인

당신의 라즈베리 파이에 nRF52840 보드를 연결하고 시작 otbr-agent 서비스를 :

$ sudo service otbr-agent restart

있는지 확인 otbr-agent 서비스가 활성화 :

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago
 Main PID: 2997 (otbr-agent)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/otbr-agent.service
           └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0

Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started.
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId]
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down

3. 스레드 네트워크 형성

있습니다 ot-ctl 제어하는 데 사용할 수있는 명령 otbr-agent 서비스. ot-ctl 모든 OpenThread CLI 명령을 참조 받아 OpenThread CLI 안내서를 자세한 내용은.

OTBR을 사용하여 스레드 네트워크를 구성합니다.

$ sudo ot-ctl dataset init new
Done
$ sudo ot-ctl dataset commit active
Done
$ sudo ot-ctl ifconfig up
Done
$ sudo ot-ctl thread start
Done

몇 초를 기다리십시오, 우리는 OTBR가 스레드로 동작하는 것을 볼 수 있어야 leader 하고있다 off-mesh-routable 스레드 네트워크 데이터에서 (OMR) 접두사 :

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl netdata show
Prefixes:
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
$ sudo ot-ctl ipaddr      
fda8:5ce9:df1e:6620:0:ff:fe00:fc11
fda8:5ce9:df1e:6620:0:0:0:fc38
fda8:5ce9:df1e:6620:0:ff:fe00:fc10
fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
fda8:5ce9:df1e:6620:0:ff:fe00:fc00
fda8:5ce9:df1e:6620:0:ff:fe00:4000
fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d
fe80:0:0:0:a6:301c:3e9f:2f5b
Done

4. SRP 클라이언트 최종 장치 설정

OT CLI 빌드 및 플래시

에 따라 이 코드 랩의 5 단계 빌드를하고 nRF52840 CLI 엔드 장치를 깜박입니다. 하지만 그 대신 필요없이 OT_COMMISSIONEROT_JOINER CLI를 노드가 필요 활성화 OT_SRP_CLIENTOT_ECDSA 있습니다 :

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

OTBR 네트워크에 가입

에 의해 생성 된 스레드 네트워크에 가입하려면 otbr-agent 서비스를, 우리는 OTBR 장치에서 활성 운영 데이터 집합을 얻을 필요가있다. 의는 다시 가자 otbr-agent 명령 줄 및 활성 데이터 집합을 얻을 :

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

SRP 클라이언트 노드 화면 세션으로 돌아가 활성 데이터 세트를 설정합니다.

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

그런 다음 스레드 인터페이스를 시작합니다.

> ifconfig up
Done
> thread start
Done

몇 초 동안 기다렸다가 스레드 네트워크에 성공적으로 연결되었는지 확인합니다.

> state
child
Done
> netdata show
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
> ipaddr
fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
fda8:5ce9:df1e:6620:0:ff:fe00:4001
fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba
fe80:0:0:0:d4a9:39a0:abce:b02e
Done

네트워크 데이터가 OTBR에 인쇄된 데이터와 일치하는지 확인하십시오. 이제 OTBR의 OMR 주소를 ping할 수 있습니다.

> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
Done
> 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms

5. 최종 장치에 서비스 게시

mDNS는 링크 로컬에 DNS-SD 서비스를 게시하는 데 널리 사용되었습니다. 그러나 멀티캐스트 메시지는 너무 많은 대역폭을 소모하고 저전력 장치의 배터리를 빨리 소모합니다. 스레드는 유니 캐스트 사용 SRP의 테두리 라우터와 그들의 서비스를 등록 프로토콜을하고는 Wi-Fi 또는 이더넷 링크 서비스를 광고하기 위해 국경 라우터에 의존한다.

우리는있는 서비스를 등록 할 수 있습니다 srp client 명령을 사용합니다.

SRP 클라이언트 노드 화면 세션으로 이동하여 SRP 클라이언트를 자동 시작합니다.

> srp client autostart enable
Done

Wi-Fi/이더넷 링크에 광고할 호스트 이름을 설정합니다.

> srp client host name ot-host
Done

Wi-Fi/이더넷 링크의 장치가 스레드 종단 장치에 도달하려면 종단 장치의 OMR 주소를 광고해야 합니다.

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

마지막에, 가짜의 등록 _ipps._tcp 서비스를 :

> srp client service add ot-service _ipps._tcp 12345
Done

몇 초 기다리면 등록된 서비스를 볼 수 있습니다.

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

우리는 모든 설정 작업을 완료하고 _ipps._tcp 서비스는 Wi-Fi를 / 이더넷 링크를 광고되어 있어야합니다. 이제 최종 장치를 발견하고 도달할 시간입니다!

6. 서비스 발견

휴대폰으로 서비스를 만나보세요

54a136a8940897cc.png

우리가 사용하는 서비스 브라우저 안드로이드 전화와 mDNS를 서비스를 발견하는 앱을 해당 앱은 또한 iOS 모바일 장치를 찾을 수 있습니다. 앱을 열고 서비스 _ipps._tcp 단지 표시한다.

Linux 호스트로 서비스 검색

다른 리눅스 호스트에서 서비스를 발견 할 경우에는 사용할 수 있습니다 avahi-browse 명령을 사용합니다.

설치 avahi-daemonavahi-utils :

$ sudo apt-get install -y avahi-daemon avahi-utils

서비스를 해결합니다.

$ sudo service avahi-daemon start # Ensure the avahi daemon is started.
$ avahi-browse -r _ipps._tcp
+ wlan0 IPv6 ot-service                                    Secure Internet Printer local
= wlan0 IPv6 ot-service                                    Secure Internet Printer local
   hostname = [ot-host.local]
   address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927]
   port = [12345]
   txt = []
...

macOS 호스트로 서비스 검색

당신이 사용할 수있는 dns-sd 서비스를 해결하기 위해 맥 OS에를 :

$ dns-sd -Z _ipps._tcp local.
Browsing for _ipps._tcp.local.
DATE: ---Sun 14 Mar 2021---
21:31:42.125  ...STARTING...

; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp                                 PTR     @

; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

_ipps._tcp                                      PTR     ot-service._ipps._tcp
ot-service._ipps._tcp                           SRV     0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host
ot-service._ipps._tcp                           TXT     ""
...

7. 최종 장치에 Ping

휴대전화에서 핑

Pixel 폰을 예로 들면 Service Browser 앱의 서비스 인스턴스 세부 정보 페이지에서 이전에 등록된 서비스 "ot-service"의 OMR 주소를 찾을 수 있습니다.

bb992962e68d250b.png888daa1df1e1a9bf.png

우리는 지금 다른과 OMR 주소를 Ping 할 수 네트워크 분석기 응용 프로그램을.

불행하게도, 네트워크 분석기 앱의 안드로이드 버전은 핑 유틸리티 mDNS를 쿼리를 지원하지 않습니다 그리고 우리는 호스트 이름 Ping 할 수 ot-host.local (우리가 앱의 iOS 버전과 호스트 이름을 Ping 할 수 있습니다) 직접.

Linux/macOS 호스트에서 Ping

스레드 경계 라우터는 Wi-Fi/이더넷 링크에서 접두사(접두사 정보 옵션을 통해)와 경로(경로 정보 옵션을 통해)를 알리기 위해 ICMPv6 라우터 광고(RA)를 보냅니다.

Linux 호스트 준비

호스트에서 RA 및 RIO가 활성화되어 있는지 확인하는 것이 중요합니다.

  1. net.ipv6.conf.wlan0.accept_ra 적어도해야 1 IP 전달이 활성화되지 않은 경우, 그리고 2 그렇지.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen 보다 작은 안 64 .

accept_ra 디폴트로 1 가장 배포판. 그러나 (예를 들어,이 옵션을 무시합니다 다른 네트워크 데몬이있을 수 있습니다 dhcpcd 라즈베리 파이에이 우선합니다 accept_ra0 ). 당신은 확인할 수 있습니다 accept_ra 와 가치를 :

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

하고 값 세트 1 (또는 2 로 사용할 경우 IP 전달하여)

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

accept_ra_rt_info_max_plen 대부분의 리눅스 배포판에 옵션으로 기본값 0 으로 설정, 64 과 :

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

호스트를 재부팅하면 변경 사항이 손실됩니다. 예를 들어, 명령 아래 APPEND /etc/sysctl.conf 에 영구적으로 RIO를 사용 :

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

OTBR이 이미 RA 메시지를 보내고 있고 두 개의 원치 않는 RA 메시지 사이의 간격이 수백 초가 될 수 있기 때문에 이러한 구성을 변경하는 것은 너무 늦을 수 있습니다. 한 가지 방법은 Wi-Fi AP에 연결을 끊었다가 다시 연결하여 라우터 요청 메시지를 보내 OTBR이 요청된 RA로 응답하도록 하는 것입니다. 또 다른 옵션은 경계 라우터에서 경계 라우팅 기능을 다시 시작하는 것입니다.

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

당신이 Wi-Fi 또는 재시작 이더넷 인터페이스를 다시 연결하려는 경우, 있는지 확인 dhcpcd를이 당신의 WiFi- / 이더넷 IPv6 네트워크를 관리하는 데 사용되지 않습니다. dhcpcd를 항상 우선하기 때문에 accept_ra 옵션 매번 인터페이스가 다시 시작되고 당신의 accept_ra 구성이 손실됩니다. 추가] dhcpcd를 구성 파일에 라인 (예를 들어 아래 /etc/dhcpcd.conf dhcpcd를 명시 적으로 해제 IPv6로) :

noipv6
noipv6rs

변경 사항을 적용하려면 재부팅해야 합니다.

macOS 호스트 준비

accept_ra* 옵션은 기본적으로 활성화되어 있지만 적어도 맥 OS 큰 Sur로 시스템을 업그레이드해야합니다.

호스트 이름 또는 IPv6 주소에 대해 Ping

이제 우리는 호스트 이름 Ping 할 수 ot-host.local 명령과 함께 ping -6 ( ping6 맥 OS에 대한)를 :

$ ping -6 ot-host.local.
PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms
...

이 명령은 리눅스 호스트에서 실패 할 수 있습니다 "Name or service not known" 오류가 발생합니다. 그의는 때문에 ping 명령은 해결되지 ot-host.local. mDNS 쿼리로 이름을 지정합니다. 열기 /etc/nsswitch.conf 및 추가 mdns6_minimal 라인에로 시작 hosts :

hosts:          files mdns4_minimal mdns6_minimal dns

물론 IPv6 주소를 직접 ping할 수 있습니다.

$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms
...

8. 최종 장치 서비스 게시 취소

SRP 클라이언트 노드에서 등록된 주소 및 서비스를 제거하려면:

> srp client host remove
Done

당신은 발견 할 수 없어야 _ipps._tcp 현재 서비스.

9. 축하합니다

축하합니다. 스레드 종단 장치에 양방향 IP 연결 및 서비스 검색을 제공하기 위해 OTBR을 스레드 경계 라우터로 성공적으로 설정했습니다.

무엇 향후 계획?

이 코드랩 중 일부를 확인하십시오...

참조 문서