YOGYUI

Raspberry Pi - OpenThread Border Router 구동하기 (nRF52840 + RCP) 본문

Hardware/Raspberry Pi

Raspberry Pi - OpenThread Border Router 구동하기 (nRF52840 + RCP)

요겨 2023. 1. 16. 10:16
반응형

Thread(사물인터넷(IoT)을 위한 저전력 무선 네트워크 프로토콜, IEEE 802.15.4 표준)는 홈네트워크에 관심있는 사람이라면 한번쯤은 들어봤겠지만, Zigbee 기반 디바이스를 적극적으로 사용하지 않거나 하드코어한 개발자가 아닌 이상 직접적으로 다뤄볼 기회는 많지 않았을 것 같다

※ 아래 그림과 같은 스티커가 붙어있는 제품을 사용해봤다면 국내 한정 꽤나 진지한 홈IoT 경험자

https://www.threadgroup.org/What-is-Thread/Thread-Benefits

 

그런데 작년(2022년) 9월 말, CSA(Connectivity Standards Alliance)에서 홈네트워크용 표준 네트워크 프로토콜인 Matter의 공식 Release 버전 (1.0)을 배포하면서 홈IoT 시장이 빠르게 진화하고 있는 느낌이다 (이번 CES2023 행사에서 Matter가 그 존재감을 여실히 드러냈다)

https://techcrunch.com/2023/01/10/why-the-matter-logo-was-everywhere-at-ces-2023/

 

Why the Matter logo was everywhere at CES 2023

AR/VR/MX took center stage at CES 2023. Automotive trends got a lot of love, as well, as did robotics and the metaverse. Heck, even pee-related gadgets had their moment to shine last week in Vegas. Another trend, however, was ever-present, if decidedly mor

techcrunch.com

Matter 프로토콜의 핵심은 종단 기기(endpoint)사이의 통신은 Wi-Fi, Ethernet, Thread로 데이터를 주고 받으며, 기기를 Matter 네트워크에 등록할 때는 Bluetooth LE(Low Energy)를 사용하는 것이다보니, Matter 등장과 함께 Thread 통신 규격도 각광받고 있다

 

- Matter는 쉽게 이야기하면 홈네트워크 기기간 통신 방식(프로토콜)을 통일하고, 디바이스들의 제어 방식을 일원화해서 수많은 관련 제조사(like 애플, 삼성, LG, 구글, 화웨이, 이케아, 필립스 등등)들을 동일한 방식으로 제어할 수 있게 만드는 게 핵심 기술 요소이다 (요즘 기사에 많이 나오는 'LG ThinQ로 삼성 냉장고를 제어한다'는 내용이 이를 뜻한다)

- Matter는 인증/보안 관련 네트워크 통신과 endpoint의 규격(클러스터, 속성 등)을 모두 오픈소스로 제공하기 때문에 개발자는 네트워크 관련 개발은 1도 신경쓰지 않고 디바이스 개발에만 집중하면 된다 (요즘 나도 그러는중 ㅎㅎ)

https://www.nordicsemi.com/-/media/Images/Products/Matter/Matter-Topology.png


잡설이 좀 길었다.. ^^;;

최근 2~3개월간 Matter 관련 개발에 역량을 집중하고 있다보니 이런저런 이야기할 게 많다

 

이번 글에서는 Google에서 배포한 Thread 개발용 오픈소스 라이브러리 OpenThread를 Raspberry Pi(라즈베리파이) SBC에서 구동하는 방법에 대해 알아보자

※ 엄밀히 말하면 Nest라는 회사가 OpenThread를 개발했는데, Nest를 구글이 꿀꺽했으니 현재는 구글이 배포하고 있다고 해도 무방하다

※ 모든 과정은 openthread의 공식 가이드를 따라한 것이다

https://openthread.io/codelabs/openthread-border-router#0

1. 준비물

내가 이번 글을 위해 준비한 라즈베리파이는 <Raspberry Pi 4 Model B Rev 1.2>이며, 운영체제는 Raspbian GNU/Linux 10 (buster)이 설치되어 있다 

 

라즈베리파이는 Wi-Fi, Bluetooth, Ehternet 3가지 방식의 통신 모듈을 내장하고 있으며, 핀헤더 혹은 USB에 주변기기를 장착해 다른 기능을 확장할 수 있다

Thread 통신을 위해 필요한 IEEE 802.15.4 표준 통신 방식 (like Zigbee)은 내장되어 있지 않기 때문에 별도의 하드웨어를 장착해줘야 하는데, Silicon Labs, Ti, Infineon, NXP, Espressif 등 쟁쟁한 SoC 제조사들이 관련 제품을 판매중이기 때문에 입맛에 맞게 선택하면 된다 (모든 업체들이 SDK와 Document를 굉장히 개발자 친화적으로 충실히 제공하고 있다)

 

나는 지난번 글에서 구입하고 펌웨어까지 설치한 Nordic Semiconductor社의 nRF52840 USB Dongle 제품(WRL-16306)을 라즈베리파이에 장착해서 구동해보고자 한다 

https://yogyui.tistory.com/entry/nRF52840-USB-Dongle-RCP-%ED%8E%8C%EC%9B%A8%EC%96%B4-%EC%98%AC%EB%A6%AC%EA%B8%B0

 

nRF52840 USB Dongle - RCP 펌웨어 올리기 (for OTBR)

요즘 퇴근 후 자기계발 시간 대부분을 "매터(Matter)를 이용한 홈네트워크 구축" 개발에 할애하고 있다 (C++ 개발 지식이 조금만 있으면 습득하기 굉장히 쉬운 프로토콜인듯?) 매터 기반 홈네트워크

yogyui.tistory.com

nRF52840 USB Dongle

라즈베리파이 SSH 기능을 활성화시킨 후, 원격으로 작업하는 걸 추천!

2. Raspberry Pi에 OTBR 소스코드 가져오기 및 빌드

git으로 다음과 같이 소스코드를 클론해준다

(나는 루트 경로에 OTBR 디렉터리를 만들어서 진행했는데, 복제 경로는 본인 입맛대로 설정하면 된다)

※ git이 설치되어 있지 않다면 sudo apt install git 명령어로 설치해주면 된다

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

ot-br-posix 경로로 소스코드 일부(clone depth=1) 복제 완료

 

붓스트랩 스크립트(script/bootstrap)를 실행해 필요한 패키지들을 설치해주자

$ cd ot-br-posix/
$ ./script/bootstrap

5분정도 기다리면 설치가 완료된다

소스코드 자체의 용량은 61MB이지만, 필요한 각종 패키지(mDNS, NAT 등 네트워크 관련)들을 설치하기 때문에 넉넉하게 1GB 정도 여유공간은 준비해두는게 좋다

 

이제 설치 스크립트(script/setup)를 실행해 빌드해주자 (gcc, g++ 컴파일러로 빌드가 진행된다)

$ INFRA_IF_NAME=wlan0 ./script/setup

INFRA_IF_NAME 변수에 네트워크 인터페이스 이름을 지정해줘야 하는데, 라즈베리파이가 현재 네트워크에 연결중인 인터페이스 이름을 대입해주면 된다 (유선 이더넷은 보통 eth0, 무선 와이파이는 보통 wlan0)

※ 아래와 같이 ifconfig로 확인 가능

컴파일에 10분 가까이 소요되니 여유롭게 커피 한잔 마시면 된다

 

다음 명령어로 제대로 설치되었는지 확인해보자

$ sudo service otbr-agent status

초기 설치 시 상태는 inactive (dead)로 뜬다 (이게 정상)

변경 사항 적용을 위해 리부팅을 해주자

$ sudo reboot

3. nRF52840 USB Dongle 장착

라즈베리파이 USB 포트 4개 중 아무거나 하나 골라서 장착하면 된다

(USB 2.0, USB 3.0 아무데나 꽂아도 상관은 없는데, 굳이 선택하라면 2.0에 꽂는 걸 추천)

3.1. USB Dongle UART 보레이트(baudrate) 변경 

OTBR 설치 후 /etc/default 경로에 설정파일 otbr-agent이 생성되는데, 파일을 열어보자 (nano나 vim같은 에디터를 활용하면 된다)

$ sudo nano /etc/default/otbr-agent

설정파일의 초기 템플릿은 아래와 같다

# Default settings for otbr-agent. This file is sourced by systemd

# Options to pass to otbr-agent
OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0 trel://wlan0"
OTBR_NO_AUTO_ATTACH=0

여기서 OTBR_AGENT_OPTS 항목의 USB 포트명 뒤에 다음과 같이 baudrate 파라미터를 추가해주자

(시리얼 통신 보레이트를 1000000bps로 변경)

OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=1000000 trel://wlan0"

※ 만약 다른 USB 디바이스들이 꽂혀있어서 동글의 포트명이 /dev/ttyACM0이 아니라면, 해당 포트명으로 바꿔주면 된다

3.2. 동작 확인

USB 동글은 장착한 후 OTBR agent를 재시작해준다

$ sudo service otbr-agent restart

그리고 다시 agent 상태를 확인해보면

$ sudo service otbr-agent status

Active: active (running) 으로 정상적으로 잘 작동하고 있다고 표시된다

아래 로그에서 Succesfully registered service OpenThread BorderRouter #24A9 와 같이 OTBR이 정상적으로 시작되었음을 확인할 수 있다

 

위 상태 로그를 보면 Thread 네트워크는 wpan0 라는 인터페이스로 활성화된 것을 알 수 있다

실제로 ifconfig 명령 등으로 네트워크 인터페이스를 확인해보면 wpan0가 새로 생성된 것을 알 수 있다

(죄다 IPv6 주소를 가지고있다..)

4. 라즈베리파이를 Thread 리더(Leader)로 설정하기

하나의 Thread 네트워크에서 1개의 라우터(TBR)는 최대 511개의 종단 기기 (end device)를 관리할 수 있는데 (물론 이것만 해도 충분히 많긴 하지만), 라우터 1개를 리더로 설정하면 리더는 최대 32개의 라우터를 관리할 수 있으므로 단일 네트워크로 최대 16,352개의 엔드포인트가 포함될 수 있다 - 일반적인 인터넷 공유기의 DHCP랑 유사한 개념

이정도면 일반 가정집이 아니라 왠만한 대기업 건물 한 채 정도는 쉽게 커버할 수 있지 않나? 싶을 정도로 많은 디바이스를 등록할 수 있다

https://openthread.io/guides/thread-primer/node-roles-and-types
https://openthread.io/guides/thread-primer/node-roles-and-types

집안에 별도로 구성되어있는 Thread 네트워크가 없다면, 앞서 구성한 라즈베리파이 보드를 리더로 설정해서 Thread 네트워크를 구축해보자

ot-br-posix 환경 구축 시 ot-ctl이라고 하는 command line interface 툴이 같이 설치되는데, 이를 사용해서 아래와 같이 명령을 순차적으로 내려보자

※ cli에 대한 자세한 내용은 깃허브 문서를 참고하면 된다

https://github.com/openthread/openthread/blob/main/src/cli/README.md

 

GitHub - openthread/openthread: OpenThread released by Google is an open-source implementation of the Thread networking protocol

OpenThread released by Google is an open-source implementation of the Thread networking protocol - GitHub - openthread/openthread: OpenThread released by Google is an open-source implementation of ...

github.com

4.1. 새로운 Thread 네트워크 데이터셋 생성

dataset 명령어로 'init new'를 통해 새로운 Thread 네트워크 데이터셋을 만들어준다

※ 모든 ot-ctl 명령은 오류없이 수행되면 'Done'을 출력한다

$ sudo ot-ctl dataset init new

생성 후 dataset을 호출해 생성된 네트워크 데이터셋의 세부 정보를 확인할 수 있다

$ sudo ot-ctl dataset

다른 Thread Border Router나 엔드포인트 기기가 이 네트워크에 접속하기 위해서는 Network Key (길이 32 문자열)가 필요하다 (외부에 디스플레이되는 네트워크 이름은 Network Name의 OpenThread-1eaa와 같다)

만약 위에서 생성한 Thread 네트워크에 접속하려면

$ sudo ot-ctl dataset networkkey 2482bfa6ba2633d05f184bdd3297ba5b

와 같이 데이터셋을 생성하면 된다

4.2. 네트워크 활성화

새로운 네트워크 데이터셋을 생성하거나, 다른 네트워크에 접속할 정보를 생성한 후 commit 명령어를 통해 생성된 데이터셋을 적용한다 (SQL같은 DBMS랑 유사한 개념인듯?)

$ sudo ot-ctl dataset commit active

그리고 Thread 네트워크를 다음 두 명령어로 활성화시켜주면 작업은 끝~

$ sudo ot-ctl ifconfig up
$ sudo ot-ctl thread start

4.3. 네트워크 동작 정보 확인

현재 OpenThread의 상태를 확인해보면 'leader' 노드로 동작중인 것을 확인할 수 있다

$ sudo ot-ctl state

다른 정보들도 확인할 수 있다고 하는데, 아직 Thread Network에 익숙하지 않아서 뭘 의미하는지는 잘 모르겠다 ^^;

$ sudo ot-ctl netdata show

현재 Thread 네트워크가 사용중인 IP 주소는 다음 명령어로 확인할 수 있는데, 이는 위에서 ifconfig의 wpan0 인터페이스에 할당된 IPv6 주소값들과 동일한 것을 알 수 있다

$ sudo ot-ctl ipaddr

5. 마무리

이왕 Thread 네트워크를 구축한 김에 이것저것 테스트해보면 좋겠지만, 아쉽게도 아직 집에 Thread 기반 장치가 하나도 없다 -_- (난 이짓을 왜한걸까?)

라즈베리파이 남는거 하나도 nRF52840 붙여서 테스트해봐야하나...

 

Espressif사의 ESP32-H2는 IEEE 802.15.4를 지원하는 값싼 SoC라서 Matter + Thread 환경으로 장치를 개발하기에 적절해보여서 최근에 제품을 주문했고 Thread SDK 문서도 열심히 읽어보고 있다 

(최근에 한창 이슈였던 RISC-V 아키텍쳐인 점도 매력 요소)

 

802.15.4를 802.11을 동시에 지원하는 SoC라면 무선 네트워크 방식을 입맛따라 요리조리 바꿔가면서 개발해볼 수 있을텐데... 좀 더 검색해봐야겠다 ㅎㅎ 

 

끝~!

반응형
Comments