上一回我們談到了數(shù)據(jù)傳輸?shù)倪^程以及如何發(fā)送和接收數(shù)據(jù)慢叨,那么今天我們談?wù)勌卣髦怠?br>
首先看一下SIG給出的定義
一個(gè)特點(diǎn)是用屬性以及如何訪問該值的配置信息和關(guān)于如何的值是顯示或?yàn)榇淼男畔⒎?wù)中的值徘意。
特征值在GATT的分類,再來看SIG的定義:
在GATT層中核芽,一個(gè)特征是由其特性的定義定義的艾岂。特征定義包含特性的宣言、 特征屬性和一個(gè)值枢赔,并且可能包含描述符描述的值或允許的特點(diǎn)對(duì)服務(wù)器的配置。
我們?cè)倏纯?特征值是如何在協(xié)議棧中實(shí)現(xiàn)的拥知。
首先我們看一下關(guān)于特征值定義的一些宏踏拜。
// Primary Service UUID 主服務(wù)的UUID 相當(dāng)于一輛公交車的車牌,公交車?yán)锩嬗钟胁煌某丝偷吞蓿@些乘客就是主服務(wù)攜帶的信息
CONST uint8 primaryServiceUUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16( GATT_PRIMARY_SERVICE_UUID ), HI_UINT16( GATT_PRIMARY_SERVICE_UUID )
};
// Simple GATT Profile Service UUID: 0xFFF0
CONST uint8 simpleProfileServUUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)
};
// Simple Profile Service attribute
static CONST gattAttrType_t simpleProfileService = { ATT_BT_UUID_SIZE, simpleProfileServUUID };
//Profile 參數(shù)
define SIMPLEPROFILE_CHAR1 0 //RW uint8 - Profile Characteristic 1 value
// Simple Profile Service UUID
define SIMPLEPROFILE_SERV_UUID 0xFFF0 //service 的 UUID
// Key Pressed UUID
define SIMPLEPROFILE_CHAR1_UUID 0xFFF1
// Simple Profile Characteristic 1 Properties 特征值屬性(讀/寫)
static uint8 simpleProfileChar1Props = GATT_PROP_READ | GATT_PROP_WRITE;
// Characteristic 1 Value 特征值的值
static uint8 simpleProfileChar1 = 0;
// Simple Profile Characteristic 1 User Description 特征值的用戶說明
static uint8 simpleProfileChar1UserDesp[17] = "Characteristic 1\0";
定義了特征值所需要的相關(guān)宏以后速梗,我們需要將特征值填寫到特征值列表中,
static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] =
{
// Simple Profile Service
{
{ ATT_BT_UUID_SIZE, primaryServiceUUID },
GATT_PERMIT_READ,
0,
(uint8 *)&simpleProfileService
},//公交車信息襟齿。姻锁。。蕊唐。屋摔。。替梨。钓试。。副瀑。弓熏。。糠睡。挽鞠。。狈孔。信认。。均抽。嫁赏。。油挥。潦蝇。
// Characteristic 1 Declaration 聲明特征值
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar1Props
},
// Characteristic Value 1 值
{
{ ATT_BT_UUID_SIZE, simpleProfilechar1UUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
&simpleProfileChar1
},
// Characteristic 1 User Description特征值的用戶說明
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar1UserDesp
},
};
這樣 就把特征值添加到列表中了款熬,如果我們需要添加其他的一些特征值,可以直接在Characteristic 1后 類似的連接Characteristic 2 Characteristic 3 Characteristic 4 等等攘乒。是不是很簡(jiǎn)單啊贤牛,照葫蘆畫瓢,一看就會(huì)则酝, 是吧殉簸?
讀取服務(wù)的值,需要知道服務(wù)的UUID或者Handle堤魁;寫服務(wù)的值喂链,需要知道服務(wù)的Hanle;寫服務(wù)描述符妥泉,需要知道該Descriptor的Hanle椭微。
如何知道一個(gè)服務(wù)的Handle?
根據(jù)服務(wù)的UUID調(diào)用API函數(shù)GATT_ReadUsingCharUUID協(xié)議棧會(huì)返回該服務(wù)的Handle盲链。特別注意的是蝇率,一個(gè)服務(wù)的Descriptor的Handle總是該服務(wù)的Handle+1,如電池電量服務(wù)的Handle是0x0025刽沾,那么它的Descriptor的Handle是0x0026本慕。
獲取Handle:
attReadByTypeReq_t req;
simpleBLEDiscState = BLE_DISC_STATE_CHAR;
req.startHandle = simpleBLESvcStartHdl;
req.endHandle = simpleBLESvcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);
GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
把讀到的數(shù)據(jù)拆包,提取handle的值:
simpleBLECharHdl =
BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0], pMsg->msg.readByTypeRsp.dataList[1] );
寫數(shù)據(jù):
attWriteReq_t req;
req.handle = simpleBLECharHdl;
req.len = 1;
req.value[0] = simpleBLECharVal;
req.sig = 0;
req.cmd = 0;
status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );
最后說一下我的理解:
特征值就是藍(lán)牙提供給外設(shè)進(jìn)行數(shù)據(jù)交互的接口侧漓。通過寫摸個(gè)特征值锅尘,就可以把數(shù)據(jù)傳給對(duì)方,通過讀特征值就能讀到對(duì)方的數(shù)據(jù)布蔗。