BLE-NRF51822教程8-动态广播
本講接收如何實現(xiàn)動態(tài)廣播。
教程基于?9.0 sdk中的?Uart例子。
?
實現(xiàn)動態(tài)廣播的方法是??廣播->停止廣播->修改參數(shù)->重啟廣播
?
所以我們通過一個定時器來周期性的??關閉廣播然后再修改廣播數(shù)據(jù)之后再開啟廣播。
?
Sdk 9.0中的廣播搞了好幾個模式,做的有點麻煩,所以我對他做了比較大的改動。
首先 在main.c中 中的advertising_init函數(shù)需要改動。
?
主要修改還添加了紅色部分。將?flag?改為了GENERAL。后面又將廣播超時設置為0從而實現(xiàn)無線廣播。
去掉了根據(jù)廣播模式來設置廣播數(shù)據(jù)的函數(shù)以及對 掃描響應數(shù)據(jù)的設置。
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;? //這里用的是靜態(tài)數(shù)據(jù)
??????????????????????????? //這里做的動態(tài)廣播就是每次調用這個函
??????????????????????????? //數(shù),廣播數(shù)據(jù)中的廠商定義字段都會加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);
}
?
?
?
?
?
然后是啟動廣播函數(shù)。?Main?函數(shù)中用的是ble_advertising_start。
我們這里不用。直接實現(xiàn)一個自己的簡單函數(shù)
?
void myadv_start(void){
???
??? ble_gap_adv_params_t adv_params;
???
??? adv_params.interval = 1600; //這里廣播間隔設置為?1s
????adv_params.timeout = 0;//這里設置0和上面的flag配合實現(xiàn)無線廣播
??? 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為周期 來關閉修改廣播參數(shù)然后啟動廣播
?
?
?
?
?
?
?
?
在main?函數(shù)中做如下修改,創(chuàng)建一個?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(); //這里用的自己定義的啟動廣播函數(shù)
?
??? for (;;)
??? {
??????? power_manage();
??? }
}
?
?
?
?
然后實現(xiàn)自己的 定時器的溢出處理函數(shù)
?
void my_timer_handler(void *p_contex){
??? int i =50;
??? sd_ble_gap_adv_stop();?? //關廣播
??? advertising_init();????? //修改廠商自定義字段中的數(shù)據(jù)
??? while(i--);
??? myadv_start();?????????? //開啟廣播
}
?
這里做的動態(tài)廣播是動態(tài)修改廣播數(shù)據(jù)中的 廠商自定義字段。每次調用
advertising_init 函數(shù)的時候廠商自定義字段的值都會遞增。在advertising_init函數(shù)中有注釋說明
?
?
?
到這里動態(tài)廣播要做的事已經(jīng)做完了。
不過在uart例子中還需要做一個改動,我們創(chuàng)建了一個自己的timer,不過uart例子中定義的 允許使用的最大的?timer數(shù)就是它已經(jīng)使用的數(shù)量,所以我們再添加自己的timer會出錯。
?
修改辦法:找到main.c文件中的APP_TIMER_MAX_TIMERS宏將其增大1就可以了
?
之后燒錄程序就能看到廣播數(shù)據(jù)中的廠商自定義字段在動態(tài)改變了
總結
以上是生活随笔為你收集整理的BLE-NRF51822教程8-动态广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVC和PendSV
- 下一篇: ESP32 flash容量配置