常見(jiàn)藍(lán)牙名稱的簡(jiǎn)寫(xiě)
MFI ======= make for ipad ,iphone, itouch 專們?yōu)樘O(píng)果設(shè)備制作的設(shè)備
BLE ==== buletouch low energy趾浅,藍(lán)牙4.0設(shè)備因?yàn)榈秃碾姡砸步凶鯞LE
peripheral,central == 外設(shè)和中心,發(fā)起連接的時(shí)central,被連接的設(shè)備為perilheral
service and characteristic === 服務(wù)和特征 每個(gè)設(shè)備會(huì)提供服務(wù)和特征,類似于服務(wù)端的api冬耿,但是機(jī)構(gòu)不同开镣。每個(gè)外設(shè)會(huì)有很多服務(wù)戴涝,每個(gè)服務(wù)中包含很多字段吩屹,這些字段的權(quán)限一般分為 讀read膘掰,寫(xiě)write章姓,通知notiy幾種,就是我們連接設(shè)備后具體需要操作的內(nèi)容识埋。
Description 每個(gè)characteristic可以對(duì)應(yīng)一個(gè)或多個(gè)Description用戶描述characteristic的信息或?qū)傩?/p>
Profile Profile 并不是實(shí)際存在于 BLE 外設(shè)上的凡伊,它只是一個(gè)被 Bluetooth SIG 或者外設(shè)設(shè)計(jì)者預(yù)先定義的 Service 的集合。所有官方通過(guò) GATT Profile 的列表可以從這里找到窒舟。
Service Service 是把數(shù)據(jù)分成一個(gè)個(gè)的獨(dú)立邏輯項(xiàng)系忙,它包含一個(gè)或者多個(gè) Characteristic。每個(gè) Service 有一個(gè) UUID 唯一標(biāo)識(shí)惠豺。 UUID 有 16 bit 的银还,或者 128 bit 的。16 bit 的 UUID 是官方通過(guò)認(rèn)證的洁墙,需要花錢(qián)購(gòu)買(mǎi)蛹疯,128 bit 是自定義的,這個(gè)就可以自己隨便設(shè)置热监。官方通過(guò)了一些標(biāo)準(zhǔn) Service完整列表在這里捺弦。以 Heart Rate Service為例,可以看到它的官方通過(guò) 16 bit UUID 是 0x180D,包含 3 個(gè) Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point羹呵,并只有第一個(gè)是必須的骂际,其它是可選實(shí)現(xiàn)的。
MFI === 開(kāi)發(fā)使用ExternalAccessory 框架
4.0 BLE === 開(kāi)發(fā)使用CoreBluetooth 框架
一個(gè)主設(shè)備最多能連7個(gè)外設(shè)
GAP(Generic Access Profile)冈欢,它在用來(lái)控制設(shè)備連接和廣播歉铝。GAP 使你的設(shè)備被其他設(shè)備可見(jiàn),并決定了你的設(shè)備是否可以或者怎樣與合同設(shè)備進(jìn)行交互凑耻。
GAAT : Generic Attribute Profile , GATT配置文件是一個(gè)通用規(guī)范太示,用于在BLE鏈路上發(fā)送和接收被稱為“屬性”的數(shù)據(jù)塊。目前所有的BLE應(yīng)用都基于GATT香浩。 藍(lán)牙SIG規(guī)定了許多低功耗設(shè)備的配置文件类缤。配置文件是設(shè)備如何在特定的應(yīng)用程序中工作的規(guī)格說(shuō)明。注意一個(gè)設(shè)備可以實(shí)現(xiàn)多個(gè)配置文件邻吭。例如餐弱,一個(gè)設(shè)備可能包括心率監(jiān)測(cè)儀和電量檢測(cè)。GATT Profile 簡(jiǎn)介
Characteristic 一個(gè)characteristic包括一個(gè)單一變量和0-n個(gè)用來(lái)描述characteristic變量的descriptor囱晴,characteristic可以被認(rèn)為是一個(gè)類型膏蚓,類 似于類。
Descriptor Descriptor用來(lái)描述characteristic變量的屬性畸写。例如驮瞧,一個(gè)descriptor可以規(guī)定一個(gè)可讀的描述,或者一個(gè)characteristic變量可接受的范圍枯芬,或者一個(gè)characteristic變量特定的測(cè)量單位论笔。 Service service是characteristic的集合。例如千所,你可能有一個(gè)叫“Heart Rate Monitor(心率監(jiān)測(cè)儀)”的service狂魔,它包括了很多characteristics,如“heart rate measurement(心率測(cè)量)”等淫痰。你可以在bluetooth.org 找到一個(gè)目前支持的基于GATT的配置文件和服務(wù)列表毅臊。
CoreBluetooth框架的核心其實(shí)是兩個(gè)東西,peripheral和central, 可以理解成外設(shè)和中心黑界。上圖為它們對(duì)應(yīng)的API和類。
左側(cè)叫做中心模式皂林,就是以你的app作為中心朗鸠,連接其他的外設(shè)的場(chǎng)景,而右側(cè)稱為外設(shè)模式础倍,使用手機(jī)作為外設(shè)別其他中心設(shè)備操作的場(chǎng)景烛占。我們app所做的都說(shuō)對(duì)應(yīng)中心模式
iOS 藍(lán)牙中心模式流程如下
1. 建立中心角色
2. 掃描外設(shè)(discover)
3. 連接外設(shè)(connect)
4. 掃描外設(shè)中的服務(wù)和特征(discover)
- 4.1 獲取外設(shè)的services
- 4.2 獲取外設(shè)的Characteristics,獲取Characteristics的值,獲取Characteristics的Descriptor和Descriptor的值
5. 與外設(shè)做數(shù)據(jù)交互(explore and interact)
6. 訂閱Characteristic的通知
7. 斷開(kāi)連接(disconnect)
藍(lán)牙外設(shè)模式流程
1. 啟動(dòng)一個(gè)Peripheral管理對(duì)象
2. 本地Peripheral設(shè)置服務(wù),特性,描述,權(quán)限等等
3. Peripheral發(fā)送廣告
4. 設(shè)置處理訂閱忆家、取消訂閱犹菇、讀characteristic、寫(xiě)characteristic的委托方法
中心設(shè)備和外設(shè)需要雙向通信的話芽卿,唯一的方式就是建立 GATT 連接揭芍。
GATT 連接,必需先經(jīng)過(guò) GAP 協(xié)議卸例。藍(lán)牙芯片發(fā)起連接称杨,總是先掃描設(shè)備,掃描到了才會(huì)發(fā)起連接筷转。
GATT 連接是獨(dú)占的姑原。也就是一個(gè) BLE 外設(shè)同時(shí)只能被一個(gè)中心設(shè)備連接。一旦外設(shè)被連接呜舒,它就會(huì)馬上停止廣播锭汛,這樣它就對(duì)其他設(shè)備不可見(jiàn)了。當(dāng)設(shè)備斷開(kāi)袭蝗,它又開(kāi)始廣播唤殴。
在 GAP 中外圍設(shè)備通過(guò)兩種方式向外廣播數(shù)據(jù): Advertising Data Payload(廣播數(shù)據(jù))和 Scan Response Data Payload(掃描回復(fù)),每種數(shù)據(jù)最長(zhǎng)可以包含 31 byte呻袭。這里廣播數(shù)據(jù)是必需的眨八,因?yàn)橥庠O(shè)必需不停的向外廣播,讓中心設(shè)備知道它的存在左电。掃描回復(fù)是可選的廉侧,中心設(shè)備可以向外設(shè)請(qǐng)求掃描回復(fù),這里包含一些設(shè)備額外的信息篓足,例如設(shè)備的名字段誊。
GATT 通信的雙方是 C/S 關(guān)系。外設(shè)作為 GATT 服務(wù)端(Server)栈拖,它維持了 ATT 的查找表以及 service 和 characteristic 的定義连舍。中心設(shè)備是 GATT 客戶端(Client),它向 Server 發(fā)起請(qǐng)求涩哟。需要注意的是索赏,所有的通信事件,都是由客戶端(也叫主設(shè)備贴彼,Master)發(fā)起潜腻,并且接收服務(wù)端(也叫從設(shè)備,Slave)的響應(yīng)器仗。
每個(gè)設(shè)備都會(huì)有一些服務(wù)融涣,每個(gè)服務(wù)里面都會(huì)有一些特征童番,特征就是具體鍵值對(duì),提供數(shù)據(jù)的地方
// characteristic的屬性威鹿,是一個(gè)結(jié)構(gòu)體剃斧,每個(gè)特征值常用的權(quán)限分為讀,寫(xiě)忽你,通知這么幾種方式
typedef NS_OPTIONS(NSInteger, CBCharacteristicProperties) {
// 標(biāo)識(shí)這個(gè)characteristic的屬性是廣播
CBCharacteristicPropertyBroadcast= 0x01,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是讀
CBCharacteristicPropertyRead= 0x02,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是寫(xiě)-沒(méi)有響應(yīng)
CBCharacteristicPropertyWriteWithoutResponse= 0x04,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是寫(xiě)
CBCharacteristicPropertyWrite= 0x08,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是通知
CBCharacteristicPropertyNotify= 0x10,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是聲明
CBCharacteristicPropertyIndicate= 0x20,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是通過(guò)驗(yàn)證的
CBCharacteristicPropertyAuthenticatedSignedWrites= 0x40,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是拓展
CBCharacteristicPropertyExtendedProperties= 0x80,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是需要加密的通知
CBCharacteristicPropertyNotifyEncryptionRequiredNS_ENUM_AVAILABLE(NA, 6_0)= 0x100,
// 標(biāo)識(shí)這個(gè)characteristic的屬性是需要加密的申明
CBCharacteristicPropertyIndicateEncryptionRequiredNS_ENUM_AVAILABLE(NA, 6_0)= 0x200
};