藍牙- iOS
現在離職了,碰上十一假期,把在公司學到的藍牙開發基本技能整理一下,用作備忘、分享。
把demo放出來 喜歡的star一下 !
希望大家看完這篇文章會對藍牙開發有個基本的了解,能開發簡單的藍牙App。
基礎知識
?本文針對iOS開發
藍牙的特點:
與WIFI通訊相比,藍牙**低耗**,對于設備電量要求比較低;**速度快**,極限好像是20ms,超過這個時間,雖然代碼不再執行,但低層代碼還在不停的發送數據,容易使得手機發燙,除了特殊需求(音樂實時律動,手指取色發送),一般不要發送太快。
藍牙相關的框架:
CoreBluetooth.frameWork
藍牙相關的類:
CBCentralManager? 中心設備 --> 手機
CBPeripheral? 周邊設備 --> 藍牙設備
?藍牙的基本屬性(特指在iOS開發中,常用到的一些屬性)
- UUID:唯一標識符,可用來區分設備,具體請自行Google。
- RSSI: 信號強弱值,防丟器之類的可以用這個。
- name: 設備名稱。
- service UUID(重點):服務。一個Server 會包含多個characteristic,用UUID來區分。
這個是有國際規范標注的,具體請自行Google,硬件的工程師應該比較了解。
- characteristic(重點):特征。用UUID來區分。
?Characteristic 里面有個notify,只有打開才能接受到藍牙的返回數據。Characteristic 里面也有很多屬性,但本文不展開講解。
具體例子講解
?藍牙開發的流程
基本流程代碼講解
1. ? 創建手機中心 ,首先你要有一個中心CBCentralManager 這個中心代表你的設備,它提供了一系列的代理方法來管理與之相連的周邊對象CBPeripheral。
CBCentralManager * BLEManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
BLEManager.delegate = self;
2. ?開始掃描 ,注意了掃描是耗性能、耗電、容易發熱的,所以當找到并連接上設備的時候需要停止掃描。
if ([self isLECapableHardware]) {//判斷是否打開藍牙
[BLEManager scanForPeripheralsWithServices:nil options:nil];}
}
3.? 結束掃描?,不停的掃描會相當的消耗電量和Cpu。
[BLEManager stopScan];
4. ?獲取周邊對象 ,掃描開始后,你會在代理方法里面獲取到掃描的周邊對象(再次提醒,**周邊對象**就是代表本手機以外的藍牙設備,比如手環、藍牙燈、防丟器什么的。)
5. 獲取服務 ,通過service UUID在目標周邊對象的所有服務中找到你需要的服務。
6. 獲取特征 , 同樣通過characteristic UUID 獲取到相應的特征,保存成全局變量,后面發送會用到。
7. ?發送數據 , 發送數據需要至少需要五個參數:手機、連接上的周邊對象、特征、數據、是否返回。
8. 接收返回數據 ,在這里接收、處理周邊對象的返回數據,注意這里一共提供了幾個參數,具體使用看需求而定。
> 強烈建議大家把 CBCentralManager.h 里面的代理方法全部看一遍(就是翻譯一遍,別偷懶)。
tips
編輯數據
//拆分高低位
Byte bindIndexLow = needIndex & 0xff;
Byte bindIndexHigh = (needIndex >> 8) & 0xff;
int i == 0
char char_array[30] = {0x00};//定義一個字節數組
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 檢測藍牙設備,它能讀取到藍牙的所有參數,特別需要注意的是里面的serveruuid 和 特征,里面的notify和read。理論上來說 lightblue 上能完成的操作 app也應該能完成 同時這也是開發中用來檢驗硬件收發數據是否正常,如果lightblue 跟硬件通訊正常,問題極有可能出在app上。
*? 重連
iOS的框架自帶重連機制,千萬不要因為設備斷開就手動調用立馬掃描,不要掃描,不要掃描。具體看
[Core Bluetooth Programming Guide]
*? 多連
iOS框架支持多連,同樣只要connect就行,當然要注意區分不同的設備
* 防劫持
很多防丟器和一些家庭級的藍牙會有防劫持功能,具體得看需求和硬件而定,一般來說要求手機在限定時間內提交密碼。
*? 進階一:隊列發送
由于藍牙的發送性能的限制,如果你需要高速發送數據時,盡量把發送封裝成一個工具類,把需要發送的數據存到一個數組隊列里面,然后定時發送數據。
*? 進階二:丟包重發
結合隊列發送,如果業務需求要求收發嚴密,不許丟包。可以對每一包發送的數據進行臨時保存,在一定時間內沒有接收到返回就發送第二次,發送三次后仍無返回即發送下一包數據或提示用戶等業務邏輯處理。