iOS_蓝牙的使用_获取周边外接设备

2019-07-14 01:13发布

简单的获取周边的蓝牙设备需要以下几步 1、导入对应的框架 #import 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;
则会不停的搜索周边的设备。
测试中搜索到的小米手环处理之后的一些信息截图:
小米手环2
测试中搜索到的本机的设备信息截图:
搜索到电脑
测试中搜索到的未知其它设备
原本获取到的数据如果没有设备名称,将会是NULL,显示未知设备是经过处理的。
他人未知设备