您的足迹:首页 > 蓝牙BLE >Android BLE 多次writeCharacteristic 为什么只有一个回调?

Android BLE 多次writeCharacteristic 为什么只有一个回调?

为了研究这个问题,我们先来看一段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:同步操作,把所有蓝牙操作同步,等待回调之后再进行下一个操作。

相关推荐

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)