iOS藍(lán)牙開發(fā)甚亭,現(xiàn)在常規(guī)使用的是CoreBlueTooth.framework贷币,即藍(lán)牙4.0開發(fā)框架沙合。
1.CBCentralManager
中央設(shè)備笑陈,用于管理發(fā)現(xiàn)、連接外圍設(shè)備(CBPeripheral對象)金闽。
2.CBPeripheral
外圍設(shè)備(一般手機(jī)作為中央設(shè)備暇唾,其他硬件作為外圍設(shè)備)促脉。
3.CBUUID
UUID。外圍設(shè)備唯一標(biāo)識(可用于區(qū)分外圍設(shè)備)策州。
4.CBService
服務(wù)嘲叔。一個(gè)外圍設(shè)備包含一個(gè)服務(wù)或多個(gè)服務(wù)。
5.CBCharacteristic
特征值抽活。一個(gè)服務(wù)包含一個(gè)特征值或多個(gè)特征值硫戈。
上面這些是在iOS藍(lán)牙4.0開發(fā)過程中繞不開的名詞,相信做過iOS藍(lán)牙4.0開發(fā)的朋友都非常熟悉下硕。下面介紹丁逝,我在做iOS藍(lán)牙4.0開發(fā)時(shí),使用的一些方法梭姓。
1.創(chuàng)建一個(gè)藍(lán)牙管理對象
BTManager類用于管理藍(lán)牙掃描霜幼、連接、收發(fā)數(shù)據(jù)誉尖。
2.使用單例模式
為什么使用單例模式呢罪既?因?yàn)榻⒌氖菃我凰{(lán)牙連接,要保存這個(gè)連接,方便不定時(shí)的使用琢感,也可方便在不同類中使用藍(lán)牙丢间。比如在AppDelegate用于管理藍(lán)牙前后臺切換;在搜索界面中用于管理藍(lán)牙搜索驹针、連接烘挫;比如在AViewController用于發(fā)數(shù)據(jù),在BViewController中用于收數(shù)據(jù)柬甥。
#pragma mark - 單列模式
/**
單例對象
*/
+ (LLBTManager *)sharedInstance {
static LLBTManager *sInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sInstance = [[LLBTManager alloc] init];
});
return sInstance;
}
上面創(chuàng)建單例模式饮六,比較常規(guī)。有一些限制苛蒲,比如如果不直接調(diào)用sharedInstance方法卤橄,而是直接調(diào)用init方法,那么兩種方法創(chuàng)建的對象會不一樣臂外。如果有需要的可以簡信我窟扑,在下一篇文章中介紹。
3.收發(fā)數(shù)據(jù)設(shè)計(jì)
在設(shè)計(jì)之前寄月,我們要先考慮需求辜膝。那么一般藍(lán)牙收發(fā)數(shù)據(jù)都有哪些形式呢?我總結(jié)了一下漾肮,有三種:
(1)中央設(shè)備對外圍設(shè)備發(fā)數(shù)據(jù)厂抖,不需要外圍設(shè)備回復(fù)。(可以理解成手機(jī)對手環(huán)發(fā)送數(shù)據(jù)克懊,手環(huán)不回復(fù))忱辅。這種情況,比較簡單谭溉,我采用直接寫墙懂。代碼如下:
#pragma mark - 寫數(shù)據(jù)
/**
寫數(shù)據(jù)
@param data
*/
- (void)writeValue:(NSData *)data {
if ([self isConnect]) {
[self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithoutResponse];
}
}
(2)中央設(shè)備對外圍設(shè)備發(fā)數(shù)據(jù),需要外圍設(shè)備回復(fù)扮念。這里有兩種情況损搬,一種是中央設(shè)備(手機(jī))發(fā)送一條數(shù)據(jù),外圍設(shè)備(手環(huán))回復(fù)一條數(shù)據(jù)柜与;另一種是中央設(shè)備(手機(jī))發(fā)送一條數(shù)據(jù)巧勤,外圍設(shè)備(手環(huán))回復(fù)多條數(shù)據(jù)(例如數(shù)據(jù)同步)。這種情況弄匕,稍微復(fù)雜一些颅悉,我采用Block回調(diào)方式。記得在數(shù)據(jù)處理完成后迁匠,Block參數(shù)的處理哦剩瓶!代碼如下:
#pragma mark - 寫數(shù)據(jù)
/**
寫數(shù)據(jù)
@param data
@param completion
*/
- (void)writeValue:(NSData *)data completion:(void (^)(NSData *data))aCompletion {
self.completion = aCompletion;
//
[self writeValue:data];
}
(3)外圍設(shè)備對中央設(shè)備發(fā)數(shù)據(jù)驹溃。中央設(shè)備可回復(fù),可不回復(fù)延曙。對于這種情況豌鹤,我采用Target-Action方式。使用Target-Action方法的優(yōu)點(diǎn)搂鲫,理論上可以在任何類中調(diào)用傍药,可以多個(gè)類中持有磺平,也可以覆蓋持有魂仍。方法中的參數(shù)可以根據(jù)需求定義,比如event拣挪,我定義了整型擦酌,也可以是枚舉類型,當(dāng)然你可以定義成其他類型菠劝。代碼如下:
#pragma mark -監(jiān)聽數(shù)據(jù)
/**
接收外圍設(shè)備數(shù)據(jù)
@param target
@param action
@param event
*/
- (void)addTarget:(id)target action:(SEL)action forEvent:(NSInteger)event {
LLWeakProxy *proxy = [LLWeakProxy proxyWithTarget:target];
NSString *key = [NSString stringWithFormat:@"%zd",event];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:0];
[dict setValue:proxy forKey:@"target"];
[dict setValue:NSStringFromSelector(action) forKey:@"action"];
[_targetDict setValue:dict forKey:key];
}
關(guān)于Target-Action在我上一篇文章《iOS消息傳遞之Target-Action》中有介紹赊舶。
上面介紹了block和Target-Action參數(shù),這些參數(shù)怎么使用呢赶诊?
當(dāng)然要回到藍(lán)牙接收數(shù)據(jù)的方法中笼平。如下:
#pragma mark - CBPeripheralDelegate
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error {
if (error == nil) {
if (self.completion) {
self.completion(characteristic.value);
self.completion = nil;//只接收一次
}
}else {
//清除連接
[self cleanup];
}
}
上面只介紹了block回調(diào),關(guān)于Target-Action,留給伙伴們?nèi)ニ伎肌?/p>
以上就是我在iOS藍(lán)牙4.0項(xiàng)目中收發(fā)數(shù)據(jù)的設(shè)計(jì)舔痪,喜歡的寓调、對你有用的,點(diǎn)個(gè)贊吧锄码!