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