简单的获取周边的蓝牙设备需要以下几步
1、导入对应的框架
#import <CoreBluetooth/CoreBluetooth.h>
2、创建对象,遵循代理事件
创建CBCentralManager对象,并遵循CBCentralManagerDelegate代理协议
@interface BlueToothViewController ()<CBCentralManagerDelegate>
@property (nonatomic,strong) CBCentralManager *manager;
@end
//初始化并设置委托和线程队列
self.manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
3、处理蓝牙状态
在CBCentralManagerDelegate代理方法中:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
可以获取当前设备的蓝牙状态,**此代理方法必须实现**。同时可以在代理方法内利用UUIDService对周边设备进行过滤。
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch(central.state){
case CBManagerStateUnknown:
NSLog(@">>>CBManagerStateUnknown");
break;
case CBManagerStateResetting:
NSLog(@">>>CBManagerStateResetting");
break;
case CBManagerStateUnsupported:
NSLog(@">>>CBManagerStateUnsupported");
break;
case CBManagerStateUnauthorized:
NSLog(@">>>CBManagerStateUnauthorized");
break;
case CBManagerStatePoweredOff:
NSLog(@">>>CBManagerStatePoweredOff");
// 设备蓝牙未打开
break;
case CBManagerStatePoweredOn:
NSLog(@">>>CBManagerStatePoweredOn");
// 设备蓝牙打开
// 第一个参数设为nil,即搜索周边所有的设备。
//搜索所有的设备,不加限制
// [central scanForPeripheralsWithServices:nil options:nil];
// 搜索所有的小米手环设备,小米手环的UUIDService为FFE0
[central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FEE0"]] options:nil];
// 第二个参数类型为字典,有多种状态值
// [central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"FEE0"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
break;
default:
break;
}
}
4、获取周边蓝牙设备
在设备搜索到周边设备之后,会调用代理方法:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
在这个方法内的可以获取多个参数
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
//接下连接我们的测试设备,这里的测试设备是小米手环
/*
对象peripheral内包含多个外接设备的值:
外接设备名称:peripheral.name
外接设备识别码:peripheral.identifier
字典advertisementData内包含以下几个字段:
kCBAdvDataIsConnectable:外接设备是否可连接 1可以 0不可;
这个值在搜索外接设备时肯定会存在,以下的几个字段在搜索到本人的电脑时就不存在,在搜索到的小米手环时就存在。
kCBAdvDataLocalName:外接设备内置的名称
kCBAdvDataManufacturerData:外接设备生产商数据
kCBAdvDataServiceUUIDs:设备的UUIDService
最后一个值RRSI:外接设备的信号强度,获取的值为负数,可以做以下处理,同时可以根据信号强度大致估计外接设备与设备之间的距离
利用绝对值方法处理:abs([RSSI intValue])
*/
}
当搜索到需要的设备时需要主动去停止搜索,如果不主动去调用停止搜索设备的方法:
- (void)stopScan;
则会不停的搜索周边的设备。
测试中搜索到的小米手环处理之后的一些信息截图:
测试中搜索到的本机的设备信息截图:
测试中搜索到的未知其它设备
原本获取到的数据如果没有设备名称,将会是NULL,显示未知设备是经过处理的。