iOS 掃描周邊的藍牙4.0設備並實現連接


一引言

       最近在為下一個項目做准備, 其中有一項是手機跟藍牙4.0的外設連接並實現通訊(非4.0的外設會很麻煩, 需要了解的可以自行的去查, 這里不再具體說).所有抽空簡單學習了一下iOS中的coreBluetooth框架以及一些簡單的應用, 由於我們的通訊已經有同事封裝了現成的sdk, 這里不涉及通訊的內容(其實是我也不太清楚).就跟大家簡單的說一下掃描和連接.

二.iOS藍牙連接的解決方案

iOS設備藍牙連接主要有一下幾種實現方式:

①.參加蘋果的(MFI)計划, 也就是需要得到蘋果的認證, 費用高, 至於高到什么程度, 自己可以去查一下.

②.coreBluetooth框架. 只支持4.0的藍牙設備, 也是本文的主角, 一會會具體說.

③.GameKit框架. 這個框架只用用於iOS設備之間的藍牙連接通訊, 並不符合我們的需求, 沒有仔細研究.

④.私有API(BluetoothManager框架). 這個東西怎么說, 對於一些經歷過被拒的慘痛教訓的人來說, 用私有api?還是算了吧, 如果你想用, 你可以試試,反正我是不用!

⑤.越獄. 如果你做越獄包得話,這個就隨意了, 想怎么用怎么用.

三.coreBluetooth框架連接4.0的藍牙外設

 CoreBluetooth兩個很重要的概念,Central 和 Periperal Devices. 也就是中心和外設, 這里我們是要用手機掃描外設, 連接之后實現通訊, 所以這里我們的手機就是Central了.

首先, 我們創建一個工程, 導入coreBluetooth框架

然后就是在我們的項目中引入coreBluetooth框架了.這里封裝了一個工具類, .h文件如下代碼

#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
#import <UIKit/UIKit.h>

/** 工具類
 * @note 用於掃描周邊的藍牙4.0設備,並存儲
 */
@interface GetBluetoothEquipmentNearby : NSObject<CBCentralManagerDelegate>

/*...用於存儲周邊的設備列表...*/
@property (nonatomic, strong)NSMutableArray * devicesListArray;

/** 掃描周邊外設
 * @note 掃描周邊的所有藍牙4.0外設
 */
-(void)discoverDevices;

 

以下是代碼的實現部分了:

-(void)discoverDevices
{
    /*...創建manager對象, 創建完成之后會回調代理方法...*/
    self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    
    /*...掃描周邊的外設...*/
    [self.bluetoothManager scanForPeripheralsWithServices:nil options:nil];
}

創建完之后, 會回調代理方法

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch ([central state])
    {
        case CBCentralManagerStateUnsupported:
            NSLog(@"藍牙不可用");
            break;
        case CBCentralManagerStateUnauthorized:
            NSLog(@"未授權");
            break;
        case CBCentralManagerStatePoweredOff:
            NSLog(@"藍牙未打開");
            break;
        case CBCentralManagerStatePoweredOn:
            NSLog(@"藍牙已打開");
            break;
        case CBCentralManagerStateUnknown:
            NSLog(@"狀態未知");
        default:
            NSLog(@"不明情況了");
            ;
    }
}

接着就是掃描外設了, 這里我們參數都傳的是nil, 意思就是掃描所有的外設.當然你也可以傳一個UUID進去, 是以數組的形式傳得.這里由於我們做的是模擬第一次連接, 也就沒有指定的UUID了, 有興趣的可以自己測一下傳一個UUID進去.

 /*...掃描周邊的外設...*/
    [self.bluetoothManager scanForPeripheralsWithServices:nil options:nil];

這就開始掃描了外設, 掃描到外設的時候同樣是會回調代理方法來通知我們的.

/*...掃描到外設的時候會調該方法...*/
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    if(![self.devicesListArray containsObject:peripheral])
        [self.devicesListArray addObject:peripheral];
    
    NSLog(@"%@", peripheral.identifier);
    NSLog(@"%@", peripheral);
}

這里打印出來的peripheral.identifier就是外設的UUID, 以我的代碼風格來說的話, 這個時候我會用個model來存儲該外設的所有信息. 以后用的話也方便, 至於你想怎么用, 這個就因人而異了.另外還有注意的是,打印的一些其他參數advertisementData是廣告數據,rssi代表着信號強度. 由於我這會並沒有外設讓我來測試, 我這邊也沒法貼圖給大家了,見諒.

像蘋果這樣這么追求用戶體驗的,有開始掃描, 必定會有停止掃描了, 至於在什么時候停止, 這就看各位看官們的心情了.

[self.bluetoothManager stopScan];

 

下面就是連接了, 這里很方便:

//連接指定的設備
-(BOOL)connect:(CBPeripheral *)peripheral
{
    [self.bluetoothManager connectPeripheral:peripheral
                       options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
    return YES;
}

這里連接到的設備是可以自己去指定的.顯然以蘋果的風格, 連接成功之后需要回調來通知我們連接成功的.

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"Did connect to peripheral: %@", peripheral);
}

到這里, 就實現了掃描藍牙4.0的外設並實現連接了.至於加定時器來監控連接超時, 這個我想大家應該都會寫, 這里不再貼代碼.

四.結語

正如我開頭說的, 我們的通訊有同事封裝好的SDK, 所以這里就沒有介紹掃描外設中的服務, 以及訂閱這些內容了.只是單純的一個掃描和連接, 如果你想讓你的功能類更強大, 就可以根據需求填一些功能了, 比如監聽連接狀態, 連接超時, 自動重連等等.

 

另:我這邊有一個問題一直沒有解決, 就是:第一次用的時候, 跳到設置里面去把藍牙打開之后, 我不知道怎么讓他自動跳回到應用中, 害的我每次都要重新啟動應用.這里希望知道怎么解決的朋友說一下, 不勝感激!--CP


免責聲明!

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



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