【笔记】nrf52832广播使用–厂商自定义数据应用
需求:
1)使用蓝牙不停发送ble广播,发送自定义的数据,并每一秒更新自定义数据。
2)设置不同的发射功率、广播间隔、广播名称
1、初始化
使用nordic官方sdk17版本,打开一个ble串口用例。首先在main函数初始化ble,这个sdk已经给我们准备好了。
int main(void) { log_init(); timers_init(); flash_init(); buttons_leds_init(&erase_bonds); power_management_init(); //电源管理 ble_stack_init(); //协议栈初始化 gap_params_init(); //gap配置初始化 gatt_init(); //gatt初始化 advertising_init(); //广播参数配置 services_init(); //服务初始化 conn_params_init(); // 连接参数初始化 peer_manager_init(); //连接参数更新 tx_power_set(-20); //设置发射功率 application_timers_start(); //开启定时器 advertising_start(erase_bonds); //开启广播 read_flash_sw_mode(); //读取flash中 存储的数据 // Enter main loop. for (;;) { idle_state_handle(); } }
2、设置一个软件定时器,更新数据
创建定时器app_timer_create(),设置为循环模式,然后定时1s启动它。在定时回调中,我们来更新广播自定义数据。
需要注意,更新自定义数据需要先停止广播,然后把自定义数据进去,再重新开始广播。这里停止直接调用协议栈的
sd_ble_gap_adv_stop()函数。
static void adv_data_update(uint8_t *p_data){ sd_ble_gap_adv_stop(m_advertising.adv_handle); manuf_spec_data.data.p_data=p_data; manuf_spec_data.data.size = 1; init.advdata.p_manuf_specific_data = &manuf_spec_data; ret_code_t err_code = ble_advertising_init(&m_advertising, &init); APP_ERROR_CHECK(err_code); ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG); err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST); APP_ERROR_CHECK(err_code); } static void TIME_timeout_handler1(void * p_context) { UNUSED_PARAMETER(p_context); static uint8_t i=0; i++; switch(i){ case 1: adv_data_update(my_adv_G_data); break; case 2: adv_data_update(my_adv_B_data); break; case 3: i=0; adv_data_update(my_adv_R_data); break; default:break; } }
3、隐藏厂商ID
完成以上步骤后,基本完成了需求1),但是有个厂商的ID会占有数据位,这不是我们需要的。
通过修改库函数来把它隐藏。
首先进入到ble_advertising_init(),找到ble_advdata_encode()函数,找到自定义数据的代码:
// Encode Manufacturer Specific Data. if (p_advdata->p_manuf_specific_data != NULL) { err_code = manuf_specific_data_encode(p_advdata->p_manuf_specific_data, p_encoded_data, p_len, max_size); VERIFY_SUCCESS(err_code); }
然后,继续进入manuf_specific_data_encode()函数,去掉它的数据长度:
再去掉厂商数据:
这样,我们的自定义数据,就不再显示厂商ID了:
4、发送功率、广播间隔和广播名字
这三个参数修改,不需要停止广播:
tx_power_set(4); //设置功率 init.config.ble_adv_fast_interval = 35; //设置发送间隔 ret_code_t err_code = sd_ble_gap_device_name_set(&sec_mode, //修改名字 (const uint8_t *)DEVICE_NAME3, strlen(DEVICE_NAME3));
其中发送功率是直接调用协议栈API
static void tx_power_set(int8_t power) { ret_code_t err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_advertising.adv_handle, power); APP_ERROR_CHECK(err_code); }
power的设置范围为固定值,可以查看协议栈文档,如下

完成需求。