iOS藍(lán)牙4.0,收發(fā)數(shù)據(jù)設(shè)計(jì)

iOS藍(lán)牙開發(fā)甚亭,現(xiàn)在常規(guī)使用的是CoreBlueTooth.framework贷币,即藍(lán)牙4.0開發(fā)框架沙合。

藍(lán)牙庫文件目錄.png

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)牙管理對象

藍(lán)牙管理對象文件.png

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è)贊吧锄码!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夺英,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滋捶,更是在濱河造成了極大的恐慌痛悯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件重窟,死亡現(xiàn)場離奇詭異载萌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巡扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門扭仁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霎迫,你說我怎么就攤上這事斋枢。” “怎么了知给?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵瓤帚,是天一觀的道長描姚。 經(jīng)常有香客問我,道長戈次,這世上最難降的妖魔是什么轩勘? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怯邪,結(jié)果婚禮上绊寻,老公的妹妹穿的比我還像新娘。我一直安慰自己悬秉,他們只是感情好澄步,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著和泌,像睡著了一般村缸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上武氓,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天梯皿,我揣著相機(jī)與錄音,去河邊找鬼县恕。 笑死东羹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忠烛。 我是一名探鬼主播属提,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼况木!你這毒婦竟也來了垒拢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤火惊,失蹤者是張志新(化名)和其女友劉穎求类,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屹耐,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尸疆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惶岭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寿弱。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖按灶,靈堂內(nèi)的尸體忽然破棺而出症革,到底是詐尸還是另有隱情,我是刑警寧澤鸯旁,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布噪矛,位于F島的核電站量蕊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艇挨。R本人自食惡果不足惜残炮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩滨。 院中可真熱鬧势就,春花似錦、人聲如沸脉漏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠删。三九已至抱完,卻和暖如春贼陶,著一層夾襖步出監(jiān)牢的瞬間刃泡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工碉怔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烘贴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓撮胧,卻偏偏與公主長得像桨踪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子芹啥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容