[藍牙] 二、藍牙BLE協議及架構淺析&&基於廣播超時待機說廣播事件

 

 

第一章 BLE基本概念瞭解

 

1、藍牙4.0和BLE區別
 
  藍牙4.0是一種應用很是普遍、基於2.4G射頻的低功耗無線通信技術。藍牙低功耗(Bluetooth Low Energy ),人們又常稱之爲BlueTooth Smart,是由SIG( the Bluetooth Special Interest Group) 在2010年6月起草,在原有標準的藍牙4.0核心協議上添加的一種低功耗技術。
  藍牙低功耗不等同於藍牙4.0,只是藍牙4.0的一個分支。藍牙4.0是藍牙3.0+ HS(高速藍牙)規範的補充,專門面向對成本和功耗都有較高要求的無線方案,可普遍用於衛生保健、體育健身、家庭娛樂、安全保障等諸多領域。伴隨着智能穿戴、智能硬件的興起,BLE的應用愈來愈普遍,已經深刻到咱們的平常生活種的方方面面。
 
2、BLE的特色
 
1)快速地創建鏈接。
2)小數據包。一個數據包最多隻包含20個字節。
3)發送和接收持續時間短。
4)儘可能少的工做時間,儘可能快地進入休眠模式。
5)超低的峯值電流和待機電流。
6)超長的待機時間。
 
以上特色使得BLE很是適合用在短距離、低延遲、小數據量的應用場合。
也正是因爲這個緣由,使得由一顆CR1632的鈕釦電池的BLE設備能夠續航半年至一年以上。
 
3、單模和雙模
 
  藍牙4.0包含兩個內容:傳統藍牙(CLASSIC)和低功耗(LE)。
  咱們經常使用的藍牙芯片例如CC2540、NRF5182二、QN9020、CSR1000等都只支持藍牙低功耗(BLE),因此咱們稱之爲單模芯片;而支持傳統藍牙和藍牙低功耗的IC通常是手機、平板和PC機上的芯片組。咱們稱之爲雙模芯片。固然,單顆支持傳統藍牙和藍牙低功耗的芯片好像有些廠家也有,只是不太常見。
  傳統藍牙能夠用來鏈接藍牙耳機,也能夠鏈接支持SPP協議的藍牙模塊;藍牙低功耗能夠用來鏈接外部的智能外設。藍牙低功耗技術制定的初衷是爲了最大程度上延長藍牙設備的續航時間,這就是爲何通常常見的穿戴式設備不支持語音傳輸,只在一些間歇式、數據量小的場合應用的緣由。
 
       注:有的同窗可能會問,假如我必定要用BLE傳音頻呢?不考慮功耗和續航時間的話固然能夠,可是不推薦這樣作。
 
注:來自..\nrf51822\nRF51822EK_TM配套資料\實戰教程\(1)初識藍牙低功耗1
 
 
 
第二章 探討BLE軟件體系結構
 
4、應用層和協議棧
 
 
 
nRF51822 SOC BLE的軟件分爲上下2部分:
 
1) 應用部分(APPLICATION)
  這部分NORDIC公司是以SDK的形式提供的。SDK裏面包含心率、防丟、電池電量等常見的BLE profiles。開發者能夠把SDK做爲藍本,在此基礎上進行修改、移植、開發本身的應用程序。
 
2) 藍牙協議棧部分(SOFTDEVICE)
  藍牙協議棧是nRF51822實現藍牙功能的關鍵。這部分NORDIC公司只提供HEX文件,不提供源代碼。nRF51822的藍牙協議棧有如下幾種:
a)S110。這個是咱們常常用到的從協議棧。安裝好SDK之後,在安裝目錄下的S110文件裏面全部的項目工程工程源代碼都是與之對應的。S110有不少個版本,並且還在不斷升級,須要注意的是,必須保證S110跟SDK的版本是匹配的。
b)S120。這個是從協議棧。安裝好SDK之後,能夠在安裝目錄下的S120文件夾裏面找到對應的源代碼。開發者也須要注意版本匹配問題。
c)S130。這個是主從一體的協議棧。官方提供了一個DEMO程序。
 
注:應用部分和協議棧部分是相互獨立的,它們之間經過API接口函數進行通信。
 
 
5、BLE協議棧
 
5.一、數據鏈路層的功能:
  數據鏈路層負責廣播、掃描、鏈接的創建和維護。
 
5.二、數據鏈路層定義了4個角色:
1) scaner和advertiser
2) master和advertiser
 
  在創建鏈接以前,scanner(手機、平板、PC)負責掃描、發起掃描請求和發起鏈接請求;而 advertiser(智能外設)任務是發起廣播、相應掃描請求信號、響應鏈接請求進而跟scanner端創建連 接。數據鏈路層同時也負責將各類數據包按正確的數據格式組織起來,正確地發送到對方。創建連 接之後scanner被稱爲master,advertiser被稱爲slave.
 
5.三、數據鏈路層的2種信道:
1)廣播信道:提供給尚未創建鏈接的藍牙設備提供發射廣播、掃描、創建鏈接的信道。BLE有3個 廣播信道:3七、3八、39,在每個廣播事件發生時,advertiser分別在這3個信道上各發送一次廣播信 號。傳統藍牙的廣播信道有16-32個,而BLE只有3個,這就是爲何BLE的廣播時間比較短的緣由。
2)數據信道:提供給已經創建藍牙鏈接的master和slave端提供可靠的數據通訊信道。BLE規定,數 據信道有37個。爲增強通信的可靠性,避開干擾,BLE設備經過自適應跳頻的方式在這37個信道上傳 輸數據。
 
nRF51822採用的是Random Static address,在啓動的時候協議棧從FICR裏面讀取做爲設備的藍牙地址.若是用戶須要使用Public address,則須要使用sd_ble_gap_address_set()這個函數從新設定藍牙地址。
 
5.四、幀格式:
 
 
1) Preamble:前導碼,廣播接收端能夠用來進行同步和自動增益控制(AGC)。在廣播幀中Preamble固定爲「01010101「。
2) Access Address:在廣播幀中Access Address固定爲0x8E89BED6。
3) PDU Header: 用來表示不一樣類型的幀。
A) 以ADV_開頭的幀表示該幀是廣播幀,是由advertiser(藍牙外設)發出的,它們有4種類型,分別用在不一樣的藍牙設備上面。
B) ADV_SCAN_IND爲掃描幀,是由scanner(手機、平板、PC)發出的。
C) ADV_SCAN_REQ爲掃描請求幀,是由scanner(手機、平板、PC)發出的。只在scanner想從advertiser獲取更多的廣播數據的時候才由scanner發出。相應的,當ADV_SCAN_REQ被髮出之後,advertiser
會以SCAN_RSP做爲迴應。
D) SCAN_RSP爲ADV_SCAN_ REQ的迴應。
E) CONNECT_REQ爲scanner向advertiser發起的創建鏈接的請求。
F) Res爲保留字段,不用理會。
G) TxAdd、RxAdd 用來表示發送該廣播幀的藍牙設備的藍牙地址類型。1表示random address 0表示public address。藍牙地址的種類咱們在前一節已敘述。
H) Length 表示後面PDU Payload的大小。
4) PDU Payload 爲廣播的實際載荷。
5) CRC 爲整個廣播幀的24-bit CRC值。
 
 
 第三章 TI的相關資料摘要
 

FROM:..\nrf51822\nRF51822EK_TM配套資料\店主蒐集BLE學習資料
TI 2013研討會藍牙4.0講解部分PPT 20130508.pdf
 
6、兼容性示意圖
 
 
7、低功耗藍牙協議棧(Bluetooth Low Energy Protocol Stack)
 
 
 
8、BLE物理層(PHY)
 
• 3 個固定的廣播通道
• 37 個自適應自動跳頻數據通道
 
       
 
比較好~後面有characteristic的詳細介紹
:BLE_CC2540_DeepDive_Training_2011這篇文章是上篇的英文版,比較全
 
 
第四章 nRF51822-BLE工程理解
 
 
Attention:other's talk about the project code, good
 
9、廣播
 
9.一、由一個廣播超時系統休眠看廣播事件
 
:自動休眠的時間是在廣播中的 m_adv_params.timeout     = APP_ADV_TIMEOUT_IN_SECONDS;設置的!
注:下面代碼來自X-CASE初版部分測試代碼
 1 /**@brief Function for initializing the Advertising functionality.
 2  *
 3  * @details Encodes the required advertising data and passes it to the stack.
 4  *          Also builds a structure to be passed to the stack when starting advertising.
 5  */
 6 static void advertising_init(void)
 7 {
 8     uint32_t      err_code;
 9     ble_advdata_t advdata;
10     uint8_t       flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
11 
12 ble_uuid_t adv_uuids[] = 13 { 14 {BLE_UUID_HEART_RATE_SERVICE, BLE_UUID_TYPE_BLE}, 15 {BLE_UUID_BATTERY_SERVICE, BLE_UUID_TYPE_BLE}, 16 {BLE_UUID_DEVICE_INFORMATION_SERVICE, BLE_UUID_TYPE_BLE} 17 };//廣播工程藍牙3個服務的uuid 18 
19     // Build and set advertising data
20     memset(&advdata, 0, sizeof(advdata));
21 
22     advdata.name_type               = BLE_ADVDATA_FULL_NAME;
23     advdata.include_appearance      = true;
24     advdata.flags.size              = sizeof(flags);
25     advdata.flags.p_data            = &flags;
26     advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
27     advdata.uuids_complete.p_uuids  = adv_uuids;
28 
29     err_code = ble_advdata_set(&advdata, NULL);
30     APP_ERROR_CHECK(err_code);
31 
32     // Initialize advertising parameters (used when starting advertising)
33     memset(&m_adv_params, 0, sizeof(m_adv_params));
34 
35     m_adv_params.type        = BLE_GAP_ADV_TYPE_ADV_IND;
36     m_adv_params.p_peer_addr = NULL;                           // Undirected advertisement
37     m_adv_params.fp          = BLE_GAP_ADV_FP_ANY;
38     m_adv_params.interval    = APP_ADV_INTERVAL;
39 m_adv_params.timeout = APP_ADV_TIMEOUT_IN_SECONDS; 40 }
 
:廣播事件中斷在下面code中
:加劇顯示部分則是上面39行廣播時間timeout事件到了,在其中作系統休眠處理~
 1 /*****************************************************************************
 2 * Static Event Handling Functions
 3 *****************************************************************************/
 4 
 5 /**@brief Function for handling the Application's BLE Stack events.
 6  *
 7  * @param[in]   p_ble_evt   Bluetooth stack event.
 8  */
 9 static void on_ble_evt(ble_evt_t *p_ble_evt)
10 {
11     uint32_t        err_code;
12     static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;
13 
14     switch (p_ble_evt->header.evt_id)
15     {
16     case BLE_GAP_EVT_CONNECTED:
17         led_stop();
18 
19         m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
20 
21         // Initialize the current heart rate to the average of max and min values. So that
22         // everytime a new connection is made, the heart rate starts from the same value.
23         // m_cur_heart_rate = 0;//(MAX_HEART_RATE + MIN_HEART_RATE) / 2;
24         // Start timers used to generate battery and HR measurements.
25         application_timers_start();
26 
27         // Start handling button presses
28         err_code = app_button_enable();
29         APP_ERROR_CHECK(err_code);
30         break;
31 
32     case BLE_GAP_EVT_DISCONNECTED:
33         // Since we are not in a connection and have not started advertising, store bonds
34         err_code = ble_bondmngr_bonded_centrals_store();
35         APP_ERROR_CHECK(err_code);
36 
37         // @note Flash access may not be complete on return of this API. System attributes are now
38         // stored to flash when they are updated to ensure flash access on disconnect does not
39         // result in system powering off before data was successfully written.
40 
41         // Go to system-off mode, should not return from this function, wakeup will trigger
42         // a reset.
43         //system_off_mode_enter();
44         app_button_disable();
45         DispColor(BLACK);
46         //re-enter advertising model if disconnected
47 
48         advertising_init();
49         // Start advertising
50         advertising_start();
51         break;
52 
53     case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
54         err_code = sd_ble_gap_sec_params_reply(m_conn_handle,
55                                                BLE_GAP_SEC_STATUS_SUCCESS,
56                                                &m_sec_params);
57         APP_ERROR_CHECK(err_code);
58         break;
59 
60 case BLE_GAP_EVT_TIMEOUT: 61 if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT) 62  { 63  led_stop(); 64 65  nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_RIGHT, 66  BUTTON_PULL, 67  NRF_GPIO_PIN_SENSE_LOW); 68 69  nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_LEFT, 70  BUTTON_PULL, 71  NRF_GPIO_PIN_SENSE_LOW); 72 #if defined(ENABLE_UP) 73  nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_UP, 74  BUTTON_PULL, 75  NRF_GPIO_PIN_SENSE_LOW); 76 77 78  nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_DOWN, 79  BUTTON_PULL, 80  NRF_GPIO_PIN_SENSE_LOW); 81 #endif 82 83  system_off_mode_enter(); 84  } 85 break; 86 
87     default:
88         // No implementation needed.
89         break;
90     }
91 }

 

 

More:[藍牙] 一、藍牙核心技術瞭解(藍牙協議、架構、硬件和軟件筆記)html

@beautifulzzzz 2015-12-11 continue~ 安全

相關文章
相關標籤/搜索