______________________________________________________________
Android BLE 框架发布,功能全面,简单易用:
https://github.com/a1anwang/okble
______________________________________________________________
为了研究这个问题,我们先来看一段writeCharacteristic 的源码
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) { if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0 && (characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false; if (VDBG) Log.d(TAG, "writeCharacteristic() - uuid: " + characteristic.getUuid()); if (mService == null || mClientIf == 0 || characteristic.getValue() == null) return false; BluetoothGattService service = characteristic.getService(); if (service == null) return false; BluetoothDevice device = service.getDevice(); if (device == null) return false; synchronized(mDeviceBusy) { if (mDeviceBusy) return false; mDeviceBusy = true; } try { mService.writeCharacteristic(mClientIf, device.getAddress(), service.getType(), service.getInstanceId(), new ParcelUuid(service.getUuid()), characteristic.getInstanceId(), new ParcelUuid(characteristic.getUuid()), characteristic.getWriteType(), AUTHENTICATION_NONE, characteristic.getValue()); } catch (RemoteException e) { Log.e(TAG,"",e); mDeviceBusy = false; return false; } return true; }
可以看到 其中一段代码:
synchronized(mDeviceBusy) { if (mDeviceBusy) return false; mDeviceBusy = true; }
如果mDeviceBusy,那么直接返回false,write操作不会继续
这个标记位显然用来标记device是否处于忙碌状态,让我们搜索一下,这个mDeviceBusy都在哪里设为true,又在哪里设为false
1.write数据的时候,发数据下去的时候会设为true
2.read数据的时候,设为true
3. readDescriptor 时设为true
4. writeDesciptor 时设为true
5.executeReliableWrite 时设为true
-----------------------------------------------------------------------------------------------------------------------------------------------------------
6.onClientConnectionState 连接状态改变时 设为false
7. onCharacteristicWrite 写数据回调会设为false
8.onCharacteristicRead 写数据回调会设为false
9.onDescripterWrite会设为false
10.onDescripterRead会设为false
11.onExecuteWrite 会设为false
可以看出,在进行蓝牙数据读写(read,write等)会把mDeviceBusy设为true,表示正在忙碌,等待数据回调之后,设为false,表示空闲,只有空闲的时候,下一个蓝牙数据读写操作才可以进行,否则直接return false。 代表蓝牙操作是顺序执行的。
所以,当你多次writeCharacteristic 时候会发现只回调了一次onCharacteristicWrite ,原因就在于上一次的write操作还没有回调,蓝牙处于busy状态,没有执行更多的蓝牙操作
那么如何解决这个问题呢?
方法1: 把多个连续的蓝牙操作(read,write等)放在线程里,并把每个蓝牙操作之间加延迟,sleep(200)类似这样。目的是等待回调完成之后再进行 下一个蓝牙操作。
这种方法不严谨,但比较简单,在一些逻辑简单的项目里可以使用
方法2:同步操作,把所有蓝牙操作同步,等待回调之后再进行下一个操作。
原文地址《Android BLE 多次writeCharacteristic 为什么只有一个回调?》
发表评论