文章結(jié)構(gòu)
- 藍(lán)牙封裝
- 自動(dòng)連接
- 后臺(tái)運(yùn)行
- 優(yōu)化注意事項(xiàng)
- 聲明
本篇不對(duì)藍(lán)牙的基本使用做介紹,網(wǎng)上多得跟米一樣。
藍(lán)牙封裝
對(duì)藍(lán)牙進(jìn)行封裝時(shí)候我選擇的是基于代理,有人使用基于block的,我認(rèn)為不好,結(jié)構(gòu)不夠清晰,藍(lán)牙是一系列操作的集合,本人覺(jué)得不大適合使用block進(jìn)行處理;并且藍(lán)牙的基本機(jī)制,比如掃描設(shè)備、連接等封裝成一個(gè)類,在本demo中該類為L(zhǎng)TSBTManager;而基于項(xiàng)目的使用藍(lán)牙進(jìn)行讀寫(xiě)數(shù)據(jù)的使用另外一個(gè)類來(lái)封裝接口,在本dmeo中該類為T(mén)aiJianYiService。
這樣做的好處是容易根據(jù)不同項(xiàng)目進(jìn)行復(fù)用,至于LTSBTManager基本不用針對(duì) 不同項(xiàng)目改變多少,TaiJianYiService(根據(jù)自己項(xiàng)目重命名)類的話可根據(jù)不同項(xiàng)目修改代理以滿足項(xiàng)目需求。
自動(dòng)連接
本人采用的是自動(dòng)連接上次連接過(guò)的設(shè)備,如果是手動(dòng)斷開(kāi)則取消自動(dòng)連接, 但是在連接上后如果是由于藍(lán)牙距離太遠(yuǎn)導(dǎo)致的斷開(kāi)連接,則接近時(shí)采用自動(dòng)連接。
為了實(shí)現(xiàn)自動(dòng)連接,可以使用NSUserDefaults保存上次連接過(guò)的peripheral的UUID。
斷開(kāi)連接后自動(dòng)連接,只需要在藍(lán)牙的代理didDisconnectPeripheral中調(diào)用
- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;
即可。
后臺(tái)運(yùn)行
網(wǎng)上有一些使用音樂(lè)后臺(tái)無(wú)限播放或者不短刷新地理位置,這其實(shí)是不行的,如果想要保持后臺(tái)長(zhǎng)時(shí)間運(yùn)行,應(yīng)該間歇性地和設(shè)備保持?jǐn)?shù)據(jù)通信,比如每隔30秒發(fā)送一次數(shù)據(jù),協(xié)議自己定。
優(yōu)化注意事項(xiàng)
- 只有在必要的時(shí)候才打開(kāi)掃描,因?yàn)樗{(lán)牙掃描是比較耗電的。
- 在搜索服務(wù)和特征時(shí)候,只搜索關(guān)心的服務(wù)和特征,而不應(yīng)該全局搜索,不管是從程序性能還是電池使用上都是不好的。
- 當(dāng)peripheral發(fā)現(xiàn)了特征(characteristic),需要監(jiān)測(cè)某個(gè)特征值時(shí),如果特征值基本不會(huì)改變或者不經(jīng)常性改變,則調(diào)用以下接口:
- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;
如果某個(gè)特征值經(jīng)常性改變,則應(yīng)該采用訂閱方式監(jiān)測(cè)該特征值,調(diào)用以下接口:
- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
- 重連方式:(1)重新獲取已發(fā)現(xiàn)的設(shè)備列表(搜索到的或是連接過(guò)的設(shè)備),使用 retrievePeripheralsWithIdentifiers: 。如果列表中有想要尋找的設(shè)備,那么發(fā)起連接。
注意:可能有多種原因?qū)е略O(shè)備不能被連接上。比如,設(shè)備不在附近。還有一種可能,一些低功耗藍(lán)牙使用隨機(jī)設(shè)備地址,在重新連接時(shí),它的地址可能已經(jīng)變了。因此,即使設(shè)備就在附近,設(shè)備的地址也已經(jīng)變了,這種情況下,你想要連接的設(shè)備與實(shí)際設(shè)備已經(jīng)不匹配了。這種情況,你只有重新搜索了。
(2)重新獲取當(dāng)前連接著的設(shè)備列表,使用retrieveConnectedPeripheralsWithServices:。 如果列表中有想要尋找的設(shè)備,發(fā)起本地連接,使得應(yīng)用與之連接上。檢查你想要連接的設(shè)備是否已經(jīng)連接到系統(tǒng)了(即可能其他應(yīng)用正連著呢)。
聲明
- 這只是一個(gè)demo,不可能拿過(guò)來(lái)就能用,而且我已經(jīng)把藍(lán)牙的數(shù)據(jù)封裝部分去掉了,但是里面引用的類以及頭文件沒(méi)有刪除,因項(xiàng)目需要的話,替換成自己定義的類即可。
- demo里的自動(dòng)連接時(shí)候,沒(méi)有進(jìn)行掃描,如果項(xiàng)目需要的話,需要自行掃描然后刷新UI。
謝謝你的垂閱,歡迎下載交流!