iOS 基於CoreBlueTooth 封裝的客戶端藍芽庫
阿新 • • 發佈:2019-02-02
最近公司專案少了很多,所以有時間把之前專案中封裝的藍芽庫分享一下。
原生的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