OBJ-C操作方法:App在同一设备中使用BLE连接和iBeacon

我有一个用例,我的objective-c应用程序需要在终止之后立即使用iBeacon,以便从终止状态唤醒应用程序,连接到BLE并向设备发送命令。 我在这里找到一个更长的运行post ,如果需要你可以查看我的代码。

问题

到目前为止,问题发生在我运行应用程序,搜索以前配对的设备和/或扫描外围设备,找到我的BLE设备并连接时。 连接后,用户将BLE连接配对,以便它们可以通过BLE连接发送加密的特征数据。 如果没有配对(在设备的命名约定中也称为auth / bond),用户根本无法将数据发送到设备。 它永远不会在那里。 你配对后就可以发送命令……

当我终止应用程序时,在applicationWillTerminate方法中,我运行此代码…

 - (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"*** Application Will Terminate."); NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSNumber *mode = [userDefaults objectForKey:@"deviceConnectedMode"]; if([mode intValue] == CONNECTED_MODE_INDICATOR) { [self.bluetoothManager sendCodeToBTDevice:@"magiccommand1" characteristic:self.bluetoothManager.wipeCharacteristic]; //I have been turning this command on and off in testing to see if I can get it to work better while disconnecting in the device rather than in the app... //The command magiccommand2 wipes the auth/bond inside of the device // [self.bluetoothManager sendCodeToBTDevice:@"magiccommand2" // characteristic:self.bluetoothManager.disconnectCharacteristic]; //Place where I attempt to stop being connected to BT [self.bluetoothManager disconnectDevice]; [self.beaconManager startMonitoring]; NSLog(@"*** Application terminated from connected mode!"); } else { NSLog(@"*** DriveCare terminated without violation!"); } } 

我想要实现的目标

magiccommand1magiccommand2命令只是设备通过串口侦听的愚蠢测试字符串(现在,后来是128位令牌)。 一旦他们收到命令,他们就会通过尝试擦除设备上的身份validation/绑定以及断开设备中的BLE来做出反应。

因此,我似乎能让应用程序从终止状态唤醒的唯一方法是使用iBeacon。 所以我不得不在这里做一堆看似肮脏的东西,只是为了将这个圆形钉子放在一个方孔中。 在应用程序的生命周期中,它连接并配对,当我终止时,我希望它完全从BLE作为连接设备被删除。 我希望iBeacon将唤醒应用程序,连接回BLE,关闭iBeacon监控,然后从终止状态向BLE设备发送命令。 这种打开/关闭或连接/断开iBeacon到BLE和返回很可能导致用户必须重新配对而我不想这样做。

更多问题

当我打电话给[self.centralManager cancelPeripheralConnection:self.thePeripheral]; iOS系统级BT管理器似乎几乎立即自动重新连接(因为配对)所以没有时间断开连接并再次拾取iBeacon。 如果我在将断开命令发送到我的框之前尝试断开与我的centralManager实例的连接(如上面的代码注释中所示),他们显然也不会发送。 如果我只使用那个CBCentralManager断开方法,那么iBeacon开始被检测是不够的,因为iOS系统仍然与设备配对。 最后,如果我进入我的iOS系统BT管理器并选择“忘记此设备”,iBeacon将再次被选中并且我的didEnterRegion方法将被激活!

这是iBeacon和BLE之间的大量来回,我只是希望我甚至不需要iBeacon来唤醒应用程序。 我已经打开了所有info.plist后台BLE和iBeacon服务。 如果我根本没有连接到BLE并且从未配对并连接我的设备,本地应用程序通知会毫无问题地滑入,让我知道iBeacon didEnterRegiondidExitRegion方法正在被解雇而没有任何问题。

我在这做错了什么?

我想出了这个答案! 我有点走在正确的道路上……尝试断开BT配对以试图让iBeacon委托方法解雇并不是一个好主意。 它会导致许多奇怪的脏代码,紧密耦合的东西,不应该和更糟……可怕的意大利面条代码。

相反,我的解决方案是在其中构建一块带有2个蓝牙芯片的电路板。 一个是专用的iBeacon芯片,另一个是永久连接/配对/ auth和bonded芯片。 这样就不需要监视任何定时连接和断开事件(或者更糟……解决竞争条件)。 在iOS中等待设备断开连接不是真正的断开连接,而是当iOS系统认为它已断开连接时(在电话方面)。 外围系统内部发生的事情描绘了一幅截然不同的画面……

这种2芯片方法使开发方面的生活变得如此简单,因为现在只要您需要应用程序唤醒处理某些内容,您就可以重新启动iBeacon设备并接收相应的事件。

旁注:当使用iBeacon时, didEnterRegion方法几乎立即触发,因为didExitRegion有时需要30秒或更长时间才能触发。 因此,如果您需要立即检测信标,您应该尝试确保iBeacon正在通电而不是关闭…如果可能的话。