如何在每个开放时将我的应用程序重新连接到同一个蓝牙低功耗设备?

时间:2015-04-04 09:18:51

标签: android bluetooth bluetooth-lowenergy

我正在开发Android应用。一开始,这个应用程序向用户显示蓝牙设备列表,当他选择其中一个打开其他活动时。

我的目标是:在用户重新打开应用程序的某一天之后,应用程序必须记住该设备,并且必须尝试重新连接它。

现在我已经通过这种方式获得了目标:

  • 我优先记住所选设备的mac地址
  • 当用户重新打开应用程序时,应用程序会执行隐藏扫描,并尝试重新连接到具有相同MAC地址的设备。
  • 用于检索mac地址我使用函数getAddress()(当我尝试连接到android外设时这个函数给了我 一些问题,因为设备在每个都改变了他的MAC地址 开始:/)

有一种获得同样东西的最佳方法吗?

关闭主题:ScanResult中的函数onScanResult有时会返回给我null设备,这是正常的吗? 我使用了startLeScan(UUID [] serviceUuids,BluetoothAdapter.LeScanCallback回调),在棒棒糖之后我使用了新版本的startLeScan和Scanfilter。这可能是问题吗?

1 个答案:

答案 0 :(得分:4)

为了保护隐私,mac地址不断变化 - 请参阅以下摘录中的摘要:

  

5.4.5隐私权特征

     

Bluetooth LE支持的功能可以通过更改来降低在一段时间内跟踪LE设备的功能   蓝牙设备频繁地址。隐私功能是   没有在GAP发现模式和程序中使用但是在何时使用它   在连接模式和连接过程中受支持。为了   对于使用隐私功能重新连接到已知设备的设备,   设备地址,称为私有地址,必须是   可由其他设备解析。

     

私人地址是使用生成的   绑定期间交换的设备的解析身份密钥(IRK)   过程

所以理想的方法是使用IRK来设置设备的实际地址。但是我没有找到任何API来执行它。

目前,我在mny app中使用的工作 - 重新连接到设备,

  1. 遍历所有可用设备。
  2. 获取序列号 - 如果序列号与已存储的号码匹配 然后保持连接断开连接。
  3. 对所有设备重复步骤2.

    此解决方法仅在设备通过某项服务公开序列号时才有效。

  4. 当您致电connectGatt (Context context, boolean autoConnect, BluetoothGattCallback callback)

    时,您也可以尝试将 autoconnect 标记设为true

    来自文档:

      

    public BluetoothGatt connectGatt(Context context,boolean autoConnect,   BluetoothGattCallback回调)在API级别18中添加

         

    连接到此设备托管的GATT服务器。来电者充当关贸总协定   客户。回调用于将结果传递给调用者,例如   连接状态以及任何进一步的GATT客户端操作。该   方法返回一个BluetoothGatt实例。你可以使用BluetoothGatt   进行GATT客户操作。参数

         

    autoConnect是否   直接连接到远程设备(false)或自动连接   远程设备可用后立即连接(true)。

         

    回调GATT回调处理程序,它将接收异步   回调。如果回调为空,则抛出IllegalArgumentException