了解不同的BLE通信模式



我正在为一家硬件驱动的设备公司开发应用程序。我们当前的(BLE)HW设备与电话通信;活动的";(由HW上的物理激活触发),电话从所述HW检索连续数据。

为了使应用程序为HW变为活动做好准备;绑定";到HW。在安卓系统上,该应用程序会保存一个永久("粘性")通知,以防止应用程序被杀死,并让后台进程始终保持活动状态,并监听硬件宣布其处于活动状态。在iOS上,我相信硬件正在发送"垃圾邮件";ping请求";以保持应用程序的活力。

总而言之,设置有效,但并不理想。我试着用不同的";外围模式";和主/从设置,但还没有了解如何在手机和硬件之间建立一种关系,使其表现得像我们想要的那样:

我们希望硬件的行为像(例如)BT耳机一样工作,即当我打开耳机的外壳时,应用程序启动(如果是耳塞,则显示电池状态通知),通信开始。当我把插头放回盒子里时,应用程序就会关闭(至少在用户所知的范围内)。一旦硬件再次处于范围内并被激活(即相当于打开机箱),应用程序/通信就准备就绪/恢复。

所描述的功能是仅为耳机保留的,还是任何BLE设备都可以实现的设置?

tl;dr我不想在安卓系统上有一个持久的通知,以确保应用程序在设备"关闭"时始终准备就绪;"活动";,但如果没有它,该应用程序很容易在后台被杀死。

当你问一个涵盖Android和iOS的问题时,这很棘手,因为这两个平台都有不同的方法。

我会回答iOS,因为这是我所知道的,但我认为Android上也有类似的东西。

首先,简单介绍一下BLE GATT服务是如何运作的;

在BLE中有两个角色中央外围。99%的时间,外围广告服务,而中央

发现外围设备广告其感兴趣的服务一旦连接,中心就可以启动对外围设备的读取和写入。中心还可以从外围设备注册通知。这允许外围设备在拥有新数据时发送新数据,而不是等待中央设备读取

现在,了解如何在iOS核心蓝牙中使用所有这些。

你的首要任务是发现你感兴趣的外围设备。你可以通过扫描宣传你特定服务的外围设备来做到这一点。您通常需要提供某种UI来显示已发现的内容,并允许用户选择要连接的设备,但这取决于您的特定用例。

一旦您发现(并且用户已经选择)外围设备,您就可以存储Core Bluetooth提供的identifier。这是此iOS设备上此外围设备的唯一值;它不是外围设备的MAC地址,不能在不同的iOS设备上使用它来识别同一个外围设备。

将来,您可以使用此标识符尝试从核心蓝牙检索CBPeripheral对象,而无需扫描它。

一旦您有了CBPeripheral,您就可以发布connect。一旦connect完成,您就可以读取/写入数据或注册通知。

如果您在应用程序中启用了核心蓝牙后台模式,则即使在后台,连接通知事件也会传递到您的应用程序。您也可以在后台发出读写命令以响应连接和通知事件,尽管您只有几秒钟的执行时间。

在某个时刻,外围设备可能会超出范围/被关闭,并且连接会断开。同样,此事件可以在后台或前台进行传递。

作为回应,您的应用程序应立即发布新的connect。如果设备当前不可用,则此连接将挂起,并在再次看到外围设备时完成。iOS会在前台或后台将其发送到您的应用程序。

最后要考虑的是您的应用程序当前未处于挂起状态的情况;也许iOS设备已经重新启动,或者你的应用程序已经被iOS从内存中卸载,因为它已经有一段时间没有活动了。

您的应用程序可以通过在创建CBCentralManager时提供n标识符参数来选择核心蓝牙状态恢复。这将重新启动您的应用程序。

重新启动时,您需要使用相同的标识符重新建立CBCentralManager,然后您将收到触发应用程序重新启动的connect回调。从这一点开始,您可以正常进行。

这是一篇来自苹果的文章,虽然很旧,但它很好地解释了核心蓝牙的背景和状态恢复。

请注意,所有这些都可以在没有配对/绑定的情况下发生。如果您的外围设备需要对其任何属性进行加密,则iOS将在您第一次连接时自动显示配对对话框。一旦配对到位,就不需要再进行配对了。配对/绑定仅交换用于加密的密钥。没有明确要求允许将来的连接。

最新更新