iOS 藍(lán)牙開發(fā)(二)

前期回顧

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ù)和特征。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容