我可以通过startLeScan
或通过新的getBluetoothLeScanner
扫描蓝牙LE设备,这样可以正常工作。然而,即使它继续扫描,它也不会两次检测到同一设备。这很不幸,因为我希望在信标的rssi发生变化时收到事件。 Android支持吗?
答案 0 :(得分:1)
实施BluetoothGattCallback
并覆盖onReadRemoteRssi
方法。
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
String intentAction;
if (newState == BluetoothProfile.STATE_CONNECTED) {
broadcastUpdate(intentAction);
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
broadcastUpdate(intentAction);
}
}
@Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
super.onReadRemoteRssi(gatt, rssi, status);
// use rssi value here
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
} else {
Log.w(TAG, "onServicesDiscovered received: " + status);
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
};
答案 1 :(得分:1)
我使用的两种解决方案。
1)建立连接,拨打gatt的readRemoteRssi();
并覆盖onReadRemoteRssi
,并自行检查以确定RSSI是否已更改。
2)StrartLEScan每20秒(20秒足以接收新的广告包)并检查onLeScan
回调以查看是否找到设备,如果是,则比较RSSI。
RSSI是您的设备(扫描仪)派生的值。
此外,如果您有GATT STACK的代码,您将为单个设备多次调用onLEScan,GattService会截断重复的结果。