Coin163

首页 > Android下的BLE编程遇到的一些BUG

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

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1074

【阿里云】双十一活动,全年抄底价,限时3天!(老用户也有),
入口地址https://www.aliyun.com/1111/home

相关推荐:android之旅11 网络编程实例:多线程下载与断点续传

## 多线程下载其实哪里都在用,因此API都是JAVA的API,和Android关系不大 ## - 请求文件长度 - 创建本地文件 String path = "www.baidu.com/xxx.jpg";URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.set

 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.连接过程中出现BlueToothGatt failed to register callback     BLE的连接过程是搜索→连接→发现服务。在连接的过程中会碰到BlueToothGatt Failed to register callback的问题。目前该问题

------分隔线----------------------------