我正在为一家硬件驱动的设备公司开发应用程序。我们当前的(BLE)HW设备与电话通信;活动的";(由HW上的物理激活触发),电话从所述HW检索连续数据。
为了使应用程序为HW变为活动做好准备;绑定";到HW。在安卓系统上,该应用程序会保存一个永久("粘性")通知,以防止应用程序被杀死,并让后台进程始终保持活动状态,并监听硬件宣布其处于活动状态。在iOS上,我相信硬件正在发送"垃圾邮件";ping请求";以保持应用程序的活力。
总而言之,设置有效,但并不理想。我试着用不同的";外围模式";和主/从设置,但还没有了解如何在手机和硬件之间建立一种关系,使其表现得像我们想要的那样:
我们希望硬件的行为像(例如)BT耳机一样工作,即当我打开耳机的外壳时,应用程序启动(如果是耳塞,则显示电池状态通知),通信开始。当我把插头放回盒子里时,应用程序就会关闭(至少在用户所知的范围内)。一旦硬件再次处于范围内并被激活(即相当于打开机箱),应用程序/通信就准备就绪/恢复。
所描述的功能是仅为耳机保留的,还是任何BLE设备都可以实现的设置?
tl;dr我不想在安卓系统上有一个持久的通知,以确保应用程序在设备"关闭"时始终准备就绪;"活动";,但如果没有它,该应用程序很容易在后台被杀死。
当你问一个涵盖Android和iOS的问题时,这很棘手,因为这两个平台都有不同的方法。
我会回答iOS,因为这是我所知道的,但我认为Android上也有类似的东西。
首先,简单介绍一下BLE GATT服务是如何运作的;
在BLE中有两个角色中央和外围。99%的时间,外围广告服务,而中央 发现外围设备广告其感兴趣的服务一旦连接,中心就可以启动对外围设备的读取和写入。中心还可以从外围设备注册通知。这允许外围设备在拥有新数据时发送新数据,而不是等待中央设备读取 现在,了解如何在iOS核心蓝牙中使用所有这些。 你的首要任务是发现你感兴趣的外围设备。你可以通过扫描宣传你特定服务的外围设备来做到这一点。您通常需要提供某种UI来显示已发现的内容,并允许用户选择要连接的设备,但这取决于您的特定用例。 一旦您发现(并且用户已经选择)外围设备,您就可以存储Core Bluetooth提供的 将来,您可以使用此标识符尝试从核心蓝牙检索 一旦您有了 如果您在应用程序中启用了核心蓝牙后台模式,则即使在后台,连接和通知事件也会传递到您的应用程序。您也可以在后台发出读写命令以响应连接和通知事件,尽管您只有几秒钟的执行时间。 在某个时刻,外围设备可能会超出范围/被关闭,并且连接会断开。同样,此事件可以在后台或前台进行传递。 作为回应,您的应用程序应立即发布新的 最后要考虑的是您的应用程序当前未处于挂起状态的情况;也许iOS设备已经重新启动,或者你的应用程序已经被iOS从内存中卸载,因为它已经有一段时间没有活动了。 您的应用程序可以通过在创建 重新启动时,您需要使用相同的标识符重新建立 这是一篇来自苹果的文章,虽然很旧,但它很好地解释了核心蓝牙的背景和状态恢复。 请注意,所有这些都可以在没有配对/绑定的情况下发生。如果您的外围设备需要对其任何属性进行加密,则iOS将在您第一次连接时自动显示配对对话框。一旦配对到位,就不需要再进行配对了。配对/绑定仅交换用于加密的密钥。没有明确要求允许将来的连接。identifier
。这是此iOS设备上此外围设备的唯一值;它不是外围设备的MAC地址,不能在不同的iOS设备上使用它来识别同一个外围设备。CBPeripheral
对象,而无需扫描它。CBPeripheral
,您就可以发布connect
。一旦connect
完成,您就可以读取/写入数据或注册通知。connect
。如果设备当前不可用,则此连接将挂起,并在再次看到外围设备时完成。iOS会在前台或后台将其发送到您的应用程序。CBCentralManager
时提供n标识符参数来选择核心蓝牙状态恢复。这将重新启动您的应用程序。CBCentralManager
,然后您将收到触发应用程序重新启动的connect
回调。从这一点开始,您可以正常进行。