一匿又、GAP
GAP全名是Generic Access Profile,通用訪問配置文件敬辣,它定義了藍牙設(shè)備的角色牛哺,中心和外設(shè)达传,并且控制他們的連接和廣播數(shù)據(jù)篙耗。廣播數(shù)據(jù)有兩種方式:廣播數(shù)據(jù)和掃描回復(fù)數(shù)據(jù)迫筑,數(shù)據(jù)包大小最長為31字節(jié),其中廣播數(shù)據(jù)方式是必需的宗弯。
廣播數(shù)據(jù)就是藍牙設(shè)備自己定時廣播數(shù)據(jù)出來脯燃,讓周圍環(huán)境的其它設(shè)備可以掃描到它,知道它的存在蒙保,是外設(shè)主動完成的辕棚。而掃描回復(fù)數(shù)據(jù)是可選的,它會根據(jù)需要響應(yīng)請求邓厕,比如收到中心設(shè)備連接請求逝嚎,會響應(yīng)這個請求。這個協(xié)議決定了藍牙設(shè)備的交互方式详恼,比如iBeacon只能向外廣播消息懈糯,而小米手環(huán)可以與中心設(shè)備雙向通信。
GAP的工作流程如下圖:
大部分情況外設(shè)廣播自己來讓中心設(shè)備發(fā)現(xiàn)自己并建立連接单雾,然后GATT(后面講到)就可以用來進行更多的數(shù)據(jù)交換赚哗,這種方式是獨占的,就是建立連接了以后外設(shè)就不再廣播了硅堆,只跟連接上的中心通信屿储。但也有一種是不需要連接的,比如上面說的Beancon設(shè)備渐逃,它只需要向外廣播數(shù)據(jù)够掠,只要在一定的范圍內(nèi),所有的中心設(shè)備都可以收到數(shù)據(jù)茄菊,不需要指定跟具體某個中心建立連接疯潭,他們的網(wǎng)絡(luò)拓撲圖如下:
二、GATT
GATT面殖,全名Generic Attribute Profile, 通用屬性配置文件竖哩。它定義了兩個BLE設(shè)備的數(shù)據(jù)傳輸方式和兩個概念:Services 和 Characteristics。它建立在ATT(Attribute Protocol)協(xié)議的基礎(chǔ)上脊僚,ATT協(xié)議主要是定義了Attribute(屬性)這個數(shù)據(jù)結(jié)構(gòu)相叁。
一個attribute由三個元素組成:
1、16 bit的句柄(唯一性辽幌,用于區(qū)分和查找不同的attribute)
2增淹、UUID(ATT本身不定義,留給GATT來定義)
3乌企、一個定長的值value(配合UUID使用虑润,由GATT來決定這個UUID的意義和數(shù)據(jù))
GATT協(xié)議中的Service和Characteristic需要遵循ATT這種數(shù)據(jù)結(jié)構(gòu),ATT會管理這些數(shù)據(jù)并提供查找方法加酵。
GATT是建立在GAP基礎(chǔ)之上發(fā)揮作用的拳喻,就是兩個BLE設(shè)備只有通過GAP建立連接之后才能用GATT進行通信梁剔。上面說了掃描回復(fù)數(shù)據(jù)交互方式是獨占的,所以GATT通信只允許是一個外設(shè)和一個中心連接舞蔽。如果兩個外設(shè)想要通信荣病,唯一的方式就是建立GATT連接,通過中心來中轉(zhuǎn)渗柿。
記赘雠琛:一個外設(shè)只能跟一個中心建立連接(獨占的),而一個中心可以同時連接多個外設(shè)(一個手機可以同時連接多個BLE設(shè)備)
GATT連接網(wǎng)絡(luò)拓撲圖
GATT通信的雙方是C/S關(guān)系朵栖,外設(shè)作為GATT的服務(wù)器(Server)颊亮,中心設(shè)備是GATT的客戶端(Client),它向Server發(fā)起請求陨溅。注意终惑,所有的通信都是由主設(shè)備(客戶端Client)發(fā)起,服務(wù)器Server響應(yīng)數(shù)據(jù)反饋給Client门扇。一旦建立了通信連接雹有,外設(shè)會建議中心設(shè)備做定時連接(connection interval),這樣中心設(shè)備就會在每個連接間隔嘗試重新連接臼寄,檢查有沒有新的數(shù)據(jù)霸奕。這個只是一個建議,中心設(shè)備可能不會嚴格按照這個時間間隔來執(zhí)行吉拳,例如中心設(shè)備正忙于連接其它外設(shè)或者資源太忙质帅。
外設(shè)與中心數(shù)據(jù)交換圖:
GATT結(jié)構(gòu)由嵌套的Profile、Service留攒、Characteristics組成煤惩,如下圖:
Profile,每個Profile就是預(yù)先定義好的Service集合炼邀。例如官方的心率Heart Rate Profile就是結(jié)合了Heart Rate Service和Device Information Service(可以在這里下載下面這兩個PDF文件查看詳細內(nèi)容)
所有官方通過GATT的Profile可以看這里
Service就是一個獨立的邏輯項魄揉,它包含一個或多個Characteristic,每個Service都由唯一的UUID標識汤善,UUID有16位的有128位的什猖,16位的UUID是官方通過認證的,需要花錢購買红淡,128位的可以隨便自己定義。完整的Service列表可以看這里降铸。
Characteristic是GATT中最小的邏輯數(shù)據(jù)單元在旱,當然它可能包含一組關(guān)聯(lián)的數(shù)據(jù),例如加速度計的 X/Y/Z 三軸值推掸。還是官方心率的例子桶蝎,可以看到它包含了 3 個 Characteristic:Heart Rate Measurement驻仅、Body Sensor Location 和 Heart Rate Control Point,并且定義了只有第一個是必須的登渣,其他是可選實現(xiàn)的噪服。
每個Characteristic對應(yīng)的value就是對應(yīng)格式的實際心率數(shù)據(jù)。中心可以通過讀取service胜茧、再進一步讀取characteristic來獲得具體的心率數(shù)值粘优。
與Service類似,每個 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一標識呻顽。所有數(shù)據(jù)交互必須通過明確的UUID確定到service和characteristic雹顺。
你可以免費使用 Bluetooth SIG 官方定義的標準 Characteristic,使用官方定義的廊遍,可以確保 BLE 的軟件和硬件能相互理解嬉愧。當然,你可以自定義 Characteristic喉前,這樣的話没酣,就只有你自己的軟件和外設(shè)能夠相互理解。
實際上卵迂,和 BLE 外設(shè)打交道四康,主要是通過 Characteristic。你可以從 Characteristic 讀取數(shù)據(jù)狭握,也可以往 Characteristic 寫數(shù)據(jù)闪金。這樣就實現(xiàn)了雙向的通信。所以你可以自己實現(xiàn)一個類似串口(UART)的 Sevice论颅,這個 Service 中包含兩個 Characteristic哎垦,一個被配置只讀的通道(RX),另一個配置為只寫的通道(TX)恃疯。
參考資料:
introduction-to-bluetooth-low-energy
ATT和GATT概述
藍牙協(xié)議詳解