OBJ-C 操作方法:在同一设备中使用 BLE 连接和 iBeacon 的应用程序
Posted
技术标签:
【中文标题】OBJ-C 操作方法:在同一设备中使用 BLE 连接和 iBeacon 的应用程序【英文标题】:OBJ-C how-to: App using BLE connection and iBeacon in same device 【发布时间】:2017-07-21 15:08:21 【问题描述】:我有一个用例,我的 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
断开连接方法,则不足以开始检测 iBeacon,因为 iOS 系统仍与设备配对。最后,如果我随后进入我的 iOS 系统 BT 管理器并选择“忘记此设备”,iBeacon 会再次被拾取,我的 didEnterRegion
方法会触发!
这在 iBeacon 和 BLE 之间有很多来回,我只是希望我什至不需要 iBeacon 来唤醒应用程序。我打开了所有 info.plist 后台 BLE 和 iBeacon 服务。如果我根本没有连接到 BLE 并且从未配对一次并连接我的设备,本地应用程序通知会毫无问题地滑入,让我知道 iBeacon didEnterRegion
和 didExitRegion
方法正在顺利启动。
我在这里做错了什么?
【问题讨论】:
【参考方案1】:我想出了这个答案!我走在了正确的道路上……尝试断开 BT 配对以尝试触发 iBeacon 委托方法并不是一个好主意。它会导致很多奇怪的脏代码,不应该的紧密耦合的东西,更糟糕的是......可怕的意大利面条代码。
相反,我的解决方案是构建一个带有 2 个蓝牙芯片的电路板。一个作为专用 iBeacon 芯片,另一个作为永久连接/配对/身份验证和绑定芯片。这样就不需要监视任何定时连接和断开事件(或更糟糕的是......解决了竞争条件)。在 iOS 中等待设备断开连接并不是真正的断开连接,而是当 iOS 系统认为它已断开连接时(在手机方面)。外围系统内部发生的事情描绘了一幅截然不同的画面……
这种 2 芯片方法让开发方面的工作变得如此轻松,因为现在任何时候您需要唤醒应用程序来处理某些事情,您都可以重启 iBeacon 设备并接收适当的事件。
旁注:使用 iBeacon 时,didEnterRegion
方法几乎会立即触发,而didExitRegion
有时可能需要 30 秒或更长时间才能触发。因此,如果您需要立即进行信标检测解决方案,您应该尝试确保 iBeacon 处于开启状态而不是为此关闭……如果可能的话。
【讨论】:
以上是关于OBJ-C 操作方法:在同一设备中使用 BLE 连接和 iBeacon 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 react-native-ble-manager 通过蓝牙连接到设备
目标 C-是不是可以从 iWatch 连接到 BLE 设备?