BluetoothGattCallback onCharacteristicRead 从未回调
BluetoothGattCallback onCharacteristicRead never called back
我仍在努力从 android(使用 java)读取 BLE 设备(激光计)
基本上我正在尝试获取我感兴趣的字段(也称为度量)
到目前为止我发现了 5 个服务(我找到了用法 here):
- 3ab10100-f831-4395-b29d-570977d5bf94(我搞不懂这个坏小子的用法)
- 0x1800 -> 可能是我要找的
- 0x1801 -> idk(只有可写特性所以idc)
- 0x180a -> 设备名称(我可以从这个中读取名称)
- 0x180f -> 电池
我遇到的第一个问题是,根据 documentation,onCharacteristicRead(3) 自 API 13 起已弃用,因为它现在添加了一个字节数组作为参数。但根据 Android studio 的说法,这种过载并不存在。
第二个是 onCharacteristicRead 只调用了一个,尽管在超过 10 个可读特征上调用了他
我现在只是在测试,但这是我所做的:
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
for (BluetoothGattService serv: gatt.getServices()) {
System.out.println("-----------------" + serv.getUuid());
for(BluetoothGattCharacteristic chara: serv.getCharacteristics()) {
if((chara.getProperties() & PROPERTY_READ) != 0) {
System.out.println("Can read");
gatt.readCharacteristic(chara);
}
else {
System.out.println("Can't read");
}
}
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
System.out.println("Called");
if(status == GATT_SUCCESS) {
System.out.println(new String(characteristic.getValue()));
} else {
System.out.println("error during read");
}
}
这是输出:
I/System.out: -----------------00001800-0000-1000-8000-00805f9b34fb
I/System.out: Can read
I/chatty: uid=10168(com.example.adici) Binder:27154_2 identical 1 line
I/System.out: Can read
I/System.out: -----------------00001801-0000-1000-8000-00805f9b34fb
I/System.out: Can't read
I/System.out: -----------------3ab10100-f831-4395-b29d-570977d5bf94
I/System.out: Can read
I/System.out: Can read
I/System.out: Can't read
I/System.out: Can read
I/System.out: Can read
I/System.out: -----------------0000180f-0000-1000-8000-00805f9b34fb
I/System.out: Can read
I/System.out: Can read
I/System.out: -----------------0000180a-0000-1000-8000-00805f9b34fb
I/System.out: Can read
I/System.out: Called
I/System.out: DISTO 80951028
我也试过添加这个 while 循环以等待最后一个回调发生,然后再开始另一个回调
while(waitingForCallback)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
waitingForCallback = true;
gatt.readCharacteristic(chara);
在 onCharacteristicRead 中将 waitingForCallback 设置为 false 但由于未调用该方法而导致无限循环
我真的不明白为什么过载对我的 IDE 来说是个问题,因为 Sdkmin = 27 和 targetSdk = 31
感谢任何帮助!
当操作已经挂起时,您不能启动 gatt 操作(例如读取特性)。您必须等待回调才能启动下一次读取。
您的睡眠循环将无法工作,因为蓝牙堆栈从不调用您的回调,而另一个回调已经 运行ning。在这种情况下,如果您 运行 onServicesDiscovered 中的睡眠循环,onCharacteristicRead 回调将被安排到 运行,但它不会 运行 直到 onServicesDiscovered 返回。这是 Android 中“Binder”机制的一个特性,它可以防止同一对象同时回调到 运行。
我仍在努力从 android(使用 java)读取 BLE 设备(激光计) 基本上我正在尝试获取我感兴趣的字段(也称为度量)
到目前为止我发现了 5 个服务(我找到了用法 here):
- 3ab10100-f831-4395-b29d-570977d5bf94(我搞不懂这个坏小子的用法)
- 0x1800 -> 可能是我要找的
- 0x1801 -> idk(只有可写特性所以idc)
- 0x180a -> 设备名称(我可以从这个中读取名称)
- 0x180f -> 电池
我遇到的第一个问题是,根据 documentation,onCharacteristicRead(3) 自 API 13 起已弃用,因为它现在添加了一个字节数组作为参数。但根据 Android studio 的说法,这种过载并不存在。
第二个是 onCharacteristicRead 只调用了一个,尽管在超过 10 个可读特征上调用了他
我现在只是在测试,但这是我所做的:
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
for (BluetoothGattService serv: gatt.getServices()) {
System.out.println("-----------------" + serv.getUuid());
for(BluetoothGattCharacteristic chara: serv.getCharacteristics()) {
if((chara.getProperties() & PROPERTY_READ) != 0) {
System.out.println("Can read");
gatt.readCharacteristic(chara);
}
else {
System.out.println("Can't read");
}
}
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
System.out.println("Called");
if(status == GATT_SUCCESS) {
System.out.println(new String(characteristic.getValue()));
} else {
System.out.println("error during read");
}
}
这是输出:
I/System.out: -----------------00001800-0000-1000-8000-00805f9b34fb
I/System.out: Can read
I/chatty: uid=10168(com.example.adici) Binder:27154_2 identical 1 line
I/System.out: Can read
I/System.out: -----------------00001801-0000-1000-8000-00805f9b34fb
I/System.out: Can't read
I/System.out: -----------------3ab10100-f831-4395-b29d-570977d5bf94
I/System.out: Can read
I/System.out: Can read
I/System.out: Can't read
I/System.out: Can read
I/System.out: Can read
I/System.out: -----------------0000180f-0000-1000-8000-00805f9b34fb
I/System.out: Can read
I/System.out: Can read
I/System.out: -----------------0000180a-0000-1000-8000-00805f9b34fb
I/System.out: Can read
I/System.out: Called
I/System.out: DISTO 80951028
我也试过添加这个 while 循环以等待最后一个回调发生,然后再开始另一个回调
while(waitingForCallback)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
waitingForCallback = true;
gatt.readCharacteristic(chara);
在 onCharacteristicRead 中将 waitingForCallback 设置为 false 但由于未调用该方法而导致无限循环
我真的不明白为什么过载对我的 IDE 来说是个问题,因为 Sdkmin = 27 和 targetSdk = 31
感谢任何帮助!
当操作已经挂起时,您不能启动 gatt 操作(例如读取特性)。您必须等待回调才能启动下一次读取。
您的睡眠循环将无法工作,因为蓝牙堆栈从不调用您的回调,而另一个回调已经 运行ning。在这种情况下,如果您 运行 onServicesDiscovered 中的睡眠循环,onCharacteristicRead 回调将被安排到 运行,但它不会 运行 直到 onServicesDiscovered 返回。这是 Android 中“Binder”机制的一个特性,它可以防止同一对象同时回调到 运行。