iOS之藍芽開發—CoreBluetooth詳解,ioscorebluetooth
CoreBluetooth的API是基於BLE4.0的標準的。這個架構涵蓋了BLE標準的所有細節。僅僅只有新的iOS裝置和Mac是和BLE標準相容.在CoreBluetooth架構中,有兩個主要的角色:周邊和中央(Peripheral and Central) ,整個架構都是圍繞這兩個主要角色設計的,他倆之間有一系列的回調交換資料。1展示了周邊和中央(Peripheral and Central),還有他倆之間的關係。
開發藍芽這塊,有兩種模式,一個是中心模式,還有一個是外設模式。這裡主要講的是中心模式,中心模式的流程主要分為以下幾步:1、建立中心裝置 2、掃描外部裝置 3、串連外部裝置 4、掃描外部裝置中的服務和特徵 5、利用相關的特徵與外部裝置收發資料。進行講解之前,我們得知道一個中心裝置可以串連多個外部裝置,一個外部裝置包含一個或多個服務,一個服務包含一個或多個特徵。
下面根據我初學藍芽的角度來講解一下:
1、首先是匯入架構#import<CoreBluetooth/CoreBluetooth.h>,
然後建立中心裝置並設定代理(不要忘記簽訂協議):
CBCentralManager *manager = [[CBCentralManageralloc]init];
self.manager = manager;
一旦設定代理在運行程式的時候,就會調用協議裡一個必須要完成的方法:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
這個方法是查看中心裝置是否開啟藍芽。
2、利用中心裝置掃描外部裝置:
[manager scanForPeripheralsWithServices:niloptions:nil];
第一個參數那裡表示掃描帶有相關服務的外部裝置,例如填寫@[[CBUUIDUUIDWithString:@"需要串連的外部裝置的服務的UUID"]],即表示帶有需要串連的外部裝置的服務的UUID的外部裝置,nil表示掃描全部裝置;
options處以後細講,暫時可以寫一個@{CBCentralManagerScanOptionAllowDuplicatesKey :@YES}這樣的參數,YES表示會讓中心裝置不斷地監聽外部裝置的訊息,NO就是不能。
一旦掃描到外部裝置,就會進入協議中的
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
在這個方法裡,我們可以根據我們擷取到的硬體的某些條件進行篩選,然後串連我們需要串連的外部裝置,例如串連名字帶有A的外部裝置:
if ([peripheral.namehasPrefix:@"A"] ) {
//串連裝置
[manager connectPeripheral:peripheraloptions:nil];
}
3、剛剛的if判斷中的語句就是在進行中心裝置和外部裝置的串連。串連成功或者失敗會分別進入
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;(串連成功)
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullableNSError *)error;(串連失敗)
4、我們在串連成功的方法中開始掃描外部裝置的服務:
[peripheral discoverServices:nil];
接著就會跳入探索服務的代理方法中去:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
我們在這個方法裡面開始掃描服務中的特徵:
[peripheral discoverCharacteristics:nilforService:service];
當我們掃描到特徵的時候,就會跳入發現特徵的協議方法裡去:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
5、掃描到特徵之後,我們就可以拿到相應的特徵進行讀寫操作。
例如進行讀取資料的操作:
if ([characteristics.UUID.UUIDStringisEqualToString:@"你需要的特徵的UUID"]){
//讀取特徵資料
[peripheral readValueForCharacteristic:characteristics];
}
這就讀取了特徵包含的相關資訊,只要讀取就會進入另外一個方法:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError *)error;
在這個方法裡,我們就可以拿到我們需要的資料了。進行寫的操作是
[peripheralwriteValue:data類型的資料 forCharacteristic:使用到的特徵 type:CBCharacteristicWriteWithResponse];
最後的type類型有兩個,分別是CBCharacteristicWriteWithResponse和 CBCharacteristicWriteWithoutResponse;
選擇第一個,每往硬體寫入一次資料都會進入
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError *)error;
這個方法會告訴我們這次的寫入是否成功,但是如果我們不用考慮往硬體寫入的資料成功與否的話,選擇第二個類型就ok。
以上就是簡單的介紹了一下iOS中藍芽的開發流程,便於初學者理解和認知,當然項目中的藍芽開發沒有這麼的簡單,需要結合實際情況綜合考慮,但是一切都得從最簡單的開始。本人也是剛開始學習藍芽模組,有寫的不對的地方,請大家指出,有理解不了的地方可以同我交流。