【问题标题】:Android BluetoothGatt setCharacteristicNotification only setting first characteristicAndroid BluetoothGatt setCharacteristicNotification 仅设置第一个特征
【发布时间】:2015-05-19 19:13:20
【问题描述】:

我在通过同一蓝牙 LE 设备同时使用两种不同的特性时遇到了问题。它只记录第一个特征而不是第二个特征。如果我切换它们,它仍然会注册第一个,但不会注册第二个。第一和第二特征都需要注册和接收。如果有帮助,我使用的是运行 4.4.2 的三星 Galaxy S4。

这里是调用 setCharacteristicNotification() 的代码部分

if (mBluetoothBeaconGatt != null && mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE) != null) {

        characteristicBracelet = mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE)
                .getCharacteristic(UUID_CUSTOM_BRACELET);

        characteristicBeacon = mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE)
                .getCharacteristic(UUID_CUSTOM_BEACON);

        if(characteristicBracelet != null) {
            Log.i(TAG, "Init Bracelet Characteristics");
            this.setCharacteristicNotification(characteristicBracelet,
                    true);
        }
        if(characteristicBeacon != null) {
            Log.i(TAG, "Init Beacon Characteristics");
            this.setCharacteristicNotification(characteristicBeacon, true);
        }
    }

setCharacteristicNotification

if (UUID_CUSTOM_BEACON.equals(characteristic.getUuid())) {
        if (mBluetoothBeaconGatt != null) {
            Log.i(TAG, "Enabling indication for beacon");
            mBluetoothBeaconGatt.setCharacteristicNotification(characteristic, enabled);
            BluetoothGattDescriptor descriptor = characteristic
                    .getDescriptor(UUID
                            .fromString(CustomGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
            descriptor
                    .setValue((enabled) ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
                            : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
            mBluetoothBeaconGatt.writeDescriptor(descriptor);
        }
    } else if (UUID_CUSTOM_BRACELET.equals(characteristic.getUuid())) {
        if (mBluetoothBraceletGatt != null || mBluetoothBeaconGatt != null) {
            BluetoothGatt gatt = (mBluetoothBeaconGatt != null) ? mBluetoothBeaconGatt : mBluetoothBraceletGatt;
            gatt.setCharacteristicNotification(characteristic, enabled);
            BluetoothGattDescriptor descriptor = characteristic
                    .getDescriptor(UUID
                            .fromString(CustomGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
            descriptor
                    .setValue((enabled) ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
                            : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
            gatt.writeDescriptor(descriptor);
        }
    }

经过测试以查看它们是否为空的变量验证它们不为空。

如果您需要其他信息或者这是重复的,请告诉我。

感谢您抽出宝贵时间提供帮助。

【问题讨论】:

    标签: android bluetooth gatt


    【解决方案1】:

    您不能同时执行多个蓝牙操作。获得onDescriptorWrite 后,您可以启用/禁用您的下一个特征:

    private int index;
    private boolean enabled;
    
    private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            index++;
            setNotification();
        }
    }
    
    public void notify(boolean enabled){
        index = 0;
        this.enabled = enabled;
        setNotification();
    }
    
    private void setNotification(){
        BluetoothGattCharacteristic characteristic;
        switch(index){
            case 0:
                characteristic = mBluetoothGatt.getService(MY_SERVICE_UUID)
                            .getCharacteristic(UUID_CUSTOM_BRACELET);
                break;
            case 1:
                characteristic = mBluetoothGatt.getService(MY_SERVICE_UUID)
                            .getCharacteristic(UUID_CUSTOM_BEACON);
                break;
            default:
                return;
        }
        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG);
        descriptor.setValue((enabled) ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
                            : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(desc);
    }
    

    来自 NewCircle 的精彩教程:https://newcircle.com/s/post/1553/bluetooth_smart_le_android_tutorial

    【讨论】:

    • 我不确定你对多个 BluetoothGatt 对象做了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2022-04-26
    • 2018-01-15
    相关资源
    最近更新 更多