Android下的BLE编程遇到的一些BUG

 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使用在对传输可靠性要求较高的场合,还需在应用层自己封装一层传输协议

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值