본문으로 바로가기

[ble_app_beacon ] 프로젝트 분석

category Nordic_nRF52 2022. 4. 5. 20:31

 : ble_app_beacon 프로젝트는  Beacon Transmitter 에 대한  예제로서

보내지는 정보는 UUID(16) , Major(2) /Minor(2) value , RSSI(1) 등이 ADV 에 포함되어 있습니다.

 

 

아래그림은 nRF_Connect 앱을 통해 SCANNER 탭에 보여진 화면입니다.

 

 

==>  RAW data 를 읽어보면 다음과 같습니다.

 

 

1> 프로젝트위치 및 개요

   : \\InstallFolder\examples\ble_peripheral\ble_app_beacon 

     Beacon Transmitter Sample Application

 

2> Nordic Document

  아래 링크 참조

https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.0.2/ble_sdk_app_beacon.html

 

nRF5 SDK v17.0.2: Beacon Transmitter Sample Application

This example requires one of the following SoftDevices: S112, S132, S140 Important: Before you run this example, make sure to program the SoftDevice. The Beacon Transmitter Sample Application is an example that implements a transmitter beacon using the har

infocenter.nordicsemi.com

 

3> 프로젝트 안에서 사용되는 Beacon 형식  (iBeacon 포맷을 따르고 있습니다.)

#define APP_BEACON_INFO_LENGTH          0x17
uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH] =    /**< Information advertised by the Beacon. */
{
    APP_DEVICE_TYPE,     // Manufacturer specific information. Specifies the device type in this
                         // implementation.
    APP_ADV_DATA_LENGTH, // Manufacturer specific information. Specifies the length of the
                         // manufacturer specific data in this implementation.
    APP_BEACON_UUID,     // 128 bit UUID value.
    APP_MAJOR_VALUE,     // Major arbitrary value that can be used to distinguish between Beacons.
    APP_MINOR_VALUE,     // Minor arbitrary value that can be used to distinguish between Beacons.
    APP_MEASURED_RSSI    // Manufacturer specific information. The Beacon's measured TX power in
                         // this implementation.
};

 

4> Advertising 소스 중 주요부분 첨부합니다.

/**@brief Byte array type. */
typedef struct
{
    uint16_t  size;                 /**< Number of array entries. */
    uint8_t * p_data;               /**< Pointer to array entries. */
} uint8_array_t;

typedef struct
{
    uint16_t                     company_identifier;                  /**< Company identifier code. */
    uint8_array_t                data;                                /**< Additional manufacturer specific data. */
} ble_advdata_manuf_data_t;

void advertising_init(void)
{
    ~~~~ 중략 ~~~~
    ble_advdata_manuf_data_t manuf_specific_data;
    manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER;
    manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
    manuf_specific_data.data.size   = APP_BEACON_INFO_LENGTH;
    ~~~~ 중략 ~~~~

    // Build and set advertising data.
    memset(&advdata, 0, sizeof(advdata));

    advdata.name_type             = BLE_ADVDATA_NO_NAME;
    advdata.p_manuf_specific_data = &manuf_specific_data;
    ~~~~ 중략 ~~~~
    
    // Initialize advertising parameters (used when starting advertising).
    memset(&m_adv_params, 0, sizeof(m_adv_params));

    m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;
    m_adv_params.p_peer_addr     = NULL;    // Undirected advertisement.
    m_adv_params.filter_policy   = BLE_GAP_ADV_FP_ANY;
    m_adv_params.interval        = NON_CONNECTABLE_ADV_INTERVAL;
    m_adv_params.duration        = 0;       // Never time out.

    err_code = ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);
    err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);
}    

void advertising_start(void)
{
    ret_code_t err_code;
    err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG);
}

 

5> UICR 값 사용하기

  : uicr 레지스터를 사용하면 기존 동일한 이미지를 사용해 major,minor 값을 변경 할수 있습니다. 

 5-1>  main.c 에 define문 추가

  #define USE_UICR_FOR_MAJ_MIN_VALUES

 5-2> UICR 값 Write 하기

  :  nrfjprog -f nrf52 --memwr 0x10001080 --val 0xabcd0105

  : nordic document 의 --snr 옵션은 사용안해도 동작하네요.

 

 >> uicr 레지스터 맵은 아래의 <기타> 항목 참조 하세요.

 

 5-3> nRF Connect 앱을 통한 변경사항 확인하기

 

 

 

 

< 기타> 

 A> UICR  (User Information Configuration registers)

  >> NVMC : Non-Volatile Memory Controller

 

   Memory Map  (0x10001000)

 

   UICR  Write/ Erase 관련 datasheet 내용 

     : UICR Write 후 Reset 을 해야 적용이 됩니다.

  >> NVMC Base address : 0x4001_E000

 

 

UICR Base address :0x1000_1000

 

~~~ 아래쪽에 보면 CUSTOMER[] 레지스터가 있습니다.

    >> 소스에서는 0x1000_1080 번지 사용합니다.

 

 B> Beacon 형식

  ▶ 기본지식

  Link Layer packet format

 

위 포맷중 PDU 파트 부분에 대한  Advertisng PDU 포맷일 경우 다음과 같고

 

추가로 ADV_NONCONN_IND PDU 형식은 아래와 같습니다.

 

 

  ▶ iBeacon (30B)

 nordic 예제가 여기에 해당합니다.

위 내용을 해석 해보면

RAW data (27B)

1A FF 59 00 02 15 01 12 23 34 45 56 67 78 89 9A

AB BC CD DE EF F0 AB CD 01 05 C3

 

ADV Header  (2B)   :  1A FF

  1A : Length , FF : Vendor type

Company ID  (2B)   :  59 00

iBeacon Type  (1B)  : 02

iBeacon Length (1B): 15

UUID (16B)  : 01 12 23 34 45 56 67 78 89 9A AB BC CD DE EF F0

Major number (2B) : AB CD

Minor number (2B) : 01 05

TX Power (1B) : C3

 

 

  ▶ EddyStone (31B)

  

위 포맷중 Flag 3B 제외한 포맷

  ▶ AltBeacon (31B)

  : Flag 3B 제외한 포맷

 

 

 

 

그럼 오늘도 수고하세요.

 

반응형