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;
staticble_advdata_manuf_data_t manuf_data;
staticuint8_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_tadv_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_tmy_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就可以了
之後燒錄程式就能看到廣播資料中的廠商自訂欄位在動態改變了
http://www.bkjia.com/PHPjc/1088147.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1088147.htmlTechArticleBLE-NRF51822教程8-動態廣播 本講接收如何?動態廣播。 教程基於 9.0 sdk中的 Uart例子。 實現動態廣播的方法是 廣播->停止廣播->修改參數-...