1. 程式人生 > >iOS 基於CoreBlueTooth 封裝的客戶端藍芽庫

iOS 基於CoreBlueTooth 封裝的客戶端藍芽庫

    最近公司專案少了很多,所以有時間把之前專案中封裝的藍芽庫分享一下。

    原生的CoreBluetooth庫採用代理的方式實現資料反饋或狀態更新,這樣有個缺點就是程式碼很離散,且會導致與業務層耦合度高,不便於移植。再有就是業務層讀寫資料時,需要關心特徵值以及應答模式等太多底層的東西。如下:

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

    鑑於此原因(槽點),所以將CoreBlueTooth再次封裝。整體模組設計圖如下:


說明:

該封裝庫包含兩個模組。  BLEKit 是客戶端管理模組,提供藍芽控制API,以及藍芽資料讀寫協議API

BLEService模組是藍芽應用層協議(業務層協議)的封裝,提供給業務層讀寫以及資料通知API

使用方法:

一、CentralManager以狀態機的方式表現當前的狀態

/**
 * @enum BLECentralState
 *
 * @discussion BLE 中心裝置管理器狀態機
 * @constant BLECentralStateInvalid: 無效狀態,藍芽未開啟 or 藍芽不可用
 * @constant BLECentralStateIdle: 空閒狀態,沒有開始工作 or 工作中斷
 * @constant BLECentralStateScaning: 正在掃描周邊裝置狀態
 * @constant BLECentralStateUnDiscovered: 未發現周邊狀態,超時或者其他原因
 * @constant BLECentralStateDiscovered: 已發現周邊狀態
 * @constant BLECentralStateConnecting: 正在連線外設狀態
 * @constant BLECentralStateUnConnected: 未連線成功,連線失敗狀態
 * @constant BLECentralStateConnected: 連線成功狀態,注意:此狀態表示外設已經連線且有可用服務
 * @constant BLECentralStateRuning: BLE中心裝置正常工作狀態,表示可以進行藍芽資料通訊
 */
typedef NS_ENUM(NSInteger, BLECentralState)
{
    BLECentralStateInvalid,
    BLECentralStateIdle,
    BLECentralStateScaning,
    BLECenteralStateUnDiscovered,
    BLECentralStateDiscovered,
    BLECentralStateConnecting,
    BLECentralStateUnConnected,
    BLECentralStateConnected,
    BLECentralStateRuning,
};

控制類API如下:

/**
 * 開始掃描周邊外圍裝置,直到呼叫stopScan
 */
- (void)startScan;

/**
 * 開始掃描周邊外圍裝置
 *
 * @param timeout 掃描超時時間
 */
- (void)startScanWithTimeout:(NSInteger)timeout;

/**
 * 停止掃描
 */
- (void)stopScan;

/**
 * 開始連線外設
 *
 * @param bracelet 外圍裝置屬性
 */
- (void)connect:(BLEPeripheral *)bracelet;

/**
 *  斷開藍芽連線
 */
- (void)disConnect;

狀態變化採用通知的方式上報給業務層,考慮存在多個業務模組監聽BLE狀態

/**
 * BLE Centeral 狀態變化採用通知的方式上報給業務層,考慮存在多個業務模組監聽BLE狀態,
 * 所以使用通知作為互動模式。
 */
extern NSString *const  BLECentralStateDidChangedNotification;

二、BLESerivice 基於CentralManager模組內的協議實現 業務層協議stackProtocol,CentralManager模組內只提供協議通道,具體的協議格式需要業務層定義。

三、具體的API呼叫方式請參考原始碼:

https://github.com/tomtcl/BluetoothKit