gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:31:36 25 4
gpt4 key购买 nike

我对我的 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 - 如何使用信号量进行正确的 android ble 通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30884587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com