[RSL10] Sample Code User's Guide

1. Introduction

이 메뉴얼은 RSL10에서
Peripheral Device with Server(peripheral_server) 동작방식에 대해 배워본다.
그리고 커스텀 할 수 있도록 추가정보도 제공해준다.

대상자 : 능숙한 프로그래머, BLE 기술에 익숙한 사람들. (둘다 해당사항 없누..)

다음 레퍼런스 문서를 참조하라

  • RSL10 Getting Started Guide
    • RSL10 Hardware Reference
    • RSL10 Firmware Reference
    • RSL10 Evaluation and Development Board Manual



3. The peripheral_server Application

이 챕터는 peripheral_server 코드의 이러한 부분을 설명한다.

  • 뭘 하는 애플리케이션인가?
  • 구성요소는 뭐냐?
  • 애플리케이션 작동은 어떻게 하냐?

머하는 애플리케이션인가?

  • GATT server 이다.
    • 원격 GATT 클라이언트가 읽을 수 있는 GATT characteristics 형태 데이터를 제공
  • GAP peripheral 이다.
    • GAP central device에게 연결 가능성과 존재를 Advertising 한다.

peripheral_server는 베터리서비스와 Custom서비스를 구현한 후, Advertising을 시작한다.
central device는 Advertising 을 scan하고 Connection 모드로 연결된다.

Advertising 중에는 LED가 깜빡인다.

Application 프로그램은 커널타이머 이벤트에 따라 200ms 마다 Devcie 베터리수준을 읽는다.
베터리잔량(3200ms)의 16회 읽기에 대해 평균을 계산함. 평균값이 변경되면 베터리레벨 업데이트를 스택으로 보내도록 플래그가 설정됨.
베터리레벨 알림이 활성화된 경우 스택은 베터리레벨 알림을 peer 장치에 보냄.
이때 2개의 characteristic 이 정의도니 Custom Service를 보여줌.

  • 클라이언트 Device에서 알림을 비활성화 안하면 30개의 커널 타이머 이벤트(6초)마다 값이 증가된 알림이 전송이 된다.


periphreal_server가 보여주는 것

표준 서비스 및 Custom 서비스 사용 예시를 보여줌.

  • RSL10(server)을 Central Client에 연결 후 BLE 스택에 요청을 보내는 방법을 보여줌
  • 응답을 수신 및 처리하고, 계산하고, 커널 타이머 이벤트를 사용하고, 알림을 보냄.
  • 서비스 생성, 연결, 측정, 타이밍 및 알람과 같은 이러한 모든 기능은 RSL10의 BLE 기본빌딩 블록 중 일부이다.


Ble stack과 통신함

  • 아...


Peripheral_servrer 앱 둘러보기

System Initialization

초기화 함수 App_Initialize() 호출

  • 다른 함수를 차례로 호출하여 BLE, Kernel, 전원, Clock, 인터럽트 및 모든 Env 를 초기화함.

GAP, GATT 서비스 : 통신 설정

  • GAP(Generic Access Profile)에는 BLE통신 방법인 브로드캐스팅 및 연결 매커니즘에 대한 가이드라인이 포함되어있음
    • GAP는 GAPM(GAP Manager)서비스와 GAPC(GAP Controller)서비스로 나뉨.
  • GATT(Generic Attribute Profile) 에는 BLE Attribute(데이터) 형식지정, 패키징 및 전송되는 방식에 대한 규칙이 포함됨
    • GATTM(Manager), GATTC(GATT Controller) 서비스로 나뉨.

Kernel Scheduler

초기화 후 While Loop 커널스케줄러 시작.

  • 커널스케줄러 : 다른 작업에서 전달하는 메시지를 지속적으로 확인하는 역할을 함.

이 App 에는 1개의 작업만 있다.
서로 다른 App에서는 BLE 기능을 제어한다.
GAPM, GAPC, GATTM, GATTC, 다른 Custom Profile(서비스)와 같은 다른작업과 통신해야하는 경우가 있음.

  • 이 때 커널스케줄러에서 메시지들을 처리함.

응용프로그램이 메시지를 보낼때, 커널버퍼에 메모리 할당->매개변수로 메시지를 채움.
그리고 커널함수를 이용해 메시지를 해당대상에게 보냄.
커널 스케줄러는 해당 버퍼를 확인하고, 스케줄러는 메시지핸들러를 자동호출 시켜 대상 작업에 메시지를 보냄.

커널스케줄러는 스택, 서비스, 애플리케이션에서 사용하는 모든 타이머도 처리함.

  • 타이머가 만료되면 타이머 식별자에 할당된 함수 또는 메시지 핸들러를 자동으로 호출함.

Message Handler (메시지 처리기)

애플리케이션에서 GAPM으로 보낸 모든 메시지, 요청 또는 명령에는 연결된 GAPM_COMPLETE 이벤트가 있음.

  • 이 이벤트 메시지는 스택에서 애플리케이션으로 전송됨
  • 메시지 식별자에 따라 이 메시지는 커널에 의해 자동으로 호출됨.
  • 이 이벤트 메시지에 대한 정의는 ble_standard.h에 있는 BLE_MESSAGE_HANDLER_LIST에 있음.

추가하고 싶은 메시지와 메시지 처리기를 원하는 모든 메시지는 BLE_MESSAGE_HANDLER_LIST에 나열되어야 함.

GATT 및 GAP에 대한 CEVA 설명서를 읽고 일부 특정 API 또는 메시지에 대한 고유한 메시지 처리기를 추가하기로 결정할 수 있음. 메시지 처리기에 기재해야 해야함.

메시지 핸들러를 추가하려면

  • 먼저 해당 .h 파일에 DEFINE_MESSAGE_HANDLER를 추가
  • 해당 파일에 ble_standard.h, application.h 또는 standard_profile.h가 될 수 있는 함수를 정의해야함

Standard Profiles/ Services

Standard Services는 BLE Device가 특정 유형의 데이터를 서로 통신할 수 있도록 미리 정의된 방법.

프로필은 하나 이상의 서비스 그룹으로 생각할 수 있습니다.
표준 서비스의 속성은 BLE Stack 에서 이미 인식되어 있으므로 표준 서비스를 애플리케이션에 추가할 때 속성을 나열할 필요가 없음.

각 표준 서비스에는 16비트 UUID(고유 숫자 식별자)가 있음.


Custom Profiles/ Services

추가기능을 부여할 수 있는 방법이다.
표준 서비스와 달리 맞춤형 서비스는 미리 정의되지않음.
우리가 알아서 만들어 써야함.
스택에 추가할 Attributes도 알수 없다.
Custom Services에 대해 원하는 모든 Attributes를 list화 시켜야함.
각 Custom Service에는 128비트 UUID가 필요합니다.



The Main Loop - peripheral_server 이벤트 커널 실행

peripheral_server의 주요 기능은 app.c에 위치한 프로그램의 메인 루프에 의해 수행됨.

이 루프는 배터리의 새 값이 변경되었는지 확인하고 send_batt_ntf라는 플래그를 설정함.
루프는 Batt_LevelUpdateSend 함수를 호출하여 배터리 수준 값을 배터리 서비스로 보냄.
이 서비스에 대해 알림이 활성화되면 BLE 스택은 업데이트된 배터리 값을 RSL10과 통신하는 peer 장치(클라이언트 장치)에 알림

Custom Attributes 중 하나의 값이 변경될 때 설정되는 추가 플래그도 있음.
플래그는 tx_value_exchange 라함.
이 플래그를 기반으로 custom_service_send_notification 함수가 호출되어 스택에 새 값을 보내고, 스택은 무선을 통해 피어 장치에 메시지를 보내는 기능이 있음.

이 Demo Source에서는 peripheral 인 RSL10에서 클라이언트 장치/중앙 장치로 일부 매개변수를 통신하고 있음.
링크가 설정되어 통신 중임을 나타내기 위해 6초마다 tx_attribute 값을 보냄

중앙 장치를 사용하여 새 배터리 데이터가 6초마다 측정되고 올바르게 읽히는지 확인할 수 있음.
배터리 수준이 변경되면 해당 알림이 활성화된 경우 중앙 장치에 알림이 전송되고 새 값을 표시할 수 있음. 6초마다 중앙 장치는 Custom Chracteristics를 보내기도 함.



WALKTHROUGH OF THE MESSAGE SEQUENCE CHART (MSC)

이 프로세스의 모든 단계들은 BLE Manager의 상태를 표시하는 BLE_STATE라는 변수를 변경한다.
처음에는 애플리케이션이 초기화되고 IDLE 상태로 구성될 때 APPM_INIT로 초기화 함.

Bluetooth 스택, 커널 및 응용 프로그램이 작동하는 모든 환경을 초기화한 후 코드는 BLE Stack으로 재설정(reset)을 전송함.

reset 전송이 성공되면 스택은 작업 이름, 상태가 포함된 GAPM_COMP_EVENT를 다시 전송.

애플리케이션은 이를 수신하고 작업이 GAPM_RESET인지 확인함.
또한 상태가 성공적인지 여부도 확인함.

이러한 조건이 충족되면 GAPM_SET_DEV_CONFIG_CMD 명령이 스택으로 전송됨.
다시 Stack은 GAPM_COMP_EVENT를 다시 보냅니다.
매개변수가 잘못 설정되면 스택이 애플리케이션의 메시지를 수락하지 않고 자체적으로 올바르게 구성되지 않을 수 있으므로 상태에서 오류가 확인하는 것임.
오류가 발생하지 않으면 애플리케이션은 성공적인 GAPM_COMP_EVENT를 수신함.

이제 애플리케이션이 APPM_CREATE_DB(데이터베이스 생성) 상태로 설정되어 BLE Stack에 데이터베이스를 추가하고 GAP를 구성하기 시작한다.

프로그램은 이제 스택에 표준 서비스를 추가하기 위한 GAPM_PROFILE_TASK_ADD_CMD 명령을 보내고 서비스가 성공적으로 추가되었는지 indicator를 받음.
다음으로 프로그램은 Custom Services 추가를 요청하기 위해 스택에 GATTM_ADD_SVC_REQ 요청을 보낸다.
GATTM_ADD_SVC_RSP는 Custom Services를 추가할 수 있는지 여부를 프로그램에 알려주는 스택의 응답임.

서비스를 추가한 후 애플리케이션은 APPM_READY 상태가 됨.
이제 코드는 추가 서비스가 추가되기를 기다리고 있는지 확인하는 기능을 실행함.
더 이상 추가할 서비스가 없는 것으로 확인되면 GAPM_START_ADVERTISING 명령을 전송하여
Advertising 시작.

매개변수가 올바르게 설정되면 명령이 전송되는 즉시 Advertising이 시작되기 때문에 코드는 스택에서 GAPM_COMP_EVENT 응답을 기다릴 필요가 없다.
애플리케이션은 이제 APPM_ADVERTISING 상태에 있습니다.

광고가 시작되면 중앙 장치는 주변 장치(RSL10)를 스캔할 수 있음.
중앙 장치가 주변 장치가 광고하는 것을 observe하면 Connection을 설정할 수 있음.

애플리케이션은 연결된 블루투스 주소를 알려주는 GAPC_CONNECTION_REQ_IND 표시를 수신함.
그런 다음 애플리케이션은 GAPC_CONNECTION_CONFIRMED 알림을 스택에 전송하여 프로그램이 스택의 메시지를 수신했으며 메시지가 필요한 매개변수를 제공했음을 나타냄.
애플리케이션은 이제 APPM_CONNECTED 상태에 있음.

링크가 설정되면 프로그램은 스택에서 배터리 서비스(BASS)를 활성화하기 위해 BASS_ENABLE 요청을 보냄.

이 메시지에 대한 응답을 수신한 후 BASS_SUPPORT_ENV.ENABLE은 배터리 서비스가 활성화되었음을 애플리케이션에 나타내도록 설정됨.
이 시점에서 Custom Service 알림을 보내거나 CustomService Charateristics 값에 대한 읽기 요청을 중앙 장치로부터 수신하거나 중앙 장치와 다른 종류의 통신을 수행할 수 있다.



새 Profiles/Services 추가

새 Standard Profiles/Services 추가

추가된 표준 서비스를 나타내는 메시지와 함께 프로그램에서 GAPM_ProfileTaskAdd 명령을 전송하여 Bluetooth 저에너지 스택에 표준 서비스 추가가능.
이 샘플 프로그램에서는 배터리 서비스 서버인 ble_bass를 추가했음.
같은 방식으로 더 많은 표준 프로필을 추가할 수 있다.
GAPM_ProfileTaskAdd 명령을 보낸 후 프로그램은 이 서비스가 성공적으로 추가되었는지 확인하기 위해 GAPM_ProfileAddedInd 표시가 수신될 때까지 기다려야 함.
잘못된 매개변수 값으로 인해 스택이 명령을 거부할 수 있음.
이는 GATTM 서비스도 마찬가지이다.

따라해보기

  1. documentation/ceva 폴더에 원하는 프로필/서비스 API 관련 문서 찾기

  2. .c 파일과 .h 파일이라는 두 개의 파일을 만들고 선택한 서비스에 따라 이름을 지정한다.
    예를 들어, ANPS 서비스를 추가하려면 코드 구조와의 일관성을 위해 ble_anps.c 및 ble_anps.h 파일을 생성합니다.

  3. Eclipse에서 Build Configuration for Cross Arm C CompilerProject Setting 으로 이동하여 CFG_PRF_ANPS 기호를 추가합니다. 프로젝트에 추가되는 최대 프로필 수를 기준으로 CFG_NB_PRF를 조정합니다.

  4. Project setting의 라이브러리 아래 Cross Arm C Link에서 -l section 아래에 "anps"를 추가합니다.

  5. ble_anps.h 파일에서 CEVA 설명서에 따라 이 프로필에 필요한 모든 메시지 Handler를 정의하고 해당 기능을 만듭니다. 예를 들어 BASS의 경우 다음이 있습니다.

#define BASS_MESSAGE_HANDLER_LIST \
	DEFINE_MESSAGE_HANDLER(BASS_ENABLE_RSP, Batt_EnableRsp_Server), \
	DEFINE_MESSAGE_HANDLER(BASS_BATT_LEVEL_NTF_CFG_IND, Batt_LevelNtfCfgInd)
  1. anps 변수 환경을 struct anp_support_env_tag로 정의하고 최소한 bool enable 필드와 이 프로필에 필요한 기타 필드를 포함합니다.

  2. 모든 메시지 핸들러 기능 및 기타 기능은 ble_anps.h프로토타입 선언이 있어야 합니다.

  3. ble_anps.c 파일에서 anps_supprt_env를 선언하고 Anps_Env_Initialize() 함수로 초기화한다. 이 함수는 App_Env_Initialize()에 추가되어야 합니다.

  4. BLE_SetServiceState() 함수에서 BASS에 대한 이 예제에는 If 조건이 있습니다. 조건이 참이면 Anp_ServiceEnable_Server(ble_env.conidx)를 추가합니다. else가 대신 true인 경우,anps_support_env.enable = false를 추가하십시오.

  5. app.h에서 다음과 같이 aps에 대한 서비스 추가 기능을 작성합니다.

#define SERVICE_ADD_FUNCTION_LIST \
	DEFINE_SERVICE_ADD_FUNCTION(Batt_ServiceAdd_Server), \
	DEFINE_SERVICE_ADD_FUNCTION(Anp_ServiceAdd_Server), \
	DEFINE_SERVICE_ADD_FUNCTION(CustomService_ServiceAdd)

app.c 또는 app_process에서 ble_env.state가 APPM_CONNECTED 및 anps_support_env.enable==true에 있는 경우 무언가를 보내는 것과 같이 귀하가 생성한 모든 함수를 호출할 수 있습니다.

-> sleep,hrp,fota예제 보면서 따라해보자.


새 Custom Profiles/Services 추가

표준 서비스를 추가한 후 사용자 정의 서비스를 추가할 수 있습니다.
사용자 정의 서비스는 gattm_add_svc_req 메시지를 사용하여 추가됩니다.
여기에는 이 사용자 정의 서비스에 대해 원하는 모든 특성(속성)이 나열됩니다.
먼저 서비스 UUID를 정의한 다음 특성 UUID, CCCD(클라이언트 구성 특성) 및 특성 이름으로 기능하는 선택적 사용자 설명자와 같이 추가하려는 특성을 정의합니다.
애플리케이션이 GATTM_ADD_SVC_REQ 메시지를 보냅니다.
성공적인 응답이 수신되면 스택은 GATTM_ADD_SVC_RSP 메시지에서 시작 핸들 값을 응용 프로그램에 보냅니다.
이 시작 핸들은 요청한 서비스가 추가된 스택의 위치를 나타내며 스택에서 이 서비스의 참조 역할을 합니다.
스택에 추가하는 서비스의 특성에도 핸들 값이 있지만 이 시작 핸들 값에서 오프셋됩니다.
예를 들어 시작 핸들 값이 10인 경우 스택에서 서비스에 추가된 첫 번째 특성에 대한 핸들 값은 11입니다.

다음은 새로운 맞춤형 서비스를 추가하는 예입니다. 이 기능은 CustomService_ServiceAdd라고 하며 RSL10 소프트웨어 개발 도구의 일부입니다.

먼저 GATTM_ADD_SVC_REQ 메시지를 보냅니다. 여기에 서비스 UUID를 포함하고 추가하려는 속성(특성) 목록을 포함합니다.
이 CustomService_ServiceAdd 예에서는 Tx 및 Rx라는 두 가지 속성 그룹이 추가됩니다.
이 두 값을 사용하면 주변 장치와 중앙 장치가 양방향 통신으로 서로 값을 보낼 수 있습니다.
Tx 특성 선언이 먼저 추가됩니다. 표준적인 특성이지만 커스텀 서비스는 128비트 UUID가 필요하기 때문에 이런 식으로 추가해야 합니다. (특성 선언을 추가할 경우 표준 UUID가 필요하지만 값 특성을 추가할 때 사용자 정의 UUID를 사용해야 합니다.)
특성 선언을 추가한 후 특성 값, 클라이언트 구성 특성(CCCD), 및 사용자 설명 특성을 통해 서비스의 식별 정보를 숫자로 보는 것이 아니라 이름을 추가하고 중앙 장치에서 관찰할 수 있습니다.

add_declaration_characteristic, add_declaration_characteristic_UUID, add_declaration_characteristic_ccc 및 add_declaration_characteristic_user_description과 같은 매크로를 사용하면 이 프로세스가 더 쉬워집니다.

그런 다음 추가하는 모든 특성의 권한과 속성을 정의해야 합니다.
예를 들어, Tx 그룹의 한 특성은 Tx_value입니다.
이 특성은 중앙 장치에서 수정, 표시, 읽기 및 쓰기 요청 또는 쓰기 명령을 수신하여 쓸 수 있습니다.
특성이 읽기 또는 쓰기 요청에 응답할지 여부, 인증, 암호화, 권한 또는 보안이 필요한지 여부와 함께 이러한 속성 중 하나를 여기에서 설정할 수 있습니다.
이러한 속성은 여기에서 설정됩니다. (이 예에서는 보안, 권한 또는 인증을 사용하지 않습니다.)
권한 설정에 사용할 수 있는 매크로가 있습니다.
예를 들어 per_rd_command_enable은 읽기 명령을 활성화할 수 있는 권한을 설정합니다.
이 예의 추가 권한 특성에 대해 attribute_declaration_characteristic_UUID_128에 per_ri_enable이라는 플래그가 있습니다.
이 플래그는 이 속성의 값이 스택에 없고 애플리케이션에서 처리되어야 함을 나타냅니다.
최대 크기는 또 다른 특성입니다.
이 예와 같이 사용자 정의 길이 값의 경우 이 속성의 최대 길이를 바이트 단위로 설정해야 합니다.

모든 속성이 나열되면 애플리케이션은 GATTM_SERVICE_ADD를 보낼 수 있습니다. 다른 사용자 지정 서비스를 추가하려면 응용 프로그램이 자체 서비스 UUID 및 특성 정의가 포함된 다른 메시지를 보내야 합니다.


More About Working with Custm Services

애플리케이션이 스택에서 GATTM_ADD_SVC_RSP 응답을 수신하면 사용자 지정 서비스 환경에 시작 핸들을 저장합니다.
각 사용자 정의 서비스 속성에 대해 인덱스가 있습니다.
이러한 속성은 custom_service.h 파일에 나열되어 있기 때문입니다.
예를 들어 RSL10 응용 프로그램이 피어 장치에서 읽기 요청을 수신하면 해당 요청은 해당 핸들로 전송됩니다.
실제로 요청은 "핸들 번호 11의 값을 읽도록 요청합니다."와 같은 내용을 표시합니다. (또는 요청에 따라 다른 핸들 번호.)
핸들 값을 속성 인덱스에 매핑하려면 애플리케이션이 GATT 데이터베이스의 시작 핸들에서 1을 뺀 오프셋을 찾아야 합니다.
첫 번째 인덱스 번호인 0은 서비스 UUID용으로 예약되어 있으며 이 예의 속성은 번호 1부터 시작합니다. 따라서 시작 핸들이 번호 10에 있으면 첫 번째 속성은 시작 핸들 번호 11에 있습니다.
따라서 인덱스 이 예에서 숫자 0은 핸들 숫자 11을 가리킵니다. 속성 인덱스는 함수의 속성 번호를 기반으로 이런 방식으로 계산됩니다.
스위치 케이스를 사용하여 애플리케이션은 피어 장치 요청이 요청하는 모든 속성에 쉽게 액세스할 수 있습니다.

  • 해당 속성을 기반으로 애플리케이션은 값을 수신할 수 있습니다. 때때로 권한이 속성에 대한 요청에 대한 응답을 허용하지 않습니다. 예를 들어, 피어 장치가 사용자 설명을 변경할 수 있는 권한이 필요하지 않은 경우 쓰기 권한을 비활성화할 수 있습니다.

  • 중앙 장치를 이용하여 이 커스텀 서비스의 Rx 값을 변경하기 위해 클라이언트 장치에서 쓰기 명령 또는 쓰기 요청을 보낼 수 있으며, 스택에서 이 메시지를 수신했을 때 응용 프로그램은 GATTC_WRITE_REQ_IND를 수신했습니다.

  • 맞춤 서비스 알림을 보내려면 프로그램에서 CUSTOM_SERVICE_SEND_NOTIFICATION을 사용해야 합니다. 이를 위해 요청이 전송되는 링크 또는 연결, 이 알림이 전송되는 속성 인덱스, 값 및 이 값의 길이를 표시해야 합니다.

좋은 웹페이지 즐겨찾기