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

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)

我想要实现的目标

magiccommand1magiccommand2命令只是傻测试串(现在,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 didEnterRegiondidExitRegion方法正在被解雇而没有问题.

我在这做错了什么?

Gor*_*fex 1

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

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

这种 2 芯片方法使开发方面的工作变得更加轻松,因为现在只要您需要唤醒应用程序来处理某些事情,您就可以重新启动 iBeacon 设备并接收适当的事件。

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