兼容新旧蓝牙设备的连接方法

日前,碰到一客户要求新设备(作为方案商提供新的蓝牙模块)的 APP 操作不能影响已出货的设备,新模块是双模(SPP、BLE),但已出货的设备只支持 BLE。如何处理 APP 与蓝牙设备的连接问题,客户找我们协助,因为 APP 是客户自已开发。

作为一名 Android 开发人员都知道,能用 SPP 连接的绝不用 BLE,因为对比 BLE,SPP 有绝对的优势:

  • 连接稳性
  • 传输数据快、负载的数据量也大(当然 BLE 使用 MTU 数据量会大很多)

但 BLE 因成本及低功耗等因素也是应用广泛。当然了我司提供的 蓝牙双模芯片或方案价格方面与纯 BLE 差不多,所以得到客户的认可并直接接入到产品中。我们配合客户做一些兼容的工作。

一、前言

通常,我们做的是同个 APP 连接不同的设备(有的设备支持 SPP 连接,有的设备是只支持 BLE 连接),APP 会根据约定好的数据(蓝牙名称)来判断是 SPP 还是 BLE,前提是 手机需要先连接 蓝牙设备的音频通道,如果不连接音频通道,那么 APP 是不让用户进入菜单的,这样就很好区分。但如今客户的场景是,不用连接蓝牙设备的音频通道,也是可以进 APP 菜单的,所以通过约定的名称是无法实现区分的。

二、先 SPP 再 BLE

既然无法通过音频通道来识别,那我们就先连接 SPP ,如果连接得上,说明有 SPP 通道,即是新设备,那么这样的判断是一点都没有问题;但如果是 BLE 设备,则 APP 需要在无法连接上 SPP 的情况下(一般重试 3 次),然后再去调用 BLE 搜索连接接口,则用户体验就比较差了。

三、先 BLE 再 SPP

由于先 SPP 再 BLE的操作遇到旧设备会出现体验差的问题,那么可以能过先调用 BLE 搜索接口,根据 BLE 广播数据包的特点来做判断:

  • 如果用户定义的新旧 BLE 设备名称不一样,那直接通过BLE搜索返回的设备名称就可以识别
  • 如果用户定义的新旧 BLE 设备名称是一样,那么需要解析 BLE 广播数据包,在广播包中添加特定的字段,也是可以识别

通过上述的方法,若是判断设备为旧设备,则直接调用 BLE 连接接口;若是判断设备为新设备,则直接拿着 BLE 的 MAC 地址去做 SPP 连接,兼容新旧蓝牙设备的连接,且不影响用户体验。