本讲接收如何实现动态广播。

教程基于 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-动态广播相关推荐

  1. 【BLE】CC2541之动态广播加密数据

    本篇博文最后修改时间:2017年03月30日,16:33. 一.简介 本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值. 二 ...

  2. [Telink][TLSR8251] [泰凌微][SDK3.4] 添加广播内容 和 动态广播 厂商信息

    文章目录 一. 广播类型 实现动态广播的方法是: 广播->停止广播->修改参数->重启广播 二.什么是蓝牙动态广播? 1.1 前导 1.2 接入地址 1.3 报头 1.3.1 广播报 ...

  3. Android 动态广播与静态广播

    学而时习,稳固而之心 目前推荐使用动态广播,现在已经很就没有使用过静态广播了. 动态广播与静态广播的联系 1 动态广播的速度要快于静态广播 2 静态广播的生存期可以比动态广播的长很多 在Manifes ...

  4. css中的单位换算_金蝶ERP入门教程:动态换算率及辅助计量单位的应用

    金蝶ERP入门教程:动态换算率及辅助计量单位的应用 关注我,我将定期分享更多的ERP解决方案 如果您喜欢且觉得内容有用,请点击分享转发 如果你有什么关于ERP系统的问题和疑问,可私信联系我 大家好,我 ...

  5. python动态类型的坑_python进阶教程之动态类型详解

    动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...

  6. android动态静态广播,Android BroadcastReceiver实现自定义静态广播和动态广播(黏性广播)...

    思维导图: 静态广播: 当广播发出去的时候 如果接收广播的应用程序已经退出,也能接收广播: 发送者代码: package com.example.g160628_android_21_sender; ...

  7. BroadcastReceiver之动态广播 demo+笔记

    在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤接收并响应的一类组件(任何一个程序都能接 ...

  8. MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航

    MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 原文:MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇 ...

  9. Android在Service中注册动态广播接收者

    Android广播分为动态.静态广播. 广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高 ...

最新文章

  1. 如何查询云服务器的操作系统,如何查询云服务器的操作系统
  2. Linux中java项目环境部署,简单记录一下
  3. WCF与WebService的区别
  4. 终于学会上传图片了\( ̄︶ ̄*\))
  5. layui表头样式_layui中table表头样式修改方法
  6. 基于External-DNS的多集群Ingress DNS实践
  7. JavaWeb项目实战(2)安装JDK和Tomcat以及Eclipse构造开发环境
  8. [短评] 技术研发向市场运营让步
  9. 中的live_张杰两首歌曲连唱彰显LIVE实力 青春演说温暖人心
  10. firebug的调试,console
  11. 快排-Python实现
  12. 企业信息化规划的重要性
  13. ArduPilot添加新的惯导方案
  14. Unity3D常用的生命周期函数
  15. spring boot 三种类型事物实现说明
  16. 戴愫-有效提升与陌生人的社交能力
  17. Flashback Query, Flashback Version Query
  18. android 文件名编码,安卓删除纯乱码文件名的文件
  19. Codeforces Round#466 E. Cashback
  20. 酒桌上的潜规则,男人必学,女人必知

热门文章

  1. 面试「计算机操作系统」知识点大集合!
  2. Java 8 开发的 4 大顶级技巧
  3. 到底是Java好还是Python好?
  4. 假笨说-协助美团kafka团队定位到的一个JVM Crash问题
  5. Java线程详解(17)-原子量
  6. Android --- TabLayout 每一个选项卡前面加图标
  7. table表格的两个实现方法(怎样消除内部边框的间距)
  8. kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
  9. 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 6-7: malformed
  10. 成功解决on line , but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details