代码之家  ›  专栏  ›  技术社区  ›  GoreDefex

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

  •  5
  • GoreDefex  · 技术社区  · 7 年前

    我有一个用例,我的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!");
        }
    }
    

    我正在努力实现的目标

    这个 magiccommand1 magiccommand2 命令只是设备正在通过串行端口侦听的愚蠢的测试字符串(目前为128位令牌)。一旦收到命令,它们就会做出反应,尝试擦除设备上的身份验证/绑定,并断开与设备中BLE的连接。

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

    更多问题

    [self.centralManager cancelPeripheralConnection:self.thePeripheral]; iOS系统级BT管理器似乎几乎可以立即自动重新连接(因为配对),因此没有时间断开连接并再次启动iBeacon。如果我试图断开与 centralManager CBCentralManager didEnterRegion 方法开火!

    这是iBeacon和BLE之间的很多来回,我只是希望我甚至不需要iBeacon来唤醒应用程序。我有所有信息。plist后台BLE和iBeacon服务已打开。如果我根本没有连接到BLE,并且从未配对一次并连接我的设备,则本地应用程序通知会毫无问题地滑入,让我知道iBeacon didExitRegion 方法正在顺利启动。

    1 回复  |  直到 7 年前
        1
  •  1
  •   GoreDefex    7 年前

    我找到了答案!我在某种程度上走上了正确的道路……尝试断开BT配对以尝试启动iBeacon委托方法不是一个好主意。它导致了许多奇怪的脏代码,紧密耦合的东西,不应该和更糟糕的…可怕的意大利面条代码。

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

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