iOS藍牙原生封裝,助力智能硬件開發

引導語

人工智能自1956年提出以來,一直默默無聞,近年來人工智能的發展得到重視逐漸發展起步,智能硬件、智能手環、智能家居等等逐漸走進人們的生活,大大方便人們的同時也帶來了全新的用戶體驗和互聯網一個新的發展方向。

前言

最近公司也在做硬件設備,作為一名iOS開發人員,主要負責手機軟件、硬件的連接方面,開發連接硬件使用的SDK,其中主要模塊是藍牙連接,通過藍牙與硬件設備連接,發送指令使硬件工作。

功能說起來很簡單,但是尋找了好幾天的藍牙方面的Demo,看到了很多前人大神們封裝的Bluetooth方法,感覺對于我等小白實在是有點深奧,方法繁多,不知從何處下手。所以最后考慮再三,還是從底層基礎入手,自己重新整理、封裝了一份藍牙的查找、連接、寫入、斷開的類,本著程序員的開源精神,分享出來,歡迎大家指正。

下面 ,我對封裝類從功能方面分類進行說明:

系統藍牙狀態監聽

這個很方便,在系統藍牙方法centralManagerDidUpdateState中就可以實時獲取到藍牙狀態的改變,所以用一個Block回調就可以得到狀態,根據狀態變化做對應操作即可。

方法代碼如下:

/**

系統當前藍牙的狀態

@paramstateBlock?實時返回當前藍牙狀態

*/

-?(void)returnBluetoothStateWithBlock:(FZStateUpdateBlock)stateBlock;

藍牙搜索

藍牙搜索的功能方法中,用系統原生的方法scanForPeripheralsWithServices:options:,在藍牙搜索的代理方法centralManager:didDiscoverPeripheral:advertisementData:RSSI:里獲取搜索結果,用Block返回搜索結果。另外添加了方法通過設置參數nameStr來篩選返回的設備名稱,nameStr為設備模糊搜索參數,設備中包含nameStr字段即可返回搜索結果。

封裝后的代碼調用方法如下:

/*

*?開始搜索藍牙外設,每次在block中返回一個藍牙外設信息

*@paramnameStr??模糊搜索設備名稱,目標設備名稱包含字段

*??返回的block參數可參考CBCentralManager?的centralManager:didDiscoverPeripheral:advertisementData:RSSI:

*@paramdiscoverBlock?搜索到藍牙外設后的回調

*/

-?(void)scanForPeripheralsWithPrefixName:(NSString?*)nameStr?discoverPeripheral:(FZDiscoverPeripheralBlock)discoverBlock;

藍牙設備的連接

藍牙的連接為系統方法connectPeripheral:options:,連接設備的結果分別通過代理方法centralManager:didConnectPeripheral:返回成功、centralManager:didFailToConnectPeripheral:error:返回失敗,通過兩個Block分別返回成功和失敗。其中成功后要停止搜索stopScan,失敗要返回失敗原因。

代碼方法如下:

/*

*??連接某個藍牙外設,并查詢服務,特性,特性描述

*@paramperipheral??????????要連接的藍牙外設

*@paramcompletionBlock????操作執行完的回調

*/

-?(void)connectPeripheral:(CBPeripheral?*)peripheral?completeBlock:(FZConnectSuccessBlock)completionBlock?failBlock:(FZConnectFailBlock)failBlock;

寫入數據

寫入數據,在大多數的第三方方法里會有UUID、characteristic、peripheral等很多參數,混亂不易理解。這里我封裝后只留了一個characteristic特性參數,而且已經幫大家篩選出來了,可以在封裝方法頭文件里,連接設備成功后直接獲取到。另一方面,寫入內容直接用NSString類型就可以,內部會自動轉成NSData格式寫入設備。

寫入數據原生方法為writeValue:forCharacteristic:type:,寫入數據后會在代理方法peripheral:didWriteValueForCharacteristic:error:方法里得到是否寫入成功,成功與否用Block返回了結果。另外,如果藍牙設備有應答的時候,會在peripheral:didUpdateValueForCharacteristic:error:方法里返回,也一并封裝到了寫入方法里,通過Block返回應答結果。

代碼封裝后的接口為:

/*

*??往某個特性中寫入數據

*@paramcharacteristic?特性對象

*@paramcompletionBlock?寫入完成后的回調,只有type為CBCharacteristicWriteWithResponse時,才會回調

*/

-?(void)writeValue:(NSString?*)dataStr?forCharacteristic:(CBCharacteristic?*)characteristic?completionBlock:(FZWriteToCharacteristicBlock)completionBlock?returnBlock:(FZEquipmentReturnBlock)equipmentBlock;

這里需要注意的是:實際開發中,可以用一個叫lightBlue的藍牙開發輔助APP,看一下設備有多少特征值,我們實際用的時候需要用哪個,這個可以直接詢問硬件廠商或硬件開發人員,然后在調用寫入方法前,設置封裝類中的屬性UUIDString的對應值,可以保證連接過程中穩定不出問題

藍牙的斷開

藍牙的斷開,只留了一個方法,斷開當前連接的設備,使用系統原生方法cancelPeripheralConnection:,設備的信息在連接時已自動記錄,所以不需要傳入參數

代碼封裝后的方法如下:

/*

*??斷開藍牙連接

*/

-?(void)readRSSICompletionBlock:(FZGetRSSIBlock)getRSSIBlock;

其他

其他的方法,頭文件里開放了”RSSI轉距離Double類型數據”、”NSData轉16進制字符串”、”NSString類型轉NSData類型數據”三個方法。

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

推薦閱讀更多精彩內容