2

Android アプリと 1 つの周辺機器からの ble 通信に 1 つの疑問があります。このペリフェラルは、特定の特性「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が呼び出される前に書き込みを行うと書き込みが失敗するため、セマフォを使用しましたが、この方法でいくつかの通知を失うことができるのではないかと思います..

セマフォは正しい方法で使用されていますか? それとも、私に問題を引き起こす可能性がありますか?

4

1 に答える 1

1

あなたのセマフォパターンはうまくいくと思います。ただし、このようにする場合は、応答が得られない場合に備えてセマフォをクリアするタイムアウトを設定する必要があります。デバイスが範囲外に移動したか、電源が切れた (またはクラッシュした) 可能性があるため、これは確かに可能です。

もう 1 つの可能性は、コマンド デザイン パターンを使用して、複数のコマンドがある場合にコマンド キューを作成して、コマンドをキューに入れることです。

于 2015-08-19T21:08:25.007 に答える