iOS之藍牙開發—CoreBluetooth詳解


  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中藍牙的開發流程,便於初學者理解和認知,當然項目中的藍牙開發沒有這么的簡單,需要結合實際情況綜合考慮,但是一切都得從最簡單的開始。本人也是剛開始學習藍牙模塊,有寫的不對的地方,請大家指出,有理解不了的地方可以同我交流。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM