蓝牙4.0 笔记

来源:互联网 发布:授权回调域名校验出错 编辑:程序博客网 时间:2024/06/08 00:13

1.数据重复混乱,本来回复的数据应该是A1,A2,B1,B2 .结果上来的数据为A1,B1,A2,B2

而我这边做了队列等待,是依次发送的,日志输出显示我这边的发送是正确的,怀疑是Android手机蓝牙底层的缺陷,但通过蓝牙的空中抓包,发现这边同一时间给蓝牙发送了2次相同数据,经过仔细调试,发现在连接断开,然后直接重连时,这种状况基本是必现得,初步怀疑是连接的问题,通过仔细观察蓝牙底层输出日志,发现断开重连时新开启了一个连接线程mClientIf 与上次的不一样,而且当发送数据的时候,上次的mClientIf 被自动重连了,导致我这边在新的mClientIf上发送的数据,同时也会在上一个mClientIf上再发送一次,导致数据的重复发送,和数据的重复响应。

解决方案:一,在重新连接是 关闭掉上一个连接,调用mBluetoothGatt.close()方法。二,不新建一个连接,重用上一个连接 mBluetoothGatt.connect()

if (address.equals(mCurMac) && mBluetoothGatt != null) {// 上一个连接还在            Log.i(TAG,"重连上一个连接");            if (!mBluetoothGatt.connect()) {                mState = STATE_UNCONNECTED;                bleConnLisener.onFailed(IBleConnectionListener.EXCEP_CONNECT_FAILED);            }        } else {            Log.i(TAG,"连接新连接");            BluetoothDevice mDevice = mBleAdapter.getRemoteDevice(address);            mCurMac=address;            mBluetoothGatt = mDevice.connectGatt(context, autoConnect, mGattCallback);        }


2.E/BluetoothGatt: android.os.DeadObjectException

在连接状态,手动断开蓝牙,然后再开启,再重连的时候,就会报如上错误。

解决方案:蓝牙断开 onConnectionStateChange 会被回调,在这里面立即关掉连接 mBluetoothGatt.close(),再重连就不会出现如上异常。也可以在调用close之前,判断下蓝牙状态,如果蓝牙没有打开,则关闭掉,否则不关,重连时直接重用


3.昨天发送字符串,手表下面乱码,手表同事查看日志说 有重复发包,通过蓝牙空中抓包发现是 用writeCommand(WRITE_TYPE_NO_RESPONSE)方式写的数据,导致发包重复。但是我并没有设置 writeType,默认得不就是writeRequest么,最后手动加上了writeRequest:

if(gattWriteCharts!=null){            //手动设置写类型为writeRequest,默认的蓝牙抓包到的是writeComand(WRITE_TYPE_NO_RESPONSE)会有重复发包的情况            gattWriteCharts.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);            gattWriteCharts.setValue(data);            mBluetoothGatt.writeCharacteristic(gattWriteCharts);        }else {            Log.e(TAG, "send but gattWriteCharts is null");        }


4.s3手机 蓝牙关闭后,再打开,无法自动重连

正常状况下,不通过扫描,直接connect(mac),如果连接不上,30s底层会回一个onConnectionStateChange 事件上来,通知连接断开。但是在s3上面,关闭蓝牙后,再打开,然后直接connect时,底层不会回onConnectionStateChange事件,此时,通过其他得蓝牙app扫描连接下,就能立即连上,很是奇怪。

解决方案:在监听到蓝牙打开时,延时重新初始化BluetoothAdapter,然后在connect前,做一个短时间得扫描,这样再connect时,就没有问题了。

唉,很奇怪的问题。


5.开关蓝牙后,不扫描,直接connect,很难连接上。

6.连接同一个设备时,要保证调用connect方法的线程的一致性,若多次调用的线程不一致,会导致底层产生多个chiefid,不知道设备被那个线程的连接上了,导致当前的连接连不上,而设备又被连接了。

7.mBluetoothGatt.writeCharacteristic(mWriteCharacteristic) 返回false问题

收到ble设备的一个数据包,我回一个ACK,然后又立即写一组data,就导致了上面得问题,要等ACK写成功之后,再写下一组data才行

0 0
原创粉丝点击