如何使用信号量进行正确的 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 之前进行写操作,写操作会失败,但我想知道这样我是否会丢失一些通知..
信号量使用正确吗?或者它会给我带来一些问题?
我认为你的信号量模式可以工作。但是如果你这样做,你应该设置一个超时来清除信号量,以防你永远得不到响应。这当然是可能的,因为设备可能已经超出范围或断电(甚至崩溃)。
另一种可能是使用命令设计模式,当有多个命令时,创建一个命令队列来排队。
我对我的 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 之前进行写操作,写操作会失败,但我想知道这样我是否会丢失一些通知..
信号量使用正确吗?或者它会给我带来一些问题?
我认为你的信号量模式可以工作。但是如果你这样做,你应该设置一个超时来清除信号量,以防你永远得不到响应。这当然是可能的,因为设备可能已经超出范围或断电(甚至崩溃)。
另一种可能是使用命令设计模式,当有多个命令时,创建一个命令队列来排队。