BLE-NRF51822教程8-动态广播
本讲接收如何实现动态广播。
教程基于 9.0 sdk中的 Uart例子。
实现动态广播的方法是 广播->停止广播->修改参数->重启广播
所以我们通过一个定时器来周期性的 关闭广播然后再修改广播数据之后再开启广播。
Sdk 9.0中的广播搞了好几个模式,做的有点麻烦,所以我对他做了比较大的改动。
首先 在main.c中 中的advertising_init函数需要改动。
主要修改还添加了红色部分。将 flag 改为了GENERAL。后面又将广播超时设置为0从而实现无线广播。
去掉了根据广播模式来设置广播数据的函数以及对 扫描响应数据的设置。
void advertising_init(void)
{
uint32_t err_code;
ble_advdata_t advdata;
ble_advdata_t scanrsp;
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = false;
advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
static ble_advdata_manuf_data_t manuf_data;
static uint8_t mydata = 0; //这里用的是静态数据
//这里做的动态广播就是每次调用这个函
//数,广播数据中的厂商定义字段都会加1
manuf_data.company_identifier = 0xffaa;
manuf_data.data.size = 1;
manuf_data.data.p_data = &mydata;
mydata++; //每次调用后加1
advdata.p_manuf_specific_data = &manuf_data;
err_code = ble_advdata_set(&advdata, NULL);
APP_ERROR_CHECK(err_code);
}
然后是启动广播函数。 Main 函数中用的是ble_advertising_start。
我们这里不用。直接实现一个自己的简单函数
void myadv_start(void){
ble_gap_adv_params_t adv_params;
adv_params.interval = 1600; //这里广播间隔设置为 1s
adv_params.timeout = 0;//这里设置0和上面的flag配合实现无线广播
adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.channel_mask.ch_37_off = 0;
adv_params.channel_mask.ch_38_off = 0;
adv_params.channel_mask.ch_39_off = 0;
adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.p_peer_addr = NULL;
adv_params.fp = BLE_GAP_ADV_FP_ANY;
adv_params.p_whitelist = NULL;
sd_ble_gap_adv_start(&adv_params);
}
之后我们做一个定时器。定时器的作用是以2s为周期 来关闭修改广播参数然后启动广播
在main 函数中做如下修改,创建一个 2s定时器 my_timer,并且开启它
int main(void)
{
uint32_t err_code;
bool erase_bonds;
uint8_t start_string[] = START_STRING;
app_timer_id_t my_timer;
// Initialize.
APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false);
uart_init();
app_timer_create(&my_timer,APP_TIMER_MODE_REPEATED,
my_timer_handler);
buttons_leds_init(&erase_bonds);
ble_stack_init();
gap_params_init();
services_init();
advertising_init();
conn_params_init();
app_timer_start(my_timer, APP_TIMER_TICKS(2000,APP_TIMER_PRESCALER), NULL);
myadv_start(); //这里用的自己定义的启动广播函数
for (;;)
{
power_manage();
}
}
然后实现自己的 定时器的溢出处理函数
void my_timer_handler(void *p_contex){
int i =50;
sd_ble_gap_adv_stop(); //关广播
advertising_init(); //修改厂商自定义字段中的数据
while(i--);
myadv_start(); //开启广播
}
这里做的动态广播是动态修改广播数据中的 厂商自定义字段。每次调用
advertising_init 函数的时候厂商自定义字段的值都会递增。在advertising_init函数中有注释说明
到这里动态广播要做的事已经做完了。
不过在uart例子中还需要做一个改动,我们创建了一个自己的timer,不过uart例子中定义的 允许使用的最大的 timer数就是它已经使用的数量,所以我们再添加自己的timer会出错。
修改办法:找到main.c文件中的APP_TIMER_MAX_TIMERS宏将其增大1就可以了
之后烧录程序就能看到广播数据中的厂商自定义字段在动态改变了
BLE-NRF51822教程8-动态广播相关推荐
- 【BLE】CC2541之动态广播加密数据
本篇博文最后修改时间:2017年03月30日,16:33. 一.简介 本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值. 二 ...
- [Telink][TLSR8251] [泰凌微][SDK3.4] 添加广播内容 和 动态广播 厂商信息
文章目录 一. 广播类型 实现动态广播的方法是: 广播->停止广播->修改参数->重启广播 二.什么是蓝牙动态广播? 1.1 前导 1.2 接入地址 1.3 报头 1.3.1 广播报 ...
- Android 动态广播与静态广播
学而时习,稳固而之心 目前推荐使用动态广播,现在已经很就没有使用过静态广播了. 动态广播与静态广播的联系 1 动态广播的速度要快于静态广播 2 静态广播的生存期可以比动态广播的长很多 在Manifes ...
- css中的单位换算_金蝶ERP入门教程:动态换算率及辅助计量单位的应用
金蝶ERP入门教程:动态换算率及辅助计量单位的应用 关注我,我将定期分享更多的ERP解决方案 如果您喜欢且觉得内容有用,请点击分享转发 如果你有什么关于ERP系统的问题和疑问,可私信联系我 大家好,我 ...
- python动态类型的坑_python进阶教程之动态类型详解
动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...
- android动态静态广播,Android BroadcastReceiver实现自定义静态广播和动态广播(黏性广播)...
思维导图: 静态广播: 当广播发出去的时候 如果接收广播的应用程序已经退出,也能接收广播: 发送者代码: package com.example.g160628_android_21_sender; ...
- BroadcastReceiver之动态广播 demo+笔记
在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤接收并响应的一类组件(任何一个程序都能接 ...
- MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 原文:MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇 ...
- Android在Service中注册动态广播接收者
Android广播分为动态.静态广播. 广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高 ...
最新文章
- 如何查询云服务器的操作系统,如何查询云服务器的操作系统
- Linux中java项目环境部署,简单记录一下
- WCF与WebService的区别
- 终于学会上传图片了\( ̄︶ ̄*\))
- layui表头样式_layui中table表头样式修改方法
- 基于External-DNS的多集群Ingress DNS实践
- JavaWeb项目实战(2)安装JDK和Tomcat以及Eclipse构造开发环境
- [短评] 技术研发向市场运营让步
- 中的live_张杰两首歌曲连唱彰显LIVE实力 青春演说温暖人心
- firebug的调试,console
- 快排-Python实现
- 企业信息化规划的重要性
- ArduPilot添加新的惯导方案
- Unity3D常用的生命周期函数
- spring boot 三种类型事物实现说明
- 戴愫-有效提升与陌生人的社交能力
- Flashback Query, Flashback Version Query
- android 文件名编码,安卓删除纯乱码文件名的文件
- Codeforces Round#466 E. Cashback
- 酒桌上的潜规则,男人必学,女人必知
热门文章
- 面试「计算机操作系统」知识点大集合!
- Java 8 开发的 4 大顶级技巧
- 到底是Java好还是Python好?
- 假笨说-协助美团kafka团队定位到的一个JVM Crash问题
- Java线程详解(17)-原子量
- Android --- TabLayout 每一个选项卡前面加图标
- table表格的两个实现方法(怎样消除内部边框的间距)
- kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
- 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 6-7: malformed
- 成功解决on line , but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details