ios - OBJ-C 操作指南 : App using BLE connection and iBeacon in same device

标签 ios objective-c bluetooth bluetooth-lowenergy ibeacon

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

问题

到目前为止,问题发生在我运行应用程序、搜索以前配对的设备和/或扫描外围设备、找到我的 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 位 token ),设备正在通过串行端口监听。一旦他们收到命令,他们就会尝试删除设备上的身份验证/绑定(bind)并断开与设备中 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 委托(delegate)方法并不是一个好主意。它会导致很多奇怪的脏代码、不应该紧密耦合的东西,更糟糕的是……可怕的意大利面条代码。

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

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

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

关于ios - OBJ-C 操作指南 : App using BLE connection and iBeacon in same device,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241033/

相关文章:

ios - 将 UI 元素连接到数组中的插槽

ios - 使用 UISlider 应用 GPUImage 过滤器

c++ - 以 root 权限调用 C++ 函数,而不以 root 身份执行整个程序

ios - 如何在 iOS 应用程序中创建内联文本 anchor

ios - 相机在启动情绪检测器时卡住

ios - 解析: emailVerified is found nil on iPhone but works fine on Simulator

objective-c - 子类化时访问属性

objective-c - 带有不突出显示的渐变层的 UIButton

c++ - 蓝牙服务问题

ios - iOS 中的 BLE 绑定(bind)回调