公司有一款蓝牙血压计,是双模的.即支持蓝牙2.0和蓝牙4.0连接. 以前代码里只是连接2.0来用.现在要求加入4.0连接 使用厂家demo连接,死活连不上.排查许久 发现是connectGatt方法的问题
demo代码 使用的是三参数方法 没有判断系统版本
remoteDevice.connectGatt(mContext, true, bluetoothGattCallback);
改为
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mBluetoothGatt = device.connectGatt(context, false, mGattCallback, BluetoothDevice.TRANSPORT_LE, BluetoothDevice.PHY_LE_1M_MASK);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
mBluetoothGatt = device.connectGatt(context, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
mBluetoothGatt = device.connectGatt(context, false, mGattCallback);
}
成功连接
贴一个此方法的详细注释
来源于简书-七零八落问号
/**
* 以客户端的身份连接到该设备托管的GATT服务器
*
* @param autoConnect:自动连接,设备不可用时会不断尝试重连。
*
* @param callback: BluetoothGattCallback实例,用于接收异步回调
*
* @param transport: GATT连接到双模设备的首选传输模式:
* 1:TRANSPORT_AUTO 自动选择 (默认值)
* 2:TRANSPORT_BREDR BR/EDR 传统蓝牙
* 3:TRANSPORT_LE LE 低耗蓝牙
*
* @param phy: PHY物理层的模式选择:
* 1:PHY_LE_1M_MASK:
* 默认值,LE设备强制要求支持的模式,
* 符号速率为1M/s,未编码。
* 2:PHY_LE_2M_MASK:
* 符号速率为2M/s,未编码,
* 用于 蓝牙5 的 "2x speed" 2倍速率。
* 3:PHY_LE_CODED_MASK:
* 在数据包中增加纠错编码以实现更远的传输范围,
* 以实现 蓝牙5 的 "4x range" 4倍范围。
* 使用FEC编码,根据方案又分为:
* LE Coded S=2:2个编码位代替原来一个数据位,
* 速率降为 500K/s,传输范围增大2倍;
* LE Coded S=8:8个编码位代替原来一个数据位,
* 速率降为 125K/s,传输范围增大4倍;
* 设置 autoConnect 自动连接时,该项无效
*
* @param handler: 传入一个Handler,以指定回调发生的线程,
* 传入null时,回调将会在一个未指定的后台线程上进行。
*/
BluetoothGatt connectGatt(Context context,
boolean autoConnect,
BluetoothGattCallback callback,
int transport, int phy,
Handler handler) { ··· }