GATT onDescriptorRead - 只有一个回调

GATT onDescriptorRead - only one callback

我已经启动了一个 BLE 连接,在 onServicesDiscovered 我将读出所有描述符。有五个,我继续这样做:

for (int n=0;n<descriptors.size();n++)
{
     gatt.readDescriptor(descriptors.get(n));
}

descriptors 包含所有描述符... 然后调用读取回调,我要读出描述符值:

@Override
public void onDescriptorRead(BluetoothGatt gatt, final BluetoothGattDescriptor descriptor, int status)
{
     deviceInfoArray.add(new ItemSlideMenu(new String(descriptor.getValue()));
}

问题是,只调用了一次读取回调,而不是五次。你能告诉我为什么以及如何解决这个问题吗?

你一次只能有一个未完成的 gatt 操作。您必须等到相应的回调被触发,才能进行新的读取。解决这个问题的一个好方法是拥有一个队列数据结构。当你想做一个read/write时,插入一个操作到这个队列中。每当你插入一个操作并且队列已经为空或者你得到一个回调告诉一些操作已经完成,然后在队列中发出下一个操作。当 gatt 回调到达时,从队列中删除操作。这样您就可以确保一次只有一项操作未完成。

您还可以将 Runnable 附加到一个操作,该操作应在 gatt 回调到达时调用。

好主意,谢谢!特别是当你有不同的 GATT 操作时。不过我是这样解决的:

@Override
public void onDescriptorRead(BluetoothGatt gatt, final BluetoothGattDescriptor descriptor, int status)
    {
        deviceInfoArray.add(new ItemSlideMenu(new String(descriptor.getValue()), descriptor.getCharacteristic()));
        //Call this to update the adapter of deviceInfoList
        getActivity().runOnUiThread(updateAdapter);
        Log.d("xxx", new String(descriptor.getValue()));

        if(descriptors.size() > 1)
        {
            BluetoothGattDescriptor tempDescriptor = descriptors.get(1);
            descriptors.remove(1);
            mGatt.readDescriptor(tempDescriptor);
        }
    }

onDescriptorRead 被递归调用并自行终止。