第一章 BLE基本概念了解
一、藍牙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的應用越來越廣泛,已經深入到我們的日常生活種的方方面面。
二、BLE的特點
1)快速地建立連接。
2)小數據包。一個數據包最多只包含20個字節。
3)發送和接收持續時間短。
4)盡量少的工作時間,盡量快地進入休眠模式。
5)超低的峰值電流和待機電流。
6)超長的待機時間。
以上特點使得BLE非常適合用在短距離、低延遲、小數據量的應用場合。
也正是由於這個原因,使得由一顆CR1632的紐扣電池的BLE設備可以續航半年至一年以上。
三、單模和雙模
藍牙4.0包含兩個內容:傳統藍牙(CLASSIC)和低功耗(LE)。
我們常用的藍牙芯片例如CC2540、NRF51822、QN9020、CSR1000等都只支持藍牙低功耗(BLE),所以我們稱之為單模芯片;而支持傳統藍牙和藍牙低功耗的IC一般是手機、平板和PC機上的芯片組。我們稱之為雙模芯片。當然,單顆支持傳統藍牙和藍牙低功耗的芯片好像有些廠家也有,只是不太常見。
傳統藍牙可以用來連接藍牙耳機,也可以連接支持SPP協議的藍牙模塊;藍牙低功耗可以用來連接外部的智能外設。藍牙低功耗技術制定的初衷是為了最大程度上延長藍牙設備的續航時間,這就是為什么一般常見的穿戴式設備不支持語音傳輸,只在一些間歇式、數據量小的場合應用的原因。
注:有的同學可能會問,假如我一定要用BLE傳音頻呢?不考慮功耗和續航時間的話當然可以,但是不推薦這樣做。


注:來自..\nrf51822\nRF51822EK_TM配套資料\實戰教程\(1)初識藍牙低功耗1
第二章 探討BLE軟件體系結構
四、應用層和協議棧


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接口函數進行通訊。
五、BLE協議棧
5.1、數據鏈路層的功能:
數據鏈路層負責廣播、掃描、連接的建立和維護。
5.2、數據鏈路層定義了4個角色:
1) scaner和advertiser
2) master和advertiser
在建立連接之前,scanner(手機、平板、PC)負責掃描、發起掃描請求和發起連接請求;而
advertiser(智能外設)任務是發起廣播、相應掃描請求信號、響應連接請求進而跟scanner端建立連
接。數據鏈路層同時也負責將各種數據包按正確的數據格式組織起來,正確地發送到對方。建立連
接以后scanner被稱為master,advertiser被稱為slave.
5.3、數據鏈路層的2種信道:
1)廣播信道:提供給還沒有建立連接的藍牙設備提供發射廣播、掃描、建立連接的信道。BLE有3個
廣播信道:37、38、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.4、幀格式:

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
六、兼容性示意圖

七、低功耗藍牙協議棧(Bluetooth Low Energy Protocol Stack)

八、BLE物理層(PHY)
• 3 個固定的廣播通道
• 37 個自適應自動跳頻數據通道



比較好~后面有characteristic的詳細介紹
注:BLE_CC2540_DeepDive_Training_2011這篇文章是上篇的英文版,比較全

第四章 nRF51822-BLE工程理解
Attention:other's talk about the project code, good
九、廣播
9.1、由一個廣播超時系統休眠看廣播事件
注:自動休眠的時間是在廣播中的 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:[藍牙] 1、藍牙核心技術了解(藍牙協議、架構、硬件和軟件筆記)
@beautifulzzzz 2015-12-11 continue~