Yan Zhang
摘要
CC26xx 是TI 提供的高性能2.4GHz射頻SOC芯片。最新一代CC2652可以支持BLE,ZigBee,Thread,TI15.4以及私有協議。能以multi-protocol模式同時運行BLE+ZigBee ,BLE+TI15.4,或者BLE+2.4G 私有協議,任意兩種組合。
TI提供CC26xx的SDK,SDK里面包含了各種協議支持,其中就包含BLE。BLE協議里,TI提供了很多例程。其中simple peripheral例程是最為廣泛使用的一個,里面提供了BLE最基本的各種read, write,notify屬性的特征值,唯獨沒有indication屬性的特征值。Indication 屬性和notify屬性類似,但又不一樣,它是需要BLE Client設備收到數據后回復確認的一種機制。
本文基于CC2652的SDK V3.30版本的simple peripheral 例程實現indication。本文提供的方式適用于所有CC26xx系列的芯片。
目錄
1. BLE 特征值的indication屬性........................................................................................................... 2
2. CC2652 indication的實現................................................................................................................ 2
2.1 特征值2的定義............................................................................................................................. 2
2.1.1 特征值2 屬性修改.................................................................................................................... 2
2.1.2 特征值2 的配置屬性添加......................................................................................................... 3
2.2 特征值2的CCC值操作................................................................................................................. 4
2.3 特征值2的indication數據發送...................................................................................................... 4
2.3.1 調用GATTServApp_ProcessCharCfg()................................................................................... 4
2.3.2 調用GATT_Indication()............................................................................................................ 5
2.4 應用層代碼添加........................................................................................................................... 6
3. Indication 測試................................................................................................................................ 7
4. 參考文獻........................................................................................................................................... 9
圖表
圖1. BLE indication............................................................................................................................ 2
圖2. 特征值2的屬性.............................................................................................................................. 8
圖3. 使能特征值2的indication............................................................................................................. 9
圖4. Indication發送和確認................................................................................................................... 9
1 BLE 特征值的indication屬性
BLE特征值的indication是由server端主動向client端發送數據的一種方式,和notification方式類似,但indication不一樣的地方是需要client端收到數據后回復confirm包給server端。這些行為都是在GATT層完成,并可以通知client應用層對方成功接收數據。由于有自動確認機制,indication在很多應用層級的協議制定中有比較廣泛應用。
圖1. BLE indication
2 CC2652 indication的實現
本文基于CC2652的SDK V3.30版本的simple peripheral 例程實現indication,在simple GATT service中的特征值2上添加indication機制,特征值2將同時支持read和indication的屬性。
2.1 特征值2的定義
2.1.1 特征值2 屬性修改
在simple_gatt_profile.c中,給Characteristic 的屬性添加indication 屬性:
同時,在特征值定義表格中,特征值2的讀寫屬性里,把GATT_PERMIT_READ這一定義去掉,完全交由前面定義的simpleProfileChar2Props來決定,不然該特征值還是會被認為只有read屬性:
2.1.2 特征值2 的配置屬性添加
就像帶有notification屬性的特征值一樣,作為帶有indication屬性的特征值,也必須有一個CCC(Client Characteristic Configuration)緊隨該特征值的value定義,將它添加在特征值2的value定義后面:
同時,我們需要在特征值定義表格中把這個CCC的定義attribute也添加進去,位置是在特征值2的value定義之后,該attribute的讀寫屬性為可讀+可寫。
注意,由于在表格里添加了一個attribute,表格數組的尺寸定義也要加1,由17變為18:
在service初始化函數中,把特征值2的CCC值也進行初始化,位置在SimpleProfile_AddService() 函數:
特征值的定義部分完成。
2.2 特征值2的CCC值操作
Indication或者notification的CCC值是由client(通常是central設備,極個別profile可以是peripheral設備)來用來使能server端的indication或者notification。這個操作本質上是client對CCC值的一個寫操作,而寫操作的處理在simpleProfile_WriteAttrCB()函數里,區分和例程里特征值4的notification的CCC值,添加代碼如下,替換原來的:
注意GATT_CLIENT_CFG_INDICATE和GATT_CLIENT_CFG_NOTIFY的區別,分別對應indication和notification。這里的添加,就會修改simpleProfileChar2Config值,并且使能或者關閉特征值2的indication功能。
另外注意simpleProfileChar2Config本質是一個指針,指向gattCharCfg_t結構體:
每一個CCC的value,對應一個connection handle,也就是對應一個BLE的連接。從其在SimpleProfile_AddService()函數里的初始化也可以看出,simpleProfileChar2Config被分配了MAX_NUM_BLE_CONNS個gattCharCfg_t尺寸的空間,這就為每個BLE連接都單獨預留了indication的CCC的配置,每一個連上本設備的central設備都能單獨開關特征值2的indication。
2.3 特征值2的indication數據發送
在CC26xx的SDK中,發送indication或者notification有兩種方式,一種是調用封裝的函數GATTServApp_ProcessCharCfg(),另一種是直接調用GATT的API函數GATT_Indication()和GATT_Notification()。
2.3.1 調用GATTServApp_ProcessCharCfg()
在SimpleProfile_SetParameter()中,應用層會調用該函數來做特征值操作,把對應的特征值2的部分修改如下:
這里把len的長度加1的目的是為了得到應用層的task ID。這就是indication和notification的區別之一,藍牙協議規定indication發送后是需要對方回復confirm確認的,這個確認必須要有一個對應的實體也就是task去接收并且處理(也可以不處理,只是當作一個indication成功的通知,接收這個動作是必須的)。所以indication發送的時候必須要提前制定確認消息的接收task ID。這里就會通過SimpleProfile_SetParameter() 被應用層調用來指定發送的indication的值和接收確認消息的task ID,一般就由應用層task本身接收。
2.3.2 調用GATT_Indication()
另一種方法直接調用GATT層API GATT_Indication(),實現代碼如下。由于CC26xx支持一從多主模式,所以有可能同時存在多條BLE鏈路,因此代碼的實現也考慮到這一點,所有當前存在的BLE鏈路都要進行判斷,根據CCC值的開關狀態決定是否需要向對應的主機發送該特征值的indication。
上面這段代碼同時也實現了如何在service的表格里查找某特征值對應的attribute handle,可以借鑒用到其他地方。
2.4 應用層代碼添加
添加用于indication的值,該值會每發送一次就累加一次:
在SimplePeripheral_performPeriodicTask()中定時發送特征值2的indication,和特征值4的notification一起發送:
針對特征值2操作的參數是兩個字節長度,第一個字節是要發送的值,第二個字節就是indication發送后central回復確認的時候進行接收的task ID,這里用的就是應用層task本身的ID。
注意,TI-RTOS的每個task有個entity ID,這個其實就是task ID:
在應用層中添加indication發送后,收到central的確認消息的操作。在函數SimplePeripheral_processGATTMsg() 中添加ATT_HANDLE_VALUE_CFM的操作:
這里只簡單打印一下結果,打印的值為這一次發送成功的indication的值,具體可以根據實際情況進行修改,比如需要收到confirm之后發送下一個indication數據等。
3 Indication 測試
編譯下載代碼到CC2652 LaunchPad上。
打開手機上BLE的APP,比如LightBlue,查找Simple Peripheral,找到后連接。可以看到特征值2已經帶indication屬性。
圖2. 特征值2的屬性
3. 點進特征值2界面,點擊Listetn for notification。這里“notification”只是界面顯示,其實是indication。因為特征值2的屬性顯示已經是indication。
圖3. 使能特征值2的indication
4. 手機收到CC2652發送過來的indication,并且在CC2652連接PC的串口終端上能看到手機回復收到indication之后的確認包。
審核編輯:金巧
-
soc
+關注
關注
38文章
4124瀏覽量
217966 -
嵌入式處理
+關注
關注
0文章
341瀏覽量
9997 -
SDK
+關注
關注
3文章
1029瀏覽量
45782
發布評論請先 登錄
相關推薦
評論