iOS 初識CoreBluetooth

wongstar發表於2017-12-14

####導語:

近距離通訊目前主要有NFC(Near Field Communication),BLE(Bluetooth Low Energy)等技術,本文主要是講BLE低功耗藍芽傳輸。

###一,BLE前世今生 在iOS開發中,藍芽通訊有兩種方式,一種是傳統的藍芽(Classic Bluetooth),另外一種就是低功耗BLE(Bluetooth Low Energy ).其中傳統藍芽用到的是ExternalAccessory庫,需要過MFi認證,而BLE僅需要引入coreBluetooth Framework就行.

Note:使用CoreBluetooth庫,手機需要iPhone 4S及以上機型, OS 版本需要iOS 6.0及以上版本。

###二,初識Core Bluetooth framework

CoreBluetooth framework提供了iOS or Mac app BLE通訊的class 庫,如圖一所示上層Apps 通過core Bluetooth 訪問底層的BLE GATT(Generic Attribute Profile)協議。GATT層具體實現是基於Bluetooth 4.0 specification.

圖一.png
#####1.CoreBluetooth framework角色分類

在CoreBluetooth framework中提供了兩種角色。一種是中央裝置,另外一種是外圍裝置.以下是它們具體定義:

  • 外圍裝置(Peripheral device)-->一般是簡單的低功耗裝置,用來提供資料,並連線到一個更加相對強大的中心裝置。例如XX手環,心率等
  • 中央裝置(Central device)-->一般是連線外圍裝置,比如手機等 如圖二所示,Central對應的Client端,Peripherald對應Server端。Peripheral端做資料收集工作,比如心率,計步資料的採集。Central端一般是通過BLE獲取到Peripheral端資料展示具體UI.
    圖二.png

#####2.建立連線 如圖三,外圍裝置一直廣播自己的Ad(Advertising Data Payload廣播資料)資料,中央裝置負責Scan自己感興趣的裝置,接受到對應的Ad資料然後解析出相對應的資料,然後通過Scan Response Data Payload(掃描回覆)包進行回覆。如果中央裝置掃描到相對應的裝置,可以傳送連線命令。連線成功就可以相互傳輸對應的資料。

圖三.png

  • Ad(Advertising Data Payload) 如圖四所示:每種Ad資料最長可以包含 31 byte。這裡廣播資料可以填充裝置名稱或者隨機一串資料.具體的Strcut如圖中1B定義資料的長度,1B定義資料型別,剩下的定義資料,通過這個資料結構可以知道怎麼寫出相對應的解析AD程式。

    圖四.png

  • 廣播工作流程 如下圖五所示:外圍裝置會設定一個廣播間隔,每個廣播間隔中,它會重新傳送自己的廣播資料。廣播間隔越長,越省電,但是也不太容易掃描到。其中廣播間隔可以通過程式碼來調整。

    圖五.png

###三,資料傳輸Core Bluetooth Object

CBUUID 來標明的是具體哪個Service,Characteristic,具有唯一性,可以通過 uuidgen 命令生成對應唯一的UUID Characteristic所對應的許可權如下:使用列舉的形式來定義。如果需要2種以上的屬性只需要加上邏輯或|符合比如CBCharacteristicPropertyRead|CBCharacteristicPropertyWrite可讀可寫許可權

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
};

複製程式碼

比如定義Notify具有通知模式的特徵值,該特徵值具有通知許可權,可以在外設發生變化的時候直接通知中央裝置.通常用這個屬性來傳輸相應data,當外設更新及時通知中央裝置更新UI.

  _notifyCharacteristic=[[CBMutableCharacteristic alloc] initWithType:charNotifyUUID properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable|CBAttributePermissionsWriteable];
複製程式碼

圖六.png

  • 在中央裝置中獲取外設相關資訊 CBCentralManager:管理Peripheral 的類,Peripheral物件提供傳送,掃描,連線等介面的類. CBService: 外設所提供的服務.包含數個Characteristic. CBCharacteristic:通過讀取CBCharacteristic特徵值來獲取到相對應的資料.

CBCentralManager獲取外圍裝置CBPeripheral,通過CBPeripheral能獲取到相對應的CBService,然後通過相對應的CBService獲取到相對應的CBCharacteristic.通過CBCharacteristic能獲取到具體值。 它們關係圖圖七所示 :

圖七.png

  • 在外設中獲取中央裝置相關資訊 CBPeripheralManager:管理Central的類。提供廣播對應的服務等功能。 CBMutableService:通過CBPeripheralManager來廣播相對應服務 CBMutableCharacteristic:相對應的服務。 它們關係圖如圖八所示:
    圖八.png

後續會繼續介紹外圍裝置,中央裝置iOS android是如何實現。敬請期待。