需求:

  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的设置范围为固定值,可以查看协议栈文档,如下
完成需求。

最新文章

  1. libreoffice转换文件为pdf文件乱码问题解决办法
  2. MSSQL PIVOT 实现行列转置
  3. 友盟推送里面的Alias怎么用?可以理解成账号吗?
  4. Section 1.4 Packing Rectangles
  5. Spring中配置文件applicationContext.xml配置详解
  6. 在git上下载的Asp.Net MVC 4源码怎么编译?
  7. Compiling Xen-4.4 From Source And Installing It On Ubuntu Server (Amd-64)
  8. makefile中的patsubst
  9. .net通用权限框架B/S(一)
  10. VS2010添加默认路径,库以及Lib
  11. 同步特定源代码到 omni_rom源代码目录里面
  12. Swiper.js使用遇到的问题总结onSlideChangeEnd回调偶尔触发,偶尔不触发等;
  13. 10.application对象
  14. 【NO.9】jmeter - 一个完整的接口测试的脚本
  15. MySQL 性能优化的最佳20多条经验分享(二)(转)
  16. linux服务器安装pyspide关于rgnutls.h: No such file or directory 的解决方案
  17. python序列类型字符串的方法L.index()与L.find()区别
  18. Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)
  19. 如何安装/卸载workflow manager 1.0
  20. django 实现文件下载功能

热门文章

  1. 达梦产品技术支持-DM8-数据库安装
  2. vue的二级联动,数据是从php获取到的
  3. Python基础笔记2-ruamel.yaml读写yaml文件
  4. Istio多集群(1)-多控制面
  5. day53 Pyhton 前端04
  6. day22 Pyhton学习 re模块和正则表达式
  7. Java常见的一些经典面试题(附答案解析)
  8. 运行bee run之后出现的错误以及解决方法Failed to build the application:
  9. spring boot: filter/interceptor/aop在获取request/method参数上的区别(spring boot 2.3.1)
  10. 第三十五章 Linux常规练习题(二)参考答案