iOS-蓝牙4.0开发(踩过的坑)
前言
來(lái)公司整整一年了,做得項(xiàng)目全部涉及藍(lán)牙。坑應(yīng)該給我踩得差不多了吧,但是一直沒(méi)有做記錄,今天就好好地回顧下項(xiàng)目,總結(jié)一下踩過(guò)的坑,希望對(duì)大家有所幫助。PS:本文重點(diǎn)不在于CoreBluetooth框架的使用,而是實(shí)現(xiàn)業(yè)務(wù)需求時(shí)需要注意的事項(xiàng)。
另:推薦LightBlue App,基于CoreBluetooth。是BLE開(kāi)發(fā)的調(diào)試?yán)?#xff0c;該App上能獲取的數(shù)據(jù),你就能用代碼實(shí)現(xiàn)。藍(lán)牙設(shè)備通訊協(xié)議上寫明有的數(shù)據(jù),但是獲取不了,那就是硬件那邊的問(wèn)題了。
LightBlue
坑0、藍(lán)牙版本
- 藍(lán)牙4.0:也叫BLE(Bluetooth low energy),特點(diǎn)是功耗低,傳輸速率也較低。但絕對(duì)可以滿足市場(chǎng)上的大部分智能穿戴產(chǎn)品了,是目前iOS藍(lán)牙開(kāi)發(fā)的主流。從iPhone4s開(kāi)始支持。使用CoreBluetooth進(jìn)行開(kāi)發(fā)
- 藍(lán)牙3.0:硬件需要獲得MFi認(rèn)證才能配合iOS設(shè)備使用,使用ExternalAccessory框架進(jìn)行開(kāi)發(fā)。 因?yàn)橛布幸?#xff0c;一般的藍(lán)牙外設(shè)都不會(huì)選擇3.0,除了涉及高質(zhì)量音頻傳輸?shù)?#xff0c;比如耳機(jī)。
初到公司時(shí),硬件已經(jīng)做好了。藍(lán)牙模塊是3.0和4.0雙模的,由于他們不知道MFi認(rèn)證這回事,所以用的是3.0串口協(xié)議。 我初次接觸藍(lán)牙開(kāi)發(fā),加上Android端是能用的,折騰了許久才發(fā)現(xiàn)是硬件的問(wèn)題。最后放棄了當(dāng)前的方案,考慮過(guò)用WiFi,因?yàn)楣暮瓦B了設(shè)備用戶就不能用WiFi上網(wǎng)的原因,最終還是選擇了BLE。
坑1、搜索設(shè)備時(shí)用的Service UUID
[_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FFA0"] options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];以上函數(shù),傳nil代表搜索周圍的全部設(shè)備;傳UUID代表搜索包含該服務(wù)的特定設(shè)備。
有些朋友可能會(huì)遇到這種的情況:傳nil可以搜到,傳UUID卻搜不到,而且是明確知道該設(shè)備包含了該服務(wù)的。
造成這個(gè)問(wèn)題的原因是:硬件沒(méi)有將該Service添加到廣播包時(shí),即廣播時(shí)沒(méi)有將該UUID廣播出來(lái),所以iOS設(shè)備在搜索時(shí)候就會(huì)找不到對(duì)應(yīng)的設(shè)備。解決辦法:與硬件工程師溝通,讓他在廣播包里加上。
這個(gè)本來(lái)這也不是什么大問(wèn)題,因?yàn)槲覀內(nèi)匀豢梢酝ㄟ^(guò)設(shè)備名字去找到自己想連的設(shè)備。 但是在某些特定需求下,這個(gè)UUID是一定要廣播出來(lái)的,這個(gè)情況在后面會(huì)有提到。
坑2、獲取Mac地址
需求:
0、 初次使用App時(shí)需要掃描設(shè)備,并顯示出每臺(tái)設(shè)備的mac地址,點(diǎn)擊設(shè)備進(jìn)行綁定。
1、下次使用時(shí)則直接連接綁定的設(shè)備。
問(wèn)題:
- 對(duì)于需求0,Android端能做到,iOS卻不行..因?yàn)锳pple在這里做了限制,無(wú)法在掃描階段直接獲得設(shè)備的mac地址,必須連接上設(shè)備獲取服務(wù)和特征的值才能得到mac地址。
- 同樣需求1,Android端也能做到,iOS還是不行(很郁悶).. 原理同上。
解決辦法:
1、最簡(jiǎn)單的做法就是讓硬件工程師在廣播包中添加mac地址,這樣就能輕松實(shí)現(xiàn)以上兩個(gè)需求。
2、很不幸,我用得是第二種方法,代碼寫起來(lái)非常難受。具體邏輯是:
因?yàn)闇y(cè)試設(shè)備只有一臺(tái),不能模擬多臺(tái)設(shè)備的情況。調(diào)試起來(lái)也有難度。還遇到了其他的困難具體不表了。以上是實(shí)現(xiàn)需求0的思路,需求1的思路也差不多。
坑3、后臺(tái)藍(lán)牙+重連
實(shí)現(xiàn)后臺(tái)藍(lán)牙數(shù)據(jù)傳輸很簡(jiǎn)單,筆者所用的Xcode8.3,鼠標(biāo)點(diǎn)幾下即可。
開(kāi)啟后臺(tái)藍(lán)牙模式
到此,在后臺(tái)中藍(lán)牙的基本操作都正常,其中需要做重連業(yè)務(wù)的要注意一點(diǎn):
- 斷開(kāi)后,我們一般是再次掃描周圍設(shè)備再完成重連。而后臺(tái)掃描設(shè)備跟前臺(tái)掃描周圍設(shè)備有一點(diǎn)不同:
也許是考慮到功耗的原因,在后臺(tái)只能搜索特定的設(shè)備,所以必須要傳Service UUID。不傳的話一臺(tái)設(shè)備都搜不到。而這時(shí)就需要外設(shè)在廣播包中有Service UUID,沒(méi)有的話是搜不到的.. 我當(dāng)時(shí)折騰了一天才知道這個(gè),并不是代碼的原因,最后讓硬件工程師在廣播包加上就OK了。
其他
其他的坑是關(guān)于藍(lán)牙傳輸音頻的,無(wú)非是藍(lán)牙傳輸速率的限制和實(shí)時(shí)流的播放,好像跟本文關(guān)系不太大,只簡(jiǎn)單說(shuō)下藍(lán)牙傳輸速率,iOS藍(lán)牙傳輸理論最大可達(dá)2667Bytes/s,這個(gè)作為參考就可以知道用BLE做音頻傳輸音質(zhì)方面是不太好的,但是這個(gè)也看業(yè)務(wù)。關(guān)于傳輸速率的具體內(nèi)容可以看:Maximizing BLE Throughput on iOS and Android,算是很權(quán)威的數(shù)據(jù)了。
實(shí)時(shí)流的播放也是一個(gè)坑,但是是另一個(gè)領(lǐng)域的東西,有空再寫吧。
關(guān)于我
目前在職iOS開(kāi)發(fā),業(yè)余時(shí)間獨(dú)立開(kāi)發(fā)App,現(xiàn)有上架作品:Mini記賬
公眾號(hào):沙拉可樂(lè)?分享獨(dú)立開(kāi)發(fā)的干貨和背后的故事
作者:沙拉可樂(lè)
鏈接:https://www.jianshu.com/p/2c085f260d65
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的iOS-蓝牙4.0开发(踩过的坑)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Python + Selenium】之
- 下一篇: wps文件一点打印就关闭打印机服务器,W