BLE NRF51822教程8 動態廣播

2021-09-13 20:58:29 字數 3294 閱讀 1373

本講接收如何實現動態廣播。

教程基於 9.0 sdk中的 uart例子。

實現動態廣播的方法是  廣播->停止廣播->修改引數->重啟廣播

所以我們通過乙個定時器來週期性的  關閉廣播然後再修改廣播資料之後再開啟廣播。

sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。

首先 在main.c中 中的advertising_init函式需要改動。

主要修改還新增了紅色部分。將 flag 改為了general。後面又將廣播超時設定為0從而實現無線廣播。

去掉了根據廣播模式來設定廣播資料的函式以及對 掃瞄響應資料的設定。

void advertising_init(void)

uint32_t      err_code;

ble_a***ata_t a***ata;

ble_a***ata_t scanrsp;

memset(&a***ata, 0, sizeof(a***ata));

a***ata.name_type          = ble_a***ata_full_name;

a***ata.flags      = ble_gap_adv_flags_le_only_general_disc_mode;

static ble_a***ata_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

a***ata.p_manuf_specific_data = &manuf_data;

err_code = ble_a***ata_set(&a***ata, null);

然後是啟動廣播函式。 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;

// initialize.

uart_init();

my_timer_handler);

buttons_leds_init(&erase_bonds);

ble_stack_init();

gap_params_init();

services_init();

advertising_init();

conn_params_init();

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會出錯。

之後燒錄程式就能看到廣播資料中的廠商自定義欄位在動態改變了

BLE NRF51822教程8 動態廣播

本講接收如何實現動態廣播。教程基於 9.0 sdk中的 uart例子。實現動態廣播的方法是 廣播 停止廣播 修改引數 重啟廣播 所以我們通過乙個定時器來週期性的 關閉廣播然後再修改廣播資料之後再開啟廣播。sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。首先 在main...

BLE NRF51822教程8 動態廣播

ble nrf51822教程8 動態廣播 2015 12 29 17 38 35 分類 嵌入式 本講接收如何實現動態廣播。教程基於 9.0 sdk中的 uart例子。實現動態廣播的方法是 廣播 停止廣播 修改引數 重啟廣播 所以我們通過乙個定時器來週期性的 關閉廣播然後再修改廣播資料之後再開啟廣播。...

BLE NRF51822教程8 動態廣播

本講接收如何實現動態廣播。教程基於 9.0 sdk中的 uart例子。實現動態廣播的方法是 廣播 停止廣播 修改引數 重啟廣播 所以我們通過乙個定時器來週期性的 關閉廣播然後再修改廣播資料之後再開啟廣播。sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。首先 在main...