BLE-NRF51822教程9-动态广播

来源:互联网 发布:win7网络图标打不开 编辑:程序博客网 时间:2024/06/11 13:04

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

教程基于 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就可以了


之后烧录程序就能看到广播数据中的厂商自定义字段在动态改变了

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 对治安处罚光罚款不拘留怎么办 打架和解后警察不给消案怎么办 12个人片诈骗刑拘了28天怎么办 交警拘留几天后还是没钱赔偿怎么办 平安车主信用卡车牌号填错了怎么办 起诉借钱的人逮起来了怎么办 在法院查不到坐牢人的档案怎么办 人被冤枉敲诈勒索进看守所了怎么办 打架被拘留孩子怎么办三周了 技师被拘留她的家人该怎么办 我是担保人贷款人跑了我该怎么办 公司依旷工理由辞退我该怎么办 试工两天被辞退了不发工资怎么办 员工在单位被打监控调不出来怎么办 老师罚做60张试卷家长该怎么办 孩子在幼儿园被老师打该怎么办 孩子被孩子打了老师该怎么办? 法院判决书下来后看守所不收怎么办 因病看守所不收押发院判了怎么办 现在显示还在看守所羁押需要怎么办 嫖了N多年丈夫让我怎么办 预约考试的登录密码忘了怎么办 人进了看守所信用卡没还怎么办 上海租房人放2个麻将台怎么办 南宁公租房住满5年后怎么办 合伙买房时如果出售意见不合怎么办 老旧小区改造下水一楼不同意怎么办 老旧小区下水改造没改怎么办 替公司租房子中介不退押金怎么办 想在昆山找合租房的该怎么办 链家二手房价钱买贵了怎么办 拿私人房产证抵押借钱不还怎么办 在借贷宝里借钱不还怎么办 出租屋的大门感应钥匙弄丢了怎么办 法院拍卖的房子房主不配合怎么办 租的房子如果房主卖了怎么办 房东把门锁换了里面的东西怎么办 房租没到期房东把门锁换了怎么办 租了三年店面房东违反了合同怎么办 学生登录教务系统的密码忘记怎么办 铜陵无牌助力车被交警查到怎么办