通过从BLE设备读取RSSI,我在android上遇到了一些问题。 我的代码一直可以正常工作,现在我不得不修改Gatt连接功能以解决某些问题,现在我无法阅读RSSI。
首先,我将gatt功能从
mGatt = device.connectGatt(this, false, gattCallback);
到
mGatt = device.connectGatt(this, true, gattCallback,BluetoothDevice.TRANSPORT_LE);
所以每次我调用此功能
gatt.readRemoteRssi();
它永远不会像以前那样进入回调
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status)
在我将新的参数值添加到connecGatt函数之前,读取RSSI一直有效。
答案 0 :(得分:1)
我遇到了同样的问题,我认为Android API可能有问题。首先,使用此代码可以工作10%的时间:
bluetoothDevice.connectGatt(this, true, new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
Log.d(TAG, "read rssi: " + gatt.readRemoteRssi());
super.onConnectionStateChange(gatt, status, newState);
}
@Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
Log.d(TAG, "rssi: " + rssi);
}
});
但是我可以通过在此处添加延迟来改善它以使其70%的时间正常工作:
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
new Handler(Looper.getMainLooper()).postDelayed(
() -> Log.d(TAG, "read rssi: " + gatt.readRemoteRssi()), 3000);
super.onConnectionStateChange(gatt, status, newState);
}
但是,我注意到,如果信号强度保持不变,它将停止工作。我的意思是如果设备在附近并且rssi是-37,并且我多次调用此命令,则只会得到一次结果。但是,如果我将设备移回并调用它,则会立即获得结果(例如rssi -61),然后再次将其移近时,也会立即获得结果。在这种情况下,我的策略是不时读取并且仅在我真正获得结果时才更改值。