GJLightBlueTooth——一個輕量級的iOS藍牙開發庫

從上家公司離職已經快半年了,與藍牙打了一年的交道,從小白一個到略知一二。最近在整理上一家公司作的一些項目,突發奇想,本身封裝一個藍牙庫,方便之後的使用。說幹就幹,若是須要項目代碼,猛擊這裏GJLightBlueTooth。若是有用,請賞顆小星星。git

GJLightBlueTooth架構

當初爲了避免在一個類裏面同時處理髮送與接收邏輯,也本着對外封閉的原則,爲了給使用庫的人一個簡單的類,就設計了:github

用戶 ——> GJLightBlueTooth ——> CoreBlueTooth ——> GJLightBlueTooth ——> 用戶
複製代碼

這樣的架構bash

其中:架構

  • GJLightBlueTooth:至關於一箇中介,架起來自頁面用戶的指令和系統CoreBlueTooth交互的橋樑,這裏的交互包括向藍牙設備發送指令和設置回調。
  • GJLBTCentralManager:全部與系統CoreBlueTooth的溝通都在這裏進行,這裏將指令發出去,也在這裏獲取回調,經過block回傳。

另外,在Demo中,你還會看到MyBLETool這個類,這是爲了將Demo項目中頁面與業務分離而單獨出來的一個類,能夠理解爲設備類。爲了咱們不須要在具體的頁面中去設置回傳的block。工具

使用

在建立頁面後,你應該初始化GJLightBlueTooth藍牙工具:self.BLE = [[GJLightBlueTooth alloc] init]。post

在獲取到Characteristic後,你應該根據實際讀寫的Characteristic匹配出設備上的CBCharacteristic,保存在本地,用於後面的寫與讀。ui

[self.BLE setBlockWhenDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
        strongify(self);
        for (CBCharacteristic *cha in service.characteristics){
            if ([cha.UUID.UUIDString isEqualToString:CharacteristicUUIDWrite]){
                self.writeCharacter = cha;
            }
        }
        //[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoverCharacteristics" object:service];
    }];
複製代碼

掃描

[self.BLE scan]
複製代碼

中止掃描

[self.BLE stopScan]
複製代碼

鏈接設備

[self.BLE connectWithPeripheral:peri]
複製代碼

斷開鏈接

[self.BLE cancelConnectWithPeripheral:peri]
複製代碼

讀取信號量

[self.BLE readRSSIWithPeriperal:peri]
複製代碼

發送數據

[self.BLE sendDataToPeriperal:peri WriteCharacteristic:self.writeCharacter Command:command NSEncoding:encoding]
複製代碼

這裏針對如今不少公司提出須要手機與設備有心跳的要求,開啓了一個線程隊列。該隊列設置可以同時存在的指令數爲3。spa

NSData *cmdData = [[NSString stringWithFormat:@"%@",command] dataUsingEncoding:encoding];
    
    NSOperation *opration = [NSBlockOperation blockOperationWithBlock:^{
        [peripheral writeValue:cmdData
            forCharacteristic:writeCharacteristics
                         type:CBCharacteristicWriteWithoutResponse];
        /*
         * you can set thread time interval.but the order while delay when there are a lot of orders.
         */
        //[NSThread sleepForTimeInterval:SleepTimeGap];
    }];
    
    [self.writeQueue addOperation:opration];
複製代碼

你也能夠設置指令間隔時間,可是這樣會形成因心跳刷新過快形成的延遲發送。線程

注意

  • 在新版本的iOS中,已經不容許經過peripheral.RSSI來獲取設備的信號量,必須在用[peripheral readRSSI]後,使用回調來獲取。這就會形成在掃描到設備時候沒法顯示信號量。因此專門建立了一個分類CBPeripheral+RSSI,利用Runtime來動態給peripheral建立了一個rssi屬性。
char nameKey;

- (void)setRssi:(NSNumber *)rssi{
    objc_setAssociatedObject(self, &nameKey, rssi, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSNumber *)rssi{
    return objc_getAssociatedObject(self, &nameKey);
}
複製代碼
  • 在MyBLETool中,須要設置GJLBTCentralManager回調流,這裏爲了防止循環引用,須要進行weak-strong dance。
weakify(self);

[self.BLE setBlockWhenDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
        strongify(self);
        for (CBCharacteristic *cha in service.characteristics){
            if ([cha.UUID.UUIDString isEqualToString:CharacteristicUUIDWrite]){
                self.writeCharacter = cha;
            }
        }
        //[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoverCharacteristics" object:service];
    }];
複製代碼

最後是兩張demo的效果

若是須要項目代碼,猛擊這裏GJLightBlueTooth。若是有用,請賞顆小星星。設計

相關文章
相關標籤/搜索