BLE setCharacteristicNotification()从不调用

时间:2018-04-06 11:51:11

标签: android bluetooth bluetooth-lowenergy

我有一个与CharacteristicsNotification有关的问题,我在android中跟踪docs并在很多stackoverflow帖子中搜索。 我的所有代码都有效,直到我尝试从我的设备获取数据,当我订阅通知时我得到了这个日志:BluetoothGatt:setCharacteristicNotification() 但我的方法从未打过电话

我的UUID很好,我的服务发送我已经与其他应用程序核对的数据。 我为我的应用启用了位置。

我在Manifest中有这个权限:

uses-permission android:name =“android.permission.BLUETOOTH”android:required =“true”
uses-permission android:name =“android.permission.BLUETOOTH_ADMIN” uses-permission android:name =“android.permission.ACCESS_COARSE_LOCATION”

我试过3手机都是三星但不同的Android版

我真的不明白发生了什么

这是我的回调:

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        switch (newState) {
            case BluetoothProfile.STATE_CONNECTED:
                Log.i("gattCallback", "STATE_CONNECTED");
                gatt.discoverServices();
                break;
            case BluetoothProfile.STATE_DISCONNECTED:
                Log.e("gattCallback", "STATE_DISCONNECTED");
                break;
            default:
                Log.e("gattCallback", "STATE_OTHER");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        Log.i("onServicesDiscovered", "connection to service");
        BluetoothGattCharacteristic characteristic =
                gatt.getService(UUID.fromString("a389d578-6285-4b3d-a9dc-b83a2ba4c095"))
                        .getCharacteristic(UUID.fromString("9ecbe31b-f77e-4886-a0a8-c416906387e7"));
        gatt.readCharacteristic(characteristic);

        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805F9B34FB"));

        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
        gatt.writeDescriptor(descriptor);

        gatt.setCharacteristicNotification(characteristic, true);
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                                     BluetoothGattCharacteristic
                                             characteristic, int status) {
        Log.i("onCharacteristicRead", "read");
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {

        Log.i("onCharacteristicChanged", "changement");
    }
};

1 个答案:

答案 0 :(得分:1)

两个错误:

1

descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);

descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);

第二个调用会覆盖第一个值。

  1. 在开始描述符写入操作之前,必须等待读取回调。通常,您必须始终等待GATT回调才能开始下一个操作。