Android上的蓝牙低功耗:RSSI更改时获取事件

时间:2015-04-20 19:21:12

标签: android bluetooth bluetooth-lowenergy

我可以通过startLeScan或通过新的getBluetoothLeScanner扫描蓝牙LE设备,这样可以正常工作。然而,即使它继续扫描,它也不会两次检测到同一设备。这很不幸,因为我希望在信标的rssi发生变化时收到事件。 Android支持吗?

2 个答案:

答案 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会截断重复的结果。