iOS中用到的框架是CoreBluetooth.framework,主要用于和第三方藍(lán)牙的交互,這個(gè)不需要蘋(píng)果的認(rèn)證,但是必須是藍(lán)牙4.0以上的設(shè)備。藍(lán)牙4.0也叫BLE(Bluetooth Low Energy 藍(lán)牙低功耗)所以一般都稱(chēng)之為BlE開(kāi)發(fā),從iPhone4s及其以后的設(shè)備、從iOS6及其以后的系統(tǒng)都是支持BLE的。所以說(shuō)IOS的BLE開(kāi)發(fā)其實(shí)就是CoreBluetooth.framework這個(gè)框架的使用,一般情況下現(xiàn)在所說(shuō)的IOS藍(lán)牙開(kāi)發(fā)也都是BLE開(kāi)發(fā)。我們現(xiàn)在所做的智能家居,智能手環(huán),類(lèi)似的這些東西基本都是使用的這種方式與iPhone連接的。
核心概念
CBCentralManager:中心設(shè)備(用來(lái)連接到外部設(shè)備的管家)
CBPeripheralManager:外部設(shè)備(第三方的藍(lán)牙4.0設(shè)備)
當(dāng)手機(jī)作為中心設(shè)備去連接第三方藍(lán)牙設(shè)備的時(shí)候,首先需要了解下面幾個(gè)概念
服務(wù):每一個(gè)外部設(shè)備都會(huì)擁有若干個(gè)服務(wù),比如說(shuō)你的智能手環(huán)可能會(huì)擁有一個(gè)管理你心率的服務(wù),還有一個(gè)管理你跑步情況的服務(wù)。這些服務(wù)是你的硬件工程師設(shè)定的,作為我們?cè)陂_(kāi)發(fā)的時(shí)候只需要知道有哪些服務(wù)就可以了,每一個(gè)服務(wù)都會(huì)有一個(gè)唯一的UUID,就是一個(gè)字符串,用于辨別區(qū)分是哪個(gè)服務(wù)(外部設(shè)備也會(huì)有其對(duì)應(yīng)的一個(gè)UUID),如果你連接到這個(gè)設(shè)備的話(huà),你是可以搜索到這些服務(wù)的。
特征:每一個(gè)服務(wù)里邊都會(huì)有若干個(gè)特征,我們就是通過(guò)這些特征值來(lái)與設(shè)備進(jìn)行交互的,還拿手環(huán)的例子來(lái)說(shuō),比如在它的管理你跑步情況的服務(wù)中可能有兩個(gè)特征值,一個(gè)特征是讀取手環(huán)內(nèi)你跑步的數(shù)據(jù),一個(gè)特征是用于你的APP發(fā)送數(shù)據(jù)給這個(gè)服務(wù),進(jìn)行一些設(shè)置什么的,同樣每個(gè)服務(wù)中的特征也是由你的硬件工程師設(shè)置好的,你只需要用就好了,當(dāng)然這些特征值也會(huì)有其對(duì)應(yīng)的一個(gè)唯一的UUID。
特征的屬性:這些個(gè)特征的屬性也是不盡相同有的是用來(lái)讀數(shù)據(jù)的,有的是用來(lái)訂閱通知的,有的是用來(lái)發(fā)送數(shù)據(jù)的,這些屬性同樣也都是設(shè)定好的,我們只需要知道哪一個(gè)特征是什么屬性就好了。這些屬性種類(lèi)有一個(gè)枚舉:
也就是說(shuō)每個(gè)外設(shè)下面有多個(gè)服務(wù),每個(gè)服務(wù)下面有多個(gè)特征,我們和外設(shè)交互數(shù)據(jù)通過(guò)特征進(jìn)行讀、寫(xiě)、通知的;
藍(lán)牙中心模式流程如下:
- 建立中心角色
- 掃描外設(shè)(discover)
- 連接外設(shè)(connect)
- 掃描外設(shè)中的服務(wù)和特征(discover)
- 4.1 獲取外設(shè)的services
- 4.2 獲取外設(shè)的Characteristics,獲取Characteristics的值,獲取Characteristics的Descriptor和Descriptor的值
- 與外設(shè)做數(shù)據(jù)交互(explore and interact)
- 訂閱Characteristic的通知
- 斷開(kāi)連接(disconnect)
特征屬性
typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {
CBCharacteristicPropertyBroadcast = 0x01,
CBCharacteristicPropertyRead = 0x02,
CBCharacteristicPropertyWriteWithoutResponse = 0x04,
CBCharacteristicPropertyWrite = 0x08,
CBCharacteristicPropertyNotify = 0x10,
CBCharacteristicPropertyIndicate = 0x20,
CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,
CBCharacteristicPropertyExtendedProperties = 0x80,
CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x100,
CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x200
};