需求:

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

【笔记】nrf52832广播使用--厂商自定义数据应用的更多相关文章

  1. 基于Netty的RPC架构学习笔记(十):自定义数据包协议

    文章目录 数据包简介 粘包.分包现象 数据包格式 举个

  2. Android(java)学习笔记178:BroadcastReceiver之 自定义广播

    广播使用:               电台:对外发送信号.---------电台发送广播(可以自定义)               收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...

  3. Android(java)学习笔记121:BroadcastReceiver之 自定义广播

    广播使用:               电台:对外发送信号.---------电台发送广播(可以自定义)               收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...

  4. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  5. 厂商自定义USB设备固件程序及特性

    通过前面的学习,大家应该对USB固件程序结构有了比较深的认识,现在再来详细说说固件里决定设备识别成厂商自定义USB设备的地方有哪些,或者说厂商自定义USB设备的固件特性有哪些. 之前不止一次说过学习U ...

  6. TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵

    TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵 神经元模型:用数学公式比表示为:f(Σi xi*wi + b), f为激活函数 神经网络 是以神经元为基本单位构成的 激 ...

  7. android菜鸟学习笔记26----Android广播消息及BroadcastReceiver

    1.广播类型: Android中的广播有两种类型:标准广播和有序广播.其中,标准广播是完全异步发送的广播,发出之后,几乎所有的广播接收者都会在同一时刻收到这条广播消息,因而,这种类型的广播消息是不可拦 ...

  8. Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer

    原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  9. 使用 data-* 属性来嵌入自定义数据

    1. HTML 实例 <ul> <li data-animal-type="bird">Owl</li> <li data-animal- ...

随机推荐

  1. node-macaddress

    下载 node-macaddressnode-macaddress 检索Linux.OS X和Windows中的MAC地址. 关于MAC地址的一个常见误解是,每个主机只有一个MAC地址, 虽然一个主机 ...

  2. 使用MVC 5、Web API 2、KnockoutJS、Ninject和NUnit开发、架构和测试Web应用程序

    做一名微软软件开发人员就像在国际煎饼屋订早餐一样.每道菜都有一堆煎饼,你必须从各种各样的煎饼和糖浆口味中选择.对于web应用程序,解决方案堆栈是一组软件子系统或组件,用于交付功能完整的解决方案(无论是 ...

  3. 小白使用Hystrix

    Hystrix是什么东西?百度一下: 没错,hystrix是豪猪的意思,作为SpringCloud微服务系统中保持服务稳定的重要组件,正如它的名字一样,它对整个系统起到了保护的作用. 在许多文章当中把 ...

  4. java基础知识总结(续写)

    1.两个容易搞混的C盘文件夹 文件名 描述 Progrm Files 默认存储的64位软件 Progrm Files(x86) 默认存储32位软件 2.常用基础DOS命令(Windows+R打开命令) ...

  5. 飞翔---------双重线性dp

    题目: 鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧.于是,他们决定举办一场比赛,比赛的地方将在一个迷宫之中. 这些鹰的起始点被设在一个N*M矩阵的左下 ...

  6. kubernetes:用kubeadm管理token(kubernetes 1.18.3)

    一,token的用途: 1,token是node节点用来连接master节点的令牌字串, 它和ca证书的hash值是把一台node节点加入到kubernetes集群时要使用的凭证 2, 通过kubea ...

  7. CentOS 8 安装 oniguruma 和 oniguruma-devel

    一,oniguruma是什么? oniguruma是一个处理正则表达式的库,我们之所以需要安装它, 是因为在安装php7.4的过程中,mbstring的正则表达式处理功能对这个包有依赖性, 所以我们要 ...

  8. 第二十三章 Firewalld的防火墙

    一.防火墙基本概述 在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理 ...

  9. 【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式

    前提条件 当我们观察到SF中某一个节点出现CPU不正常的情况,但是由于不能肉眼长期观察,所以可以通过开启Performance Monitor的方式来获取每一个进程的%Processer Time的方 ...

  10. Java8中Stream 的一些用法

    数据结构和数据准备 @Data @AllArgsConstructor @NoArgsConstructor static class StreamItem { Integer id; String ...