: 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
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 제외한 포맷
그럼 오늘도 수고하세요.
'Nordic_nRF52' 카테고리의 다른 글
[secure_bootloader ] 프로젝트 분석 (0) | 2022.04.11 |
---|---|
[ble_app_cts_c ] 프로젝트 분석 (0) | 2022.04.07 |
[ble_app_interactive ] GettickCount() 만들기 (0) | 2022.04.04 |
[nRF52 ] NRF_LOG 출력 UART 에서 RTT 로 변경하기 (0) | 2022.03.25 |
[nRF52 ] ble_app_interactive 프로젝트를 이용한 ble_app_bms 장치 통신하기 (0) | 2022.03.24 |