[轉(zhuǎn)載]藍(lán)牙4.0 BLE 數(shù)據(jù)傳輸(三)

上一回我們談到了數(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ù)布蔗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藤违,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纵揍,更是在濱河造成了極大的恐慌顿乒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽谨,死亡現(xiàn)場(chǎng)離奇詭異璧榄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吧雹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門骨杂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雄卷,你說我怎么就攤上這事腊脱。” “怎么了龙亲?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵陕凹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鳄炉,道長(zhǎng)杜耙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任拂盯,我火速辦了婚禮佑女,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈竿。我一直安慰自己团驱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布空凸。 她就那樣靜靜地躺著嚎花,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呀洲。 梳的紋絲不亂的頭發(fā)上紊选,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音道逗,去河邊找鬼兵罢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滓窍,可吹牛的內(nèi)容都是我干的卖词。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吏夯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼此蜈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锦亦,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤舶替,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后杠园,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顾瞪,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年抛蚁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陈醒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞧甩,死狀恐怖钉跷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肚逸,我是刑警寧澤爷辙,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布彬坏,位于F島的核電站,受9級(jí)特大地震影響膝晾,放射性物質(zhì)發(fā)生泄漏栓始。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一血当、第九天 我趴在偏房一處隱蔽的房頂上張望幻赚。 院中可真熱鬧,春花似錦臊旭、人聲如沸落恼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佳谦。三九已至,卻和暖如春撤奸,著一層夾襖步出監(jiān)牢的瞬間吠昭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工胧瓜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矢棚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓府喳,卻偏偏與公主長(zhǎng)得像蒲肋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钝满,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容