一 :前言
? ? ?對于剛接觸藍牙的萌新來說,直接用CoreBluetooch會感覺語句很復雜凌亂寫的到處都是桨仿,不優(yōu)雅案狠。經(jīng)常是10幾個委托方法,而且還得經(jīng)常在委托中調用方法再進其他委托吹零,整體結構層次就很不清晰拉庵。所以對于我這樣的藍牙萌新來說钞支,選擇BabyBluetooth來進行藍牙開發(fā)還是很有幫助的。
?二:BabyBluetooth介紹
? ? ?BabyBluetooth是一個最簡單易用的藍牙庫麻惶,基于CoreBluetooth的封裝信夫,并兼容ios和mac osx静稻。
BabyBluetooth的優(yōu)點:
1:基于原生CoreBluetooth框架封裝的輕量級的開源庫匈辱,可以幫你更簡單地使用CoreBluetooth API亡脸。
2:CoreBluetooth所有方法都是通過委托完成树酪,代碼冗余且順序凌亂大州。BabyBluetooth使用block方法厦画,可以重新按照功能和順序組織代碼,并提供許多方法減少藍牙開發(fā)過程中的代碼量力试。
3:鏈式方法體排嫌,代碼更簡潔淳地、優(yōu)雅。
4:通過channel切換區(qū)分委托調用蓬抄,并方便切換
5:便利的工具方法
6:完善的文檔夯到,且項目處于活躍狀態(tài)耍贾,不斷的更新中
7:github上star最多的純Bluetooch類庫(非PhoneGap和SensorTag項目)
三:?BabyBluetooth集成
在我自己的項目中,我選擇的是用cocoapods集成付翁,不得不說晃听,用cocoapods集成比自己集成要方便很多,集成步驟如下:
1:把pod 'BabyBluetooth', '~> 0.6.0'添加到你的Podfile中佣渴。
2.在命令行中執(zhí)行pod install辛润。
3.將CocoaPods生成的.xcworkspace運用到你的開發(fā)項目中即可见秤。
四:BabyBluetooth使用詳解
藍牙開發(fā)一般有如下五個步驟
1真椿、掃描外設
2突硝、發(fā)現(xiàn)外設
3三圆、連接外設
4舟肉、獲取外設讀寫的特征
5、獲取外設發(fā)出的信息和向外設發(fā)信息
接下來會以這五個步驟的順序來介紹BabyBluetooth的使用路媚;
1黄琼、掃描外設
初始化好BabyBluetooth后就可以用起提供的鏈式語法self.baby.scanForPeripherals().begin();來開啟掃描了,同樣也可以用其鏈式語法來停止掃描:self.baby.scanForPeripherals().stop(30);也可以吧開始和停止寫在一起比如:baby.scanForPeripherals().begin().stop(4);即開始掃描后4秒停止掃描整慎。當然BabyBluetooth也提供了判斷藍牙是否開啟成功的block回調脏款,值得注意的是這里并不需要在藍牙開啟的回調里判斷CBCentralManagerStatePoweredOn狀態(tài)再開啟掃描,而是在設置代理后可以直接開啟掃描裤园,回調block如下:
2撤师、發(fā)現(xiàn)外設
掃描之后如果發(fā)現(xiàn)了外設會進入發(fā)現(xiàn)外設的代理,如下
參數(shù)說明:1. peripheral為掃描發(fā)現(xiàn)的外設剃盾。 2. advertisementData為外設廣播包攜帶數(shù)據(jù),主要獲取有幾個服務顯示出來淤袜,只要用這個key:kCBAdvDataServiceUUIDs痒谴。3. RSSI為外設信號。具體解析可以參照如下
3. 選擇你的目標外設并開始連接外設:
baby.having(currPeripheral).enjoy();
不過為了圖方便铡羡,我一般會直接連接外設加發(fā)現(xiàn)服務發(fā)現(xiàn)特征等等功能直接來一套积蔚,如下:
連接成功后的回調
在babydemo里代理都加上了Channel,這里我個人看法是如非必要不要加烦周,加了之后后續(xù)要連接多個藍牙就很難處理的尽爆。在我自己的項目里我就沒有加Channel。
4读慎、獲取外設讀寫的特征
在連接成功后教翩,可以在發(fā)現(xiàn)發(fā)現(xiàn)特征值的block回調里選擇你需要用到的讀特征和寫特征(Characteristics),回調如下:
[
然后根據(jù)服務的uuid贪壳,以及特征的uuid來找到你需要的特征值,具體藍牙的服務ID和讀寫通道可以參考你們目標藍牙的藍牙協(xié)議
?[self.baby setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
? ? ? ? NSLog(@"===service name:%@",service.UUID);
? ? ? ? for (CBCharacteristic *c in service.characteristics)
? ? ? ? {
? ? ? ? ? ? if ([c.UUID.UUIDString isEqualToString:@"FFE1"]) {
? ? ? ? ? ? }
? ? ? ? ? ? ? ? if ([c.UUID.UUIDString isEqualToString:@"F000C0E1-0451-4000-B000-000000000000"])?
{
? ? ? ? ? ? ? ? ? ? weakSelf.readcharacteristic = c;
? ? ? ? ? ? ? ? ? ? [weakSelf addNotifyWIth:c];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if ([c.UUID.UUIDString isEqualToString:@"F000C0E2-0451-4000-B000-000000000000"])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? weakSelf.writecharacteristic = c;
? ? ? ? ? ? ? ? ? ? [weakSelf addNotifyWIth:c];
? ? ?}
? ?}
? }
? ? }]
一般藍牙的讀寫通道(Characteristics)都是分開的蚜退,少數(shù)藍牙會讀寫用同一個通道闰靴,在發(fā)現(xiàn)目標通道后彪笼,我們要利用寫通道來向藍牙寫入數(shù)據(jù),用讀通道來讀取藍牙發(fā)來的包蚂且。
5配猫、獲取外設發(fā)出的信息和向外設發(fā)信息
1)寫數(shù)據(jù)
寫數(shù)據(jù)比較方便,直接調用以下方法就可以:
但是這里的data是有要求的杏死,不能直接用字符串utf8轉成data泵肄,一般寫入藍牙的都是16進制字符串,在此提供一個16進制字符串轉data的方法淑翼,方法如下
除此之外腐巢,寫數(shù)據(jù)還要注意的是type,type有兩種玄括,一種是有回應冯丙,一種是無回應,無回應的寫入操作type寫成了有回應會導致寫入失敗遭京,報錯寫入不允許
2 )讀數(shù)據(jù)
凡是從藍牙傳過來的數(shù)據(jù)都要經(jīng)過這個回調胃惜,簡單的說這個方法就是你拿數(shù)據(jù)的唯一方法),這是一個系統(tǒng)方法哪雕,BabyBluetooth對這個方法進行了如下封裝
封裝出來兩個block船殉,一個是
另外一個是
根據(jù)上面BabyBluetooth代碼來看notify的優(yōu)先級是高于寫數(shù)據(jù)成功的block,而且如果這個特征你監(jiān)聽了它斯嚎,由于有個return利虫,后面那個block就不會走了。
在我的項目中孝扛,我是通過notify來獲取藍牙回包的列吼,在notify的回調block里你可以通過如下方式獲取藍牙回包內(nèi)容,并進行后續(xù)操作了苦始,
到此寞钥,BabyBluetooth的完整開發(fā)流程就已經(jīng)基本結束了。
五:使用BabyBluetooth的注意事項
1陌选、在頁面銷毀的時候要斷開藍牙連接釋放藍牙資源理郑。
2、點擊藍牙連接的時候咨油,這是如果立馬跳轉下個頁面去收發(fā)數(shù)據(jù)您炉,會崩潰,這是因為在連接藍牙的時候讀取特征沒完成就跳轉了役电。解決方法是等特征讀完再跳轉赚爵,可以加一個loading
3、第一次連接斷開之后再連接的時候接收數(shù)據(jù)的代理直接觸發(fā),這個時候數(shù)據(jù)處理如果不當?shù)脑挄rash冀膝,解決方法是:在離開收發(fā)數(shù)據(jù)那個頁面的時候加一句代碼重置那個block
_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral*peripheral, CBCharacteristic *characteristic, NSError *error) {}];