Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios OBJ-C操作:在同一设备中使用BLE连接和iBeacon的应用程序_Ios_Objective C_Bluetooth_Bluetooth Lowenergy_Ibeacon - Fatal编程技术网

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

Ios OBJ-C操作:在同一设备中使用BLE连接和iBeacon的应用程序,ios,objective-c,bluetooth,bluetooth-lowenergy,ibeacon,Ios,Objective C,Bluetooth,Bluetooth Lowenergy,Ibeacon,我有一个用例,我的objective-c应用程序在终止后需要立即使用iBeacon,以便将应用程序从终止状态唤醒,连接到BLE并向设备发送命令。我有一个更大的长时间运行,你可以检查我的代码,如果需要的话 问题 到目前为止,问题发生在我运行应用程序、搜索以前配对的设备和/或扫描外围设备、查找我的BLE设备并连接时。连接后,用户将BLE连接配对,以便通过BLE连接发送加密的特征数据。如果没有配对(设备命名约定中称为auth/bond),用户根本无法将数据发送到设备。它永远不会到达那里。一旦配对,就可

我有一个用例,我的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!");
    }
}
我正在努力实现的目标

magiccommand1
magiccommand2
命令只是设备通过串行端口侦听的愚蠢测试字符串(现在是128位令牌)。一旦他们收到命令,他们就会尝试擦除设备上的身份验证/绑定,并断开设备中的BLE

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

更多问题

当我调用
[self.centralManager取消外围设备连接:self.thePeripheral]iOS系统级BT管理器似乎几乎立即自动重新连接(因为配对),因此没有时间断开连接并重新启动iBeacon。如果我试图在将disconnect命令发送到my box之前断开与我的
centralManager
实例的连接(如上面注释掉的代码所示),它们显然也不会发送。如果只使用
CBCentralManager
disconnect方法,iBeacon开始被检测是不够的,因为iOS系统仍然与设备配对。最后,如果我进入我的iOS系统BT管理器并选择“忘记这个设备”,iBeacon将再次被拾取,我的
didEnterRegion
方法将触发

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


我做错了什么?我找到了这个答案!我走对了路。。。为了激发iBeacon委托方法而尝试断开与BT配对的连接不是一个好主意。它会导致很多奇怪的脏代码,不应该出现的紧密耦合的东西和更糟糕的。。。可怕的意大利面密码

取而代之的是,我的解决方案是构建一个包含2个蓝牙芯片的电路板。一个作为专用iBeacon芯片,另一个作为永久连接/配对/认证和粘合芯片。这样就不需要监控任何定时连接和断开事件(或者更糟的是……已解决的争用条件)。在iOS中等待设备断开连接并不是真正的断开连接,而是当iOS系统认为它断开连接时(在手机方面)。外围系统内部发生的事情描绘了一幅完全不同的画面

这种双芯片方法使开发方面的工作变得更加轻松,因为现在,只要您需要应用程序醒来处理某些事情,您就可以关闭iBeacon设备的电源并接收相应的事件

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