前言:最近公司的一个关于beacon设备管理的app端,用到蓝牙BLE,第一次接触踩了不少坑,大致介绍一下开发的思路。
初始化蓝牙
项目中使用的框架<CoreBluetooth/CoreBluetooth.h> 蓝牙管理类CBCentralManager
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
代理监听蓝牙状态,蓝牙状态可用的情况下扫描外设,这里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:@"蓝牙状态未知"];
default:
NSLog(@"不明情况了");
}
}
扫描后发现设备
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
}
注意:坑来了,这里扫描到蓝牙外设之后,获取的peripheral中只有name、identifier、RSSI等属性,但是项目中要求要读取设备的major、minor值、电量等等。只有通过获取蓝牙广播的信息advertisementData获取,此时安卓端已经能够通过广播读取全部信息,iOS中获取的广播信息advertisementData中的字段并没有这些字段,网上查了诸多资料都没能解决。后来发现了一篇文档,附上地址 https://blog.csdn.net/zh_kun/article/details/50920434 上面介绍外设设置成了iBeacon模式了,ibeacon会限制ios可接受的广播信息。我就尝试着让硬件工程师将广播模式改成了ble模式,终于从advertisementData获取到了kCBAdvDataManufacturerData,需要通过顺序截取相应的属性值。
后记:刚拿到这个项目时准备使用iOS中的CLBeaconRegion进行开发,后来发现只能获取蓝牙属性值,不能进行连接读写,果断放弃。