- DEMO下载地址
https://download.csdn.net/download/mygod2008ok/12740643
- 定义广播所需要的变量
static ble_gap_adv_params_t adv_params;
static ble_gap_adv_data_t advdata_enc;
static ble_advdata_t advdata;
static ble_advdata_t rspdata;
static ble_advdata_manuf_data_t m_spec_data; // ADV厂商广播变量
static uint8_t s_specData[2]; // ADV厂商广播数据数组
static ble_advdata_manuf_data_t m_spec_rspdata; // rsp厂商广播变量
static uint8_t s_specrspData[20]; // rsp厂商广播数据数组
ble_uuid_t adv_uuids[] =
{
{BLE_UUID_HEART_RATE_SERVICE, BLE_UUID_TYPE_BLE},
};
- 广播初时化函数,上电仅调用一次
/**@brief Advertising functionality initialization.
*
* @details Encodes the required advertising data and passes it to the stack.
* Also builds a structure to be passed to the stack when starting advertising.
*/
static void advertising_init(void)
{
uint32_t err_code;
static uint8_t advdata_buff[BLE_GAP_ADV_SET_DATA_SIZE_MAX];
uint16_t advdata_buff_len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
static uint8_t rspdata_buff[BLE_GAP_ADV_SET_DATA_SIZE_MAX];
uint16_t rspdata_buff_len = BLE_GAP_ADV_SET_DATA_SIZE_MAX;
uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
// Build and set advertising data.
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = false;
advdata.flags = flags;
#if UUID_BROADCAST_ENABLED
advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
advdata.uuids_complete.p_uuids = adv_uuids;
#endif
//-----------------------广播指定数据-----------------------------------------
#if SPEC_DATA_FLAG_ENABLED
m_spec_data.company_identifier = COMPANY_IDENTIFIER_ID;
s_specData[0] = 0;
s_specData[1] = 60;
m_spec_data.data.p_data = s_specData;
m_spec_data.data.size = sizeof(s_specData);
advdata.p_manuf_specific_data = &m_spec_data;
#endif
err_code = ble_advdata_encode(&advdata, advdata_buff, &advdata_buff_len);
APP_ERROR_CHECK(err_code);
memset(&rspdata, 0, sizeof(rspdata));
m_spec_rspdata.company_identifier = COMPANY_IDENTIFIER_ID;
m_spec_rspdata.data.p_data = s_specrspData;
m_spec_rspdata.data.size = sizeof(s_specrspData);
for(uint8_t i=0; ievt.gap_evt.params.adv_set_terminated.reason == BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT) { // NRF_LOG_INFO("BLE_GAP_EVT_ADV_SET_TERMINATED"); #if SPEC_DATA_FLAG_ENABLED beacon_advertising_init(); // 厂商数据广播更新 #else advertising_start(); #endif //NRF_LOG_INFO("BLE_START2=%d",s_powerOffFlag); // Go to system-off mode (this function will not return; wakeup will cause a reset) // err_code = sd_power_system_off(); // APP_ERROR_CHECK(err_code); } break;
......
}
}
- 厂商数据内容更新
- ADV厂商数据内容更新,操作更新specData数组里的内容即可
- rsp厂商数据内容更新,操作更新s_specrspData数组里的内容即可
- 运行结果效果图
