iOS藍牙開發:解析BabyBluetooth

baby庫:https://github.com/coolnameismy/BabyBluetooth很感謝劉彥瑋為iOS藍牙開發作出的貢獻。

藍牙開發步驟

  1. 掃描外設
  2. 發現外設
  3. 連接外設
  4. 獲取外設讀寫的特征
  5. 獲取外設發出的信息和向外設發信息

原生<CoreBluetooth/CoreBluetooth.h>就不分析了,baby是基于原生封裝的,非常好用,但還是有點問題。

大家在下載babyexample的時候會發現代碼有很多,有些是我們不需要用的,如何做到縮減,以及一些存在的問題如何解決。

縮減baby

  1. 掃描
baby.scanForPeripherals().begin().stop(4);

這里掃描4秒后停止掃描,這里有個問題就是掃描的時候默認是斷開全部連接的,如果不需要的需要點stop改一下。

  1. 發現外設
    掃描之后會進入發現外設的代理
  [baby setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
        [weakSelf insertTableView:peripheral advertisementData:advertisementData];
    }];

參數解析:1. peripheral為掃描發現的外設。 2. advertisementData為外設廣播包攜帶數據,主要獲取有幾個服務顯示出來,只要用這個key:kCBAdvDataServiceUUIDs。3. RSSI為外設信號

  1. 連接外設
baby.having(currPeripheral).enjoy();
  1. 發現外設特征
    連接外設的成功之后會進入代理
[baby setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
        [rhythm beats];
        if ([[service.UUID UUIDString] isEqualToString:@"FFE0"]) {

             [peripheral setNotifyValue:YES forCharacteristic:service.characteristics[0]];
        }
    }];

這里根據UUID之后獲取相對應的特征,主要是讀和寫特征,這里的 [peripheral setNotifyValue:YES forCharacteristic:service.characteristics[0]];是如果發現讀的特征直接設置它具有讀數據的功能

  1. 獲取讀和寫特征之后就是寫數據和收數據了
  2. 接收數據:在這里就可以對接收到的數據進行操作了
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {
}];
  1. 寫數據:四個參數,外設、數據nsdata類型、寫的特征、type
[self.leftPeripheral writeValue:[self hexToBytes:@"a55a03010003"] forCharacteristic:self.leftWrite type:1];

以上呢就可以做出藍牙收發數據的功能了,還有一些代理沒有寫上,比如斷開連接代理、連接失敗代理等等,大家根據需求加上去。

注意點

  1. 點擊藍牙連接的時候,這是如果立馬跳轉下個頁面去收發數據,會崩潰,這是因為在連接藍牙的時候讀取特征沒完成就跳轉了。建議:在點擊鏈接藍牙的時候做一個菊花,等到全部讀完的時候再消失
 //設置beats break委托
    [rhythm setBlockOnBeatsBreak:^(BabyRhythm *bry) {
        NSLog(@"setBlockOnBeatsBreak call");

        //如果完成任務,即可停止beat,返回bry可以省去使用weak rhythm的麻煩
        //        if (<#condition#>) {
        //            [bry beatsOver];
        [WKHUD dismissWithHUD:self.hud];
        
    }];

在這里消失

  1. 第一次連接斷開之后再連接的時候接收數據的代理直接觸發,這個時候數據處理就會出錯,因為處理數據的時候大部分會用到數組,這種情況數組越界崩潰。
    解決:在離開收發數據那個頁面的時候
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {}];

寫上這句,blobk里面什么都不要寫。

最后babydemo里代理都加上了Channel,這里個人建議不要加,加了之后后續要連接多個藍牙就很難處理的

總結
一開始做藍牙的時候原生API真是讓人很難受,自從遇到baby庫真的很輕松,再次感謝劉彥偉。本人看到baby的封裝之后,特意仿造封裝出gameKit:http://www.lxweimin.com/p/209e07344e5a

baby庫提煉 : https://github.com/scrumsnail/LZBLEManager.git

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

推薦閱讀更多精彩內容