Android下的BLE编程遇到的一些BUG
16lz
2021-01-26
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() {@Overridepublic 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使用在对传输可靠性要求较高的场合,还需在应用层自己封装一层传输协议。
更多相关文章
- Android(安卓)连接Wifi和创建Wifi热点的实例
- ViewPage固定每页加载的数量。进行翻页
- Android(安卓)- Intent
- Android实现多参数文件和数据上传
- StageFright框架流程解读
- 如何获取手机短信和通话记录信息
- Android(安卓)获取手机中微信聊天记录并后台发送到邮箱
- Android中的Sqlite数据库操作总结
- android调用系统短信Intent时将预填接收号码和内容