baby庫:https://github.com/coolnameismy/BabyBluetooth很感謝劉彥瑋為iOS藍(lán)牙開發(fā)作出的貢獻(xiàn)。
藍(lán)牙開發(fā)步驟
- 掃描外設(shè)
- 發(fā)現(xiàn)外設(shè)
- 連接外設(shè)
- 獲取外設(shè)讀寫的特征
- 獲取外設(shè)發(fā)出的信息和向外設(shè)發(fā)信息
原生<CoreBluetooth/CoreBluetooth.h>就不分析了设江,baby是基于原生封裝的缔杉,非常好用,但還是有點(diǎn)問題拙毫。
大家在下載babyexample的時(shí)候會(huì)發(fā)現(xiàn)代碼有很多颗祝,有些是我們不需要用的,如何做到縮減删铃,以及一些存在的問題如何解決。
縮減baby
- 掃描
baby.scanForPeripherals().begin().stop(4);
這里掃描4秒后停止掃描册踩,這里有個(gè)問題就是掃描的時(shí)候默認(rèn)是斷開全部連接的泳姐,如果不需要的需要點(diǎn)stop改一下效拭。
- 發(fā)現(xiàn)外設(shè)
掃描之后會(huì)進(jìn)入發(fā)現(xiàn)外設(shè)的代理
[baby setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
[weakSelf insertTableView:peripheral advertisementData:advertisementData];
}];
參數(shù)解析:1. peripheral為掃描發(fā)現(xiàn)的外設(shè)暂吉。 2. advertisementData為外設(shè)廣播包攜帶數(shù)據(jù)胖秒,主要獲取有幾個(gè)服務(wù)顯示出來,只要用這個(gè)key:kCBAdvDataServiceUUIDs慕的。3. RSSI為外設(shè)信號(hào)
- 連接外設(shè)
baby.having(currPeripheral).enjoy();
- 發(fā)現(xiàn)外設(shè)特征
連接外設(shè)的成功之后會(huì)進(jìn)入代理
[baby setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
[rhythm beats];
if ([[service.UUID UUIDString] isEqualToString:@"FFE0"]) {
[peripheral setNotifyValue:YES forCharacteristic:service.characteristics[0]];
}
}];
這里根據(jù)UUID之后獲取相對(duì)應(yīng)的特征阎肝,主要是讀和寫特征,這里的 [peripheral setNotifyValue:YES forCharacteristic:service.characteristics[0]];是如果發(fā)現(xiàn)讀的特征直接設(shè)置它具有讀數(shù)據(jù)的功能
- 獲取讀和寫特征之后就是寫數(shù)據(jù)和收數(shù)據(jù)了
- 接收數(shù)據(jù):在這里就可以對(duì)接收到的數(shù)據(jù)進(jìn)行操作了
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {
}];
- 寫數(shù)據(jù):四個(gè)參數(shù)肮街,外設(shè)风题、數(shù)據(jù)nsdata類型、寫的特征嫉父、type
[self.leftPeripheral writeValue:[self hexToBytes:@"a55a03010003"] forCharacteristic:self.leftWrite type:1];
以上呢就可以做出藍(lán)牙收發(fā)數(shù)據(jù)的功能了沛硅,還有一些代理沒有寫上,比如斷開連接代理绕辖、連接失敗代理等等摇肌,大家根據(jù)需求加上去。
注意點(diǎn)
- 點(diǎn)擊藍(lán)牙連接的時(shí)候仪际,這是如果立馬跳轉(zhuǎn)下個(gè)頁面去收發(fā)數(shù)據(jù)围小,會(huì)崩潰,這是因?yàn)樵谶B接藍(lán)牙的時(shí)候讀取特征沒完成就跳轉(zhuǎn)了树碱。建議:在點(diǎn)擊鏈接藍(lán)牙的時(shí)候做一個(gè)菊花肯适,等到全部讀完的時(shí)候再消失
//設(shè)置beats break委托
[rhythm setBlockOnBeatsBreak:^(BabyRhythm *bry) {
NSLog(@"setBlockOnBeatsBreak call");
//如果完成任務(wù),即可停止beat,返回bry可以省去使用weak rhythm的麻煩
// if (<#condition#>) {
// [bry beatsOver];
[WKHUD dismissWithHUD:self.hud];
}];
在這里消失
- 第一次連接斷開之后再連接的時(shí)候接收數(shù)據(jù)的代理直接觸發(fā)成榜,這個(gè)時(shí)候數(shù)據(jù)處理就會(huì)出錯(cuò)框舔,因?yàn)樘幚頂?shù)據(jù)的時(shí)候大部分會(huì)用到數(shù)組,這種情況數(shù)組越界崩潰赎婚。
解決:在離開收發(fā)數(shù)據(jù)那個(gè)頁面的時(shí)候
[_baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {}];
寫上這句雨饺,blobk里面什么都不要寫。
最后babydemo里代理都加上了Channel惑淳,這里個(gè)人建議不要加额港,加了之后后續(xù)要連接多個(gè)藍(lán)牙就很難處理的
總結(jié)
一開始做藍(lán)牙的時(shí)候原生API真是讓人很難受,自從遇到baby庫真的很輕松歧焦,再次感謝劉彥偉移斩。本人看到baby的封裝之后,特意仿造封裝出gameKit:http://www.reibang.com/p/209e07344e5a