藍牙- iOS
現(xiàn)在離職了,碰上十一假期凡壤,把在公司學到的藍牙開發(fā)基本技能整理一下,用作備忘雁佳、分享涨享。
把demo放出來 喜歡的star一下 筋搏!
希望大家看完這篇文章會對藍牙開發(fā)有個基本的了解,能開發(fā)簡單的藍牙App厕隧。
基礎(chǔ)知識
?本文針對iOS開發(fā)
藍牙的特點:
與WIFI通訊相比奔脐,藍牙**低耗**,對于設(shè)備電量要求比較低吁讨;**速度快**,極限好像是20ms,超過這個時間髓迎,雖然代碼不再執(zhí)行,但低層代碼還在不停的發(fā)送數(shù)據(jù)挡爵,容易使得手機發(fā)燙竖般,除了特殊需求(音樂實時律動,手指取色發(fā)送),一般不要發(fā)送太快茶鹃。
藍牙相關(guān)的框架:
CoreBluetooth.frameWork
藍牙相關(guān)的類:
CBCentralManager? 中心設(shè)備 --> 手機
CBPeripheral? 周邊設(shè)備 --> 藍牙設(shè)備
?藍牙的基本屬性(特指在iOS開發(fā)中涣雕,常用到的一些屬性)
- UUID:唯一標識符,可用來區(qū)分設(shè)備闭翩,具體請自行Google挣郭。
- RSSI: 信號強弱值,防丟器之類的可以用這個疗韵。
- name: 設(shè)備名稱兑障。
- service UUID(重點):服務。一個Server 會包含多個characteristic蕉汪,用UUID來區(qū)分流译。
這個是有國際規(guī)范標注的,具體請自行Google者疤,硬件的工程師應該比較了解福澡。
- characteristic(重點):特征。用UUID來區(qū)分驹马。
?Characteristic 里面有個notify,只有打開才能接受到藍牙的返回數(shù)據(jù)革砸。Characteristic 里面也有很多屬性,但本文不展開講解糯累。
具體例子講解
?藍牙開發(fā)的流程
基本流程代碼講解
1. ? 創(chuàng)建手機中心 算利,首先你要有一個中心CBCentralManager 這個中心代表你的設(shè)備,它提供了一系列的代理方法來管理與之相連的周邊對象CBPeripheral泳姐。
CBCentralManager * BLEManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
BLEManager.delegate = self;
2. ?開始掃描 效拭,注意了掃描是耗性能、耗電、容易發(fā)熱的允耿,所以當找到并連接上設(shè)備的時候需要停止掃描借笙。
if ([self isLECapableHardware]) {//判斷是否打開藍牙
[BLEManager scanForPeripheralsWithServices:nil options:nil];}
}
3.? 結(jié)束掃描?,不停的掃描會相當?shù)南碾娏亢虲pu较锡。
[BLEManager stopScan];
4. ?獲取周邊對象 ,掃描開始后盗痒,你會在代理方法里面獲取到掃描的周邊對象(再次提醒蚂蕴,**周邊對象**就是代表本手機以外的藍牙設(shè)備,比如手環(huán)俯邓、藍牙燈骡楼、防丟器什么的。)
5. 獲取服務 稽鞭,通過service UUID在目標周邊對象的所有服務中找到你需要的服務鸟整。
6. 獲取特征 , 同樣通過characteristic UUID 獲取到相應的特征朦蕴,保存成全局變量篮条,后面發(fā)送會用到。
7. ?發(fā)送數(shù)據(jù) 吩抓, 發(fā)送數(shù)據(jù)需要至少需要五個參數(shù):手機涉茧、連接上的周邊對象、特征疹娶、數(shù)據(jù)伴栓、是否返回。
8. 接收返回數(shù)據(jù) 雨饺,在這里接收钳垮、處理周邊對象的返回數(shù)據(jù),注意這里一共提供了幾個參數(shù)额港,具體使用看需求而定饺窿。
> 強烈建議大家把 CBCentralManager.h 里面的代理方法全部看一遍(就是翻譯一遍,別偷懶)锹安。
tips
編輯數(shù)據(jù)
//拆分高低位
Byte bindIndexLow = needIndex & 0xff;
Byte bindIndexHigh = (needIndex >> 8) & 0xff;
int i == 0
char char_array[30] = {0x00};//定義一個字節(jié)數(shù)組
char_array[i++] = 0x01;? //16進制
char_array[i++] = 20;? //10進制
char_array[i++] = 0x8F;? //
char_array[i++] = 0x07;? //
NSData* data = [NSData dataWithBytes:(const void *)char_array length:sizeof(char) * i];
[peripheral writeValue:data forCharacteristic:calibrationCharacteristic type:CBCharacteristicWriteWithResponse];
*? 檢驗工具 lightblue
墻裂推擠使用lightblue 檢測藍牙設(shè)備短荐,它能讀取到藍牙的所有參數(shù),特別需要注意的是里面的serveruuid 和 特征叹哭,里面的notify和read忍宋。理論上來說 lightblue 上能完成的操作 app也應該能完成 同時這也是開發(fā)中用來檢驗硬件收發(fā)數(shù)據(jù)是否正常,如果lightblue 跟硬件通訊正常风罩,問題極有可能出在app上糠排。
*? 重連
iOS的框架自帶重連機制,千萬不要因為設(shè)備斷開就手動調(diào)用立馬掃描超升,不要掃描入宦,不要掃描哺徊。具體看
[Core Bluetooth Programming Guide]
*? 多連
iOS框架支持多連,同樣只要connect就行乾闰,當然要注意區(qū)分不同的設(shè)備
* 防劫持
很多防丟器和一些家庭級的藍牙會有防劫持功能落追,具體得看需求和硬件而定,一般來說要求手機在限定時間內(nèi)提交密碼。
*? 進階一:隊列發(fā)送
由于藍牙的發(fā)送性能的限制涯肩,如果你需要高速發(fā)送數(shù)據(jù)時轿钠,盡量把發(fā)送封裝成一個工具類,把需要發(fā)送的數(shù)據(jù)存到一個數(shù)組隊列里面病苗,然后定時發(fā)送數(shù)據(jù)疗垛。
*? 進階二:丟包重發(fā)
結(jié)合隊列發(fā)送,如果業(yè)務需求要求收發(fā)嚴密硫朦,不許丟包贷腕。可以對每一包發(fā)送的數(shù)據(jù)進行臨時保存咬展,在一定時間內(nèi)沒有接收到返回就發(fā)送第二次泽裳,發(fā)送三次后仍無返回即發(fā)送下一包數(shù)據(jù)或提示用戶等業(yè)務邏輯處理。