iOS藍牙篇之BabyBluetooth詳解

一 :前言

? ? ?對于剛接觸藍牙的萌新來說,直接用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) {}];

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唁奢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窝剖,更是在濱河造成了極大的恐慌麻掸,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赐纱,死亡現(xiàn)場離奇詭異脊奋,居然都是意外死亡,警方通過查閱死者的電腦和手機疙描,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門诚隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淫痰,你說我怎么就攤上這事最楷。” “怎么了待错?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵籽孙,是天一觀的道長。 經(jīng)常有香客問我火俄,道長犯建,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任瓜客,我火速辦了婚禮适瓦,結果婚禮上,老公的妹妹穿的比我還像新娘谱仪。我一直安慰自己玻熙,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布疯攒。 她就那樣靜靜地躺著嗦随,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敬尺。 梳的紋絲不亂的頭發(fā)上枚尼,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音砂吞,去河邊找鬼署恍。 笑死,一個胖子當著我的面吹牛蜻直,可吹牛的內(nèi)容都是我干的盯质。 我是一名探鬼主播袁串,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唤殴!你這毒婦竟也來了般婆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤朵逝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乡范,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體配名,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年晋辆,在試婚紗的時候發(fā)現(xiàn)自己被綠了渠脉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓶佳,死狀恐怖芋膘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霸饲,我是刑警寧澤为朋,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站厚脉,受9級特大地震影響习寸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜傻工,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一霞溪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧中捆,春花似錦鸯匹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臂容,卻和暖如春科雳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脓杉。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工糟秘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球散。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓尿赚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凌净,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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