BLE-NRF51822教程8-動態廣播_PHP教程

來源:互聯網
上載者:User

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例子。 實現動態廣播的方法是 廣播->停止廣播->修改參數-...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.