Yan Zhang
摘要
CC26xx 是TI 提供的高性能2.4GHz射頻SOC芯片。最新一代CC2652可以支持BLE,ZigBee,Thread,TI15.4以及私有協(xié)議。能以multi-protocol模式同時(shí)運(yùn)行BLE+ZigBee ,BLE+TI15.4,或者BLE+2.4G 私有協(xié)議,任意兩種組合。
TI提供CC26xx的SDK,SDK里面包含了各種協(xié)議支持,其中就包含BLE。BLE協(xié)議里,TI提供了很多例程。其中simple peripheral例程是最為廣泛使用的一個(gè),里面提供了BLE最基本的各種read, write,notify屬性的特征值,唯獨(dú)沒有indication屬性的特征值。Indication 屬性和notify屬性類似,但又不一樣,它是需要BLE Client設(shè)備收到數(shù)據(jù)后回復(fù)確認(rèn)的一種機(jī)制。
本文基于CC2652的SDK V3.30版本的simple peripheral 例程實(shí)現(xiàn)indication。本文提供的方式適用于所有CC26xx系列的芯片。
目錄
1. BLE 特征值的indication屬性........................................................................................................... 2
2. CC2652 indication的實(shí)現(xiàn)................................................................................................................ 2
2.1 特征值2的定義............................................................................................................................. 2
2.1.1 特征值2 屬性修改.................................................................................................................... 2
2.1.2 特征值2 的配置屬性添加......................................................................................................... 3
2.2 特征值2的CCC值操作................................................................................................................. 4
2.3 特征值2的indication數(shù)據(jù)發(fā)送...................................................................................................... 4
2.3.1 調(diào)用GATTServApp_ProcessCharCfg()................................................................................... 4
2.3.2 調(diào)用GATT_Indication()............................................................................................................ 5
2.4 應(yīng)用層代碼添加........................................................................................................................... 6
3. Indication 測試................................................................................................................................ 7
4. 參考文獻(xiàn)........................................................................................................................................... 9
圖表
圖1. BLE indication............................................................................................................................ 2
圖2. 特征值2的屬性.............................................................................................................................. 8
圖3. 使能特征值2的indication............................................................................................................. 9
圖4. Indication發(fā)送和確認(rèn)................................................................................................................... 9
1 BLE 特征值的indication屬性
BLE特征值的indication是由server端主動(dòng)向client端發(fā)送數(shù)據(jù)的一種方式,和notification方式類似,但indication不一樣的地方是需要client端收到數(shù)據(jù)后回復(fù)confirm包給server端。這些行為都是在GATT層完成,并可以通知client應(yīng)用層對(duì)方成功接收數(shù)據(jù)。由于有自動(dòng)確認(rèn)機(jī)制,indication在很多應(yīng)用層級(jí)的協(xié)議制定中有比較廣泛應(yīng)用。

圖1. BLE indication
2 CC2652 indication的實(shí)現(xiàn)
本文基于CC2652的SDK V3.30版本的simple peripheral 例程實(shí)現(xiàn)indication,在simple GATT service中的特征值2上添加indication機(jī)制,特征值2將同時(shí)支持read和indication的屬性。
2.1 特征值2的定義
2.1.1 特征值2 屬性修改
在simple_gatt_profile.c中,給Characteristic 的屬性添加indication 屬性:

同時(shí),在特征值定義表格中,特征值2的讀寫屬性里,把GATT_PERMIT_READ這一定義去掉,完全交由前面定義的simpleProfileChar2Props來決定,不然該特征值還是會(huì)被認(rèn)為只有read屬性:

2.1.2 特征值2 的配置屬性添加
就像帶有notification屬性的特征值一樣,作為帶有indication屬性的特征值,也必須有一個(gè)CCC(Client Characteristic Configuration)緊隨該特征值的value定義,將它添加在特征值2的value定義后面:

同時(shí),我們需要在特征值定義表格中把這個(gè)CCC的定義attribute也添加進(jìn)去,位置是在特征值2的value定義之后,該attribute的讀寫屬性為可讀+可寫。

注意,由于在表格里添加了一個(gè)attribute,表格數(shù)組的尺寸定義也要加1,由17變?yōu)?8:

在service初始化函數(shù)中,把特征值2的CCC值也進(jìn)行初始化,位置在SimpleProfile_AddService() 函數(shù):

特征值的定義部分完成。
2.2 特征值2的CCC值操作
Indication或者notification的CCC值是由client(通常是central設(shè)備,極個(gè)別profile可以是peripheral設(shè)備)來用來使能server端的indication或者notification。這個(gè)操作本質(zhì)上是client對(duì)CCC值的一個(gè)寫操作,而寫操作的處理在simpleProfile_WriteAttrCB()函數(shù)里,區(qū)分和例程里特征值4的notification的CCC值,添加代碼如下,替換原來的:

注意GATT_CLIENT_CFG_INDICATE和GATT_CLIENT_CFG_NOTIFY的區(qū)別,分別對(duì)應(yīng)indication和notification。這里的添加,就會(huì)修改simpleProfileChar2Config值,并且使能或者關(guān)閉特征值2的indication功能。
另外注意simpleProfileChar2Config本質(zhì)是一個(gè)指針,指向gattCharCfg_t結(jié)構(gòu)體:

每一個(gè)CCC的value,對(duì)應(yīng)一個(gè)connection handle,也就是對(duì)應(yīng)一個(gè)BLE的連接。從其在SimpleProfile_AddService()函數(shù)里的初始化也可以看出,simpleProfileChar2Config被分配了MAX_NUM_BLE_CONNS個(gè)gattCharCfg_t尺寸的空間,這就為每個(gè)BLE連接都單獨(dú)預(yù)留了indication的CCC的配置,每一個(gè)連上本設(shè)備的central設(shè)備都能單獨(dú)開關(guān)特征值2的indication。
2.3 特征值2的indication數(shù)據(jù)發(fā)送
在CC26xx的SDK中,發(fā)送indication或者notification有兩種方式,一種是調(diào)用封裝的函數(shù)GATTServApp_ProcessCharCfg(),另一種是直接調(diào)用GATT的API函數(shù)GATT_Indication()和GATT_Notification()。
2.3.1 調(diào)用GATTServApp_ProcessCharCfg()
在SimpleProfile_SetParameter()中,應(yīng)用層會(huì)調(diào)用該函數(shù)來做特征值操作,把對(duì)應(yīng)的特征值2的部分修改如下:

這里把len的長度加1的目的是為了得到應(yīng)用層的task ID。這就是indication和notification的區(qū)別之一,藍(lán)牙協(xié)議規(guī)定indication發(fā)送后是需要對(duì)方回復(fù)confirm確認(rèn)的,這個(gè)確認(rèn)必須要有一個(gè)對(duì)應(yīng)的實(shí)體也就是task去接收并且處理(也可以不處理,只是當(dāng)作一個(gè)indication成功的通知,接收這個(gè)動(dòng)作是必須的)。所以indication發(fā)送的時(shí)候必須要提前制定確認(rèn)消息的接收task ID。這里就會(huì)通過SimpleProfile_SetParameter() 被應(yīng)用層調(diào)用來指定發(fā)送的indication的值和接收確認(rèn)消息的task ID,一般就由應(yīng)用層task本身接收。
2.3.2 調(diào)用GATT_Indication()
另一種方法直接調(diào)用GATT層API GATT_Indication(),實(shí)現(xiàn)代碼如下。由于CC26xx支持一從多主模式,所以有可能同時(shí)存在多條BLE鏈路,因此代碼的實(shí)現(xiàn)也考慮到這一點(diǎn),所有當(dāng)前存在的BLE鏈路都要進(jìn)行判斷,根據(jù)CCC值的開關(guān)狀態(tài)決定是否需要向?qū)?yīng)的主機(jī)發(fā)送該特征值的indication。

上面這段代碼同時(shí)也實(shí)現(xiàn)了如何在service的表格里查找某特征值對(duì)應(yīng)的attribute handle,可以借鑒用到其他地方。
2.4 應(yīng)用層代碼添加
添加用于indication的值,該值會(huì)每發(fā)送一次就累加一次:

在SimplePeripheral_performPeriodicTask()中定時(shí)發(fā)送特征值2的indication,和特征值4的notification一起發(fā)送:

針對(duì)特征值2操作的參數(shù)是兩個(gè)字節(jié)長度,第一個(gè)字節(jié)是要發(fā)送的值,第二個(gè)字節(jié)就是indication發(fā)送后central回復(fù)確認(rèn)的時(shí)候進(jìn)行接收的task ID,這里用的就是應(yīng)用層task本身的ID。
注意,TI-RTOS的每個(gè)task有個(gè)entity ID,這個(gè)其實(shí)就是task ID:

在應(yīng)用層中添加indication發(fā)送后,收到central的確認(rèn)消息的操作。在函數(shù)SimplePeripheral_processGATTMsg() 中添加ATT_HANDLE_VALUE_CFM的操作:

這里只簡單打印一下結(jié)果,打印的值為這一次發(fā)送成功的indication的值,具體可以根據(jù)實(shí)際情況進(jìn)行修改,比如需要收到confirm之后發(fā)送下一個(gè)indication數(shù)據(jù)等。
3 Indication 測試
編譯下載代碼到CC2652 LaunchPad上。
打開手機(jī)上BLE的APP,比如LightBlue,查找Simple Peripheral,找到后連接??梢钥吹教卣髦?已經(jīng)帶indication屬性。

圖2. 特征值2的屬性
3. 點(diǎn)進(jìn)特征值2界面,點(diǎn)擊Listetn for notification。這里“notification”只是界面顯示,其實(shí)是indication。因?yàn)樘卣髦?的屬性顯示已經(jīng)是indication。

圖3. 使能特征值2的indication
4. 手機(jī)收到CC2652發(fā)送過來的indication,并且在CC2652連接PC的串口終端上能看到手機(jī)回復(fù)收到indication之后的確認(rèn)包。
審核編輯:金巧
-
soc
+關(guān)注
關(guān)注
40文章
4576瀏覽量
229198 -
嵌入式處理
+關(guān)注
關(guān)注
0文章
341瀏覽量
10516 -
SDK
+關(guān)注
關(guān)注
3文章
1101瀏覽量
51745
發(fā)布評(píng)論請(qǐng)先 登錄
LuatOS平臺(tái)下BLE藍(lán)牙開發(fā)從入門到實(shí)踐
探索CC85xx系列:2.4 GHz無線數(shù)字音頻的理想之選
探索CC85xx系列:2.4GHz無線數(shù)字音頻流的理想之選
探索CC85xx系列:2.4 GHz無線數(shù)字音頻的理想之選
深入剖析CC2630:高性能無線MCU的卓越之選
CC3130:開啟低功耗物聯(lián)網(wǎng)連接新時(shí)代
探索CC330xMOD:適用于物聯(lián)網(wǎng)的高效Wi-Fi 6與藍(lán)牙低功耗模塊
TI CC2642R BLE 5.2低功耗藍(lán)牙模塊:以核心芯片驅(qū)動(dòng)智能連接革新
?TI CC1311P3 LaunchPad?開發(fā)套件技術(shù)解析與應(yīng)用指南
ATT讀取由組請(qǐng)求CYBLE-416045-02 gatt服務(wù)器響應(yīng),帶有錯(cuò)誤的起始和結(jié)束屬性句柄怎么解決?
STM32WBA55CG連接上手機(jī)時(shí)如何自動(dòng)開啟Notify而不需要手機(jī)端手動(dòng)開啟呢?
外圍設(shè)備通過手機(jī)連接到BLE應(yīng)用程序,為什么不能連接到Infineaon BLE?
【沁恒CH585開發(fā)板免費(fèi)試用體驗(yàn)】4、從ADC采集到BLE-Web實(shí)時(shí)可視化
BLE連接未啟動(dòng)的原因?
藍(lán)牙UUID:無線通信中的唯一標(biāo)識(shí)符
CC26xx BLE添加indication屬性的特征值
評(píng)論