Gor*_*fex 5 bluetooth objective-c ios bluetooth-lowenergy ibeacon
我有一个用例,我的objective-c应用程序需要在终止之后立即使用iBeacon,以便从终止状态唤醒应用程序,连接到BLE并向设备发送命令.我在这里找到了一个更长的运行帖子,如果需要你可以查看我的代码.
问题
到目前为止,问题发生在我运行应用程序,搜索以前配对的设备和/或扫描外围设备,找到我的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!");
}
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的目标
的magiccommand1和magiccommand2命令只是傻测试串(现在,128位以后的令牌),该设备正在监听通过串行端口.一旦他们收到命令,他们就会通过尝试擦除设备上的身份验证/绑定以及断开设备中的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 didEnterRegion和didExitRegion方法正在被解雇而没有问题.
我在这做错了什么?
我想出了这个答案!我走在正确的道路上...尝试断开 BT 配对以尝试触发 iBeacon 委托方法并不是一个好主意。它会导致许多奇怪的脏代码、不应该的紧密耦合的东西,甚至更糟......可怕的意大利面条代码。
相反,我的解决方案是构建一个带有 2 个蓝牙芯片的板。一个作为专用 iBeacon 芯片,另一个作为永久连接/配对/验证和绑定芯片。这样就不需要监视任何定时连接和断开事件(或者更糟......解决竞争条件)。在 iOS 中等待设备断开连接并不是真正的断开连接,而是当 iOS 系统认为它已断开连接时(在手机方面)。外围系统内部发生的事情描绘了一幅截然不同的画面......
这种 2 芯片方法使开发方面的工作变得更加轻松,因为现在只要您需要唤醒应用程序来处理某些事情,您就可以重新启动 iBeacon 设备并接收适当的事件。
旁注:使用 iBeacon 时,该didEnterRegion方法几乎立即触发,但didExitRegion有时可能需要 30 秒或更长时间才能触发。因此,如果您需要立即进行信标检测解决方案,您应该尝试确保 iBeacon 正在打开而不是关闭……如果可能的话。