NCS (5) - nRF Connect SDK 예제 따라하기 - Bluetooth: Mesh light
Updated:
5. nRF Connect SDK 예제 따라하기 - Bluetooth: Mesh light
이번 포스팅에서는 nRF Connect SDK
(이하, SDK
) 예제 (sample
) 중 Bluetooth: Mesh light
예제를 따라해보고 어떤 식으로 동작하는지에 대해 간략하게 설명하고자 한다. 보다 자세한 내용이 필요하다면, 아래의 노르딕 (nordic
) 공식 페이지를 참조하면 될 것 같다.
5.1 Bluetooth: Mesh light 예제 빌드 및 업로드 (flash)
SDK
에서 Create a new application
메뉴를 선택 후, 노르딕에서 제공되는 샘플 어플리케이션 중 Bluetooth: Mesh light
예제를 다운받아 빌드 및 업로드를 진행한다.
SDK
에 대한 세세한 내용 (e.g. 개발환경 설치, 빌드, 등
)은 별도로 다루고 있지 않으니, 관련 내용을 처음 접하는 분들은 이전 포스팅 의 소개된 링크를 참고해서 어느정도SDK
개발에 익숙해지는 것이 먼저일 듯 하다.
참고로 필자는 SDK v2.0.2
버전을 이용하였으며, 별도의 코드 수정 없이 노르딕에서 제공된 예제 코드를 그대로 사용하였으므로 각자 사용하는 보드 (e.g. nRF52840-DK
)에 정상적으로 실행 파일이 업로드 되었다면 PC 에서 추가로 작업할 부분은 없다.
5.2 Bluetooth: Mesh light main.c
구조 분석
본 예제의 main.c
에서 사용되는 헤더는 다음과 같다.
🗂️ <bluetooth/mesh/...>
로 시작하는 헤더가 mesh
기능을 사용하기 위한 공통 라이브러리라고 보면 되고, 본 예제에서 구체적으로 사용되는 모델 (model
)은 model_handler.h
에 정의되어있다. 본 예제의 경우 mesh profile
의 Generic OnOff Server
모델과 노르딕 하드웨어 LED 를 어떤 식으로 연결하고 설정했는지에 대한 부분이 model_handler.h
헤더와 model_handler.c
파일에 정의되어있으니 추가적으로 확인해보면 좋을 듯하다.
main.c
의 소스코드는 상당히 간단한 형태이다.
bt_enable
: 블루투스 (or BLE) 기능 초기화 함수. BLE 초기화가 성공적으로 완료되었을 때 불러올 수 있는callback
함수를 인자로 전달받을 수 있다. (본 예제에서는bt_ready
)
참고로 bt_ready
콜백 함수에서 실제로 블루투스 메시 (mesh
)와 직접적으로 관련이 있는 함수는 위의 코드에서 별도로 표시한 1, 2
부분 밖에 없다.
다른 함수들은 메시 기능을 사용하지 않는 블루투스 예제에서도 동일하게 사용되며, 보통의 경우는
bt_enable
호출 시 인자를NULL
값으로 설정하고 나머지 초기화 함수들을 그 뒤에 이어서 호출하는 방식이다. 아래peripheral-uart
예제의main()
함수를 참고할 것.
그럼에도 불구하고.. 메시 예제 샘플의 코드가 bt_enable(bt_ready)
이러한 형태로 구성된 이유는 아무래도 mesh profile
자체가 BLE stack
을 기반으로 동작하기 때문에, 반드시 블루투스 기능 초기화가 마무리 된 이후에 관련 함수들을 사용하기 위함인 것으로 추정된다 🍒.
5.3 nRF Mesh mobile app. 이용해서 테스트 하기
SDK
에서 제공되는 메시 샘플은 기본적으로 노르딕에서 제공해주는 nRF Mesh 스마트폰 앱을 이용해서 제어가 가능하다. 참고로 필자는 현재 보급형 안드로이드 폰 (갤럭시 A 시리즈)을 사용하고 있으며, nRF Mesh
앱 버전은 3.2.4
이다.
5.3.1 프로비저닝 (provisioning)
nRF Mesh
앱을 이용해서 기기를 메시 네트워크에 추가하는 (프로비저닝, provisioning) 과정은 다음과 같다.
Identify
버튼을 누르면, Mesh Light 샘플이 업로드 된 기기의 LED 가 깜빡이는 것을 확인할 수 있을 것이고, 이어서Provision
버튼을 눌러 Provisioning 을 진행하면 된다. (Provision
버튼 클릭 이후 OOB 설정을 묻는 메시지 박스가 뜰텐데, 본인의 경우 일단 기본 옵셥No-OOB
로 선택했음)
프로비저닝이 시작되면 nRF Mesh
앱과 기기 사이의 명령어 교환이 이루어지고, 잠시 뒤 설정까지 완료될 것이다(오류가 발생하지 않는다면). 프로비저닝이 완료되면, 이제 Mesh light
샘플 기기를 nRF Mesh
앱과 같은 메시 네트워크에 구성된 노드 (Node
)가 되고, 위의 사진에서 볼 수 있듯이 앱의 Network
메뉴에서 Mesh light
노드가 표시되는 것을 확인할 수 있다.
5.3.2 Element 및 Model 구조
Mesh light
샘플 노드의 내부 구성요소는 4 개의 element
와 6 개의 model
로 구성된다.
element
와 model
에 대해서는 개념이 조금 생소할 수 있는데, 일단 필자는 “특정 model
을 이용해서 다루고자하는 대상이 element
“ 라고 이해하고 있다.
본 Mesh light
샘플 예제에서는 결국 노드 (장치)에 포함된 N
개의 LED 를 제어하는 것이 목표인데… 이 때 노드가 갖는 각각의 LED 가 element
가 되는 것이고, 블루투스 메시 프로토콜을 이용해 해당 LED
의 상태를 보여주기 위해 본 예제에서는 Generic OnOff Server
model
이 사용되었다.
Generic OnOff Server
는 LED 같이 단순하게0
혹은1
의 상태로 표시할 수 있는element
들의 정보를 교환하기 위해 고안된model
이다. 하나의element
내 동일한model
을 포함할 수 없기 때문에, 본 예제에서는 4 개의 LED 상태를 나타내기 위해 4 개의element
가 정의되어 있는 것.
참고로, 일반적으로 첫 번째 (특정 노드 내 element
주소 값이 가장 작은) element
에는 메시 네트워크의 무선 통신 관련 설정을 관리하기 위해 Config. Server
와 Health Server
모델을 포함하고 있는 듯 하다.
nRF Mesh
앱 이용해서 LED 제어하는 방법까지 기록하려고 했으나, 생각보다 글이 길어지는 듯 해서 해당 내용은 다음 포스팅으로 미루려고 한다. 예제 따라하기 포스팅이 처음이라서 그렇지, 다음부터는 이렇게까지 하나하나 (?) 기록하지는 않을 듯 하다
Comments