1.连接过程中出现BlueToothGatt failed to register callback
BLE的连接过程是搜索→连接→发现服务。在连接的过程中会碰到BlueToothGatt Failed to register callback的问题。目前该问题的解决方式如下:
private void BleConnect(BluetoothDevice device) {
mBleDevice = device;
mBleMediator.stopScan(mBleScanCallback);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBleMediator.connectBle(BleActivity.this, true, mBleDevice);
}
}, 50);
}
即在BLE搜索到设备之后暂停一段,然后再进行连接,目前该问题只在三星手机Android 4.3的固件中出现。2.接收多条数据出现数据丢失
通过回调函数onCharacteristicChanged()或者onCharacteristicWrite()接收数据时,如果同时接收多条数据,并且设备端发送的数据间隔过短,接收函数有可能出现数据的丢失。个人感觉是回调函数的线程同步问题,解决方式如下。
/**
* 触发远程characteristics通知结果时回调
*
* @param bleGatt 与characteristics相关联的GATT客户端连接
* @param bleChrc 通知更新结果的characteristics
*/
public void onCharacteristicChanged(BluetoothGatt bleGatt, BluetoothGattCharacteristic bleChrc) {
byte[] mByte = bleChrc.getValue();
StringBuilder mStrBuilder = new StringBuilder(mByte.length);
/** 逐byte转换 */
for (byte mByteChar : mByte) {
mStrBuilder.append(String.format("%02x", mByteChar));
} /** end of for (byte mByteChar : mByte) */
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
在接收数据之后线程Sleep()一段时间,可以提高数据接收的可靠性。
关于BLE数据传输的可靠性。蓝牙传输本身的可靠性较高,在4.0规范中其链路层核心协议L2CAP使用了CRC校验,用以保证数据传输的可靠性,如果CRC校验出错,则直接丢弃数据。但是在规范中并没有强制规定丢包时的重传,如果将BLE使用在对传输可靠性要求较高的场合,还需在应用层自己封装一层传输协议。