前期回顧
iOS 藍(lán)牙開發(fā)(一)
iOS 藍(lán)牙開發(fā)(三)
iOS 藍(lán)牙開發(fā)(四)
上一篇文章我們簡單記錄了如何掃描周邊設(shè)備、如何鏈接指定外設(shè)等基本操作,本期我們重點(diǎn)記錄如何獲取外設(shè)的服務(wù)和特征。
連接外設(shè)
#pragma mark - CBCentralManagerDelegate & CBCentralManagerDelegate
// 掃描外設(shè)
// 在藍(lán)牙于后臺被殺掉時,重連之后會首先調(diào)用此方法,可以獲取藍(lán)牙恢復(fù)時的各種狀態(tài)
- (void)centralManager:(CBCentralManager *)central
didDiscoverPeripheral:(CBPeripheral *)peripheral
advertisementData:(NSDictionary *)advertisementData
RSSI:(NSNumber *)RSSI
{
// 該代理方法會實(shí)時被調(diào)用,在該函數(shù)中篩選出指定的周邊外設(shè),最后根據(jù)這里賽選出的函數(shù)進(jìn)行連接。
}
// 成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
NSLog(@"連接到名稱為(%@)的設(shè)備-成功",peripheral.name);
}
// 失敗
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
NSLog(@"連接到名稱為(%@)的設(shè)備-失敗,原因:%@",[peripheral name],[error localizedDescription]);
}
// 斷開連接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
NSLog(@"外設(shè)連接斷開連接 %@ \n", [peripheral name]);
}
-
獲取外設(shè)服務(wù)與特征流程
藍(lán)牙發(fā)送服務(wù)與特征數(shù)據(jù)的流程圖
從上圖可以看出發(fā)送連接請求后,就會調(diào)用代理函數(shù)的回調(diào),連接外設(shè)成功后,就可以獲取到對應(yīng)外設(shè)CBPeripheral的service數(shù)組,從外設(shè)的內(nèi)部結(jié)構(gòu)可以看出,每一個外設(shè)可以有一個或多個service服務(wù)(它是個數(shù)組CBServices),每個CBServices又包含一個或多個特征(CBCharacteristic)也是個數(shù)組。所以外設(shè)的代理函數(shù)(CBPeripheralDelegate)中即包含了主設(shè)備與外設(shè)交互的大多回調(diào),即可根據(jù)對應(yīng)回調(diào)獲取到服務(wù)services、特征(characteristics)、rssi等數(shù)據(jù)。
- 實(shí)現(xiàn)函數(shù)
(重點(diǎn)看函數(shù)中的注釋)
中心設(shè)備的代理方法
// 藍(lán)牙設(shè)備連接成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
// 調(diào)用這個函數(shù)后就會進(jìn)入外設(shè)的代理函數(shù)去獲取對應(yīng)的CBServices和characteristics
[self.peripheral discoverServices:nil];
}
外設(shè)的代理方法
//獲取特征后的回調(diào)
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
if (error) {
NSLog(@"didDiscoverCharacteristicsForService error : %@", [error localizedDescription]);
return;
}
// 篩選自己需要的特征
[self createCharacticWithPeripheral:peripheral service:service];
}
//打印出 characteristic 的權(quán)限,可以看到有很多種,
//這是一個NS_OPTIONS,就是可以同時用于好幾個值,
//常見的有read,write,notify,indicate,知知道這幾個基本就夠用了,
//前連個是讀寫權(quán)限,后兩個都是通知,兩種不同的通知方式。
/*
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
};
總結(jié):
本章筆記主要是梳理如何獲取外設(shè)中的服務(wù)數(shù)組和特征數(shù)組。重點(diǎn)是在于要明白當(dāng)連接成功后,就會調(diào)用[self.peripheral discoverServices:nil];從而去回調(diào)外設(shè)peripheral的代理方法- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error, 在外設(shè)的方法中獲取到外部設(shè)備的傳遞的服務(wù)和特征。
