iOS 藍牙開發(二)

前期回顧

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, 在外設的方法中獲取到外部設備的傳遞的服務和特征。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容