如何使用信号量进行正确的 android ble 通信?

How can I use semaphore to do a correct android ble communication?

我对我的 Android 应用程序和一个外围设备的通信有疑问。这个外设通过在某个特征 "A" 上通知发送数据,我可以在另一个特定特征 "B" 上写它。 为此,我这样做:

   Semaphore sem = new Semaphore(1);
   void notifyActivation()
    {bluetoothGatt.setCharacteristicNotification(characteristic, true);

    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
            UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
    if(descriptor != null )
    {

        try 
        {
            sem.acquire();
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }

        Log.i("debug","scrittura descrittore");
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        bluetoothGatt.writeDescriptor(descriptor);
    }
 }

@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) 
                {
                    super.onDescriptorWrite(gatt, descriptor, status);
                    Log.i("debug", "descriptor status: "+status);

                    sem.release();
                }


public void write(final BluetoothGattCharacteristic characteristic)
{

    new Thread(new Runnable() {

        @Override
        public void run() {

            try {
                //acquisisco il semaforo se è libero se no mi blocco
                sem.acquire();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    boolean res=bluetoothGatt.writeCharacteristic(characteristic);

    if(!res)
    {
        Log.i("debug","scrittura fallita");
        //res=bluetoothGatt.writeCharacteristic(characteristic);
    }
    sem.release();

        }
    }).start();
}

我使用信号量是因为如果我在调用 ondescriptorwrite 之前进行写操作,写操作会失败,但我想知道这样我是否会丢失一些通知..

信号量使用正确吗?或者它会给我带来一些问题?

我认为你的信号量模式可以工作。但是如果你这样做,你应该设置一个超时来清除信号量,以防你永远得不到响应。这当然是可能的,因为设备可能已经超出范围或断电(甚至崩溃)。

另一种可能是使用命令设计模式,当有多个命令时,创建一个命令队列来排队。