前言:最近公司的一個關于beacon設備管理的app端府树,用到藍牙BLE妻坝,第一次接觸踩了不少坑,大致介紹一下開發(fā)的思路肛冶。
初始化藍牙
項目中使用的框架<CoreBluetooth/CoreBluetooth.h> 藍牙管理類CBCentralManager
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
代理監(jiān)聽藍牙狀態(tài)鲜锚,藍牙狀態(tài)可用的情況下掃描外設突诬,這里ServiceUUID需要找硬件廠商獲取,掃描特定的beacon設備芜繁,如果ServiceUUID為空攒霹,那就是掃描所有的藍牙設備。
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
switch (central.state)
{
case CBManagerStateUnsupported:
[ToolClass showMsg:@"藍牙不可用"];
break;
case CBManagerStateUnauthorized:
[ToolClass showMsg:@"藍牙未授權"];
break;
case CBManagerStatePoweredOff:
[ToolClass showMsg:@"藍牙未打開"];
break;
case CBManagerStatePoweredOn:
{
CBUUID *uuid = [CBUUID UUIDWithNSUUID:ServiceUUID];
[self.bluetoothManager scanForPeripheralsWithServices:@[uuid] options:nil];
}
break;
case CBManagerStateUnknown:
[ToolClass showMsg:@"藍牙狀態(tài)未知"];
default:
NSLog(@"不明情況了");
}
}
掃描后發(fā)現設備
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
}
注意:坑來了浆洗,這里掃描到藍牙外設之后催束,獲取的peripheral中只有name、identifier伏社、RSSI等屬性抠刺,但是項目中要求要讀取設備的major塔淤、minor值、電量等等速妖。只有通過獲取藍牙廣播的信息advertisementData獲取高蜂,此時安卓端已經能夠通過廣播讀取全部信息,iOS中獲取的廣播信息advertisementData中的字段并沒有這些字段罕容,網上查了諸多資料都沒能解決备恤。后來發(fā)現了一篇文檔,附上地址 https://blog.csdn.net/zh_kun/article/details/50920434 上面介紹外設設置成了iBeacon模式了锦秒,ibeacon會限制ios可接受的廣播信息露泊。我就嘗試著讓硬件工程師將廣播模式改成了ble模式,終于從advertisementData獲取到了kCBAdvDataManufacturerData旅择,需要通過順序截取相應的屬性值惭笑。
后記:剛拿到這個項目時準備使用iOS中的CLBeaconRegion進行開發(fā),后來發(fā)現只能獲取藍牙屬性值生真,不能進行連接讀寫沉噩,果斷放棄。