Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> BLE-NRF51822教程8-動態廣播

BLE-NRF51822教程8-動態廣播

編輯:關於android開發

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就可以了


之後燒錄程序就能看到廣播數據中的廠商自定義字段在動態改變了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved