我正在创建一个连接蓝牙耳机(BLE)的iOS应用程序。
由于我在使用我的应用程序之前已经配对设备,有没有办法连接应用程序中没有“立即配对”弹出窗口?
---------------编辑1 ---------
我改变了我的代码。我第一次连接时保存设备的UUID,当我重新连接设备时,应用程序找到保存的UUID并尝试找到“已知外设”并重新连接。代码实际上找到了“已知外围设备”,但在我尝试重新连接之后,它又要求配对。当设备重新连接时,有没有办法避免“立即对”弹出窗口?
代码段:
-(void) connectToPeripheral : (CBPeripheral*) peripheral {
[self.centralManager stopScan];
self.peripheral = peripheral;
peripheral.delegate = self;
[self.centralManager connectPeripheral:peripheral options:nil];
self.peripheral = peripheral;
}
-(void) searchForDevices {
// Scan for all available CoreBluetooth LE devices
if (self.centralManager == nil ) {
CBCentralManager *centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
self.centralManager = centralManager;
}
//check if previous peripheral exists
NSArray *knownPeripherals = nil;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString* knownPeripheralID = [defaults stringForKey:@"knownPeripheralID"];
if ( knownPeripheralID != nil ) {
self.connectedPeripheralUUID = [[NSUUID alloc] initWithUUIDString:knownPeripheralID];
knownPeripherals = [self.centralManager retrievePeripheralsWithIdentifiers:[NSArray arrayWithObjects:self.connectedPeripheralUUID, nil]];
}
if ( knownPeripherals != nil && [knownPeripherals count] > 0 ) {
NSLog(@"knownPeripherals Peripherals");
CBPeripheral *foundPeripheral = [knownPeripherals objectAtIndex:0];
[self connectToPeripheral:foundPeripheral];
} else {
NSArray *connectedPeripherals = [self.centralManager retrieveConnectedPeripheralsWithServices:[NSArray arrayWithObjects:UUID_SERIAL_SERVICE_STR, nil]];
NSLog(@"Connected Peripherals");
if ( connectedPeripherals != nil && [connectedPeripherals count] > 0 ) {
} else {
[self.centralManager scanForPeripheralsWithServices:nil options:nil];
}
}
}
答案 0 :(得分:2)
在围绕这个问题进行一些研究之后,我认为这不是你能够解决的问题(除非我评论了一个自定义警报,通过查找任何一个应该很容易找到的警报创建警报的代码!)。无论您尝试连接的耳机是什么,都要求安全连接,CoreBluetooth正在生成此警报。据我所知,没有办法在代码中使用警报。
根据用例,您可能希望销售具有一个服务的服务 或更多的特征,其价值需要是安全的。例如, 想象一下,你想要出售社交媒体资料服务。这个 服务可能具有其值代表成员的特征 个人资料信息,例如名字,姓氏和电子邮件地址。 您很可能希望仅允许受信任的设备检索 会员的电子邮件地址。
您可以确保只有受信任的设备才能访问敏感设备 通过设定适当的特征来表征特征值 属性和权限。继续上面的例子,允许 只有可信设备才能检索会员的电子邮件地址,设置 适当的特性的属性和权限,如下所示:
emailCharacteristic = [[CBMutableCharacteristic alloc] initWithType:emailCharacteristicUUID properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired]; In this
示例,该特性配置为仅允许受信任 设备读取或订阅其值。当连接,远程 中央试图阅读或订阅这个特征的价值, 核心蓝牙尝试将本地外围设备与中心配对 创建一个安全的连接。
例如,如果中央和外围设备都是iOS设备,则两者都是 设备接收指示其他设备想要的警报 配对。中央设备上的警报包含您必须的代码 进入外围设备警报的文本字段以完成 配对过程。
配对过程完成后,外围设备会考虑 配对中心是可信设备,允许集中访问它 加密的特征值。
如果您收到此警报,那么您尝试连接的BlueTooth耳机需要为您尝试访问的其中一个特征提供安全连接。更多信息可以在@koshyyyk的答案中找到:stackoverflow.com / a / 18226632/1122794。还有一个Apple开发者关于BlueTooth的讨论以及我在此处复制的评论中链接的配对概念:http://adcdownload.apple.com//videos/wwdc_2012__hd/session_705__advanced_core_bluetooth.mov
如果您有开发者访问该设备的权限,则可以将其关闭。如果没有,那么您可以选择不使用该特征,也可以找出将警报用于您的应用程序的某种方式。
编辑我的BLE代码,它不会发出警报(如果相关的话)。该项目正在改编自Red Bear Lab的开源BLE代码:https://github.com/RedBearLab/iOS
- (void) connectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"Connecting to peripheral with UUID : %@", peripheral.identifier.UUIDString);
[self.activePeripherals addObject:peripheral];
[self.CM connectPeripheral:peripheral
options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}
- (int) findBLEPeripherals:(int)timeout
{
if (self.CM.state != CBCentralManagerStatePoweredOn)
{
NSLog(@"CoreBluetooth not correctly initialized !");
return -1;
}
[NSTimer scheduledTimerWithTimeInterval:(float)timeout target:self selector:@selector(scanTimer:) userInfo:nil repeats:NO];
[self.CM scanForPeripheralsWithServices:nil options:nil];
return 0; // Started scanning OK !
}