android 4.3蓝牙没有被称为onCharacteristicRead()

时间:2014-09-16 09:48:40

标签: java android bluetooth bluetooth-lowenergy android-notifications

我已将通知设置为android,它没有调用方法onCharacteristicRead() ???? 它不会进入该功能。为什么会这样呢?

感谢任何帮助

请求解决方案。

这是我的代码:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status,
            int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.i(TAG, "Connected to GATT server.");
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:"
                    + mBluetoothGatt.discoverServices());
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.i(TAG, "Disconnected from GATT server.");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            gattServices = mBluetoothGatt
                    .getService(SampleGattAttributes.SERVICES_UUID);
            if (gattServices != null) {
                gattCharacteristics = gattServices
                        .getCharacteristic(SampleGattAttributes.CHARACTERISTIC_UUID);
                System.out.println("character-->" + gattCharacteristics);
            }
            if (gattCharacteristics != null) {
                System.out.println("Characteristic not null");
                System.out.println("Characteristic Properties-->"
                        + gattCharacteristics.getProperties());
                mBluetoothGatt.setCharacteristicNotification(gattCharacteristics,
                true);
            }
        } else {
            Log.w(TAG, "onServicesDiscovered received: " + status);
        }
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
            BluetoothGattCharacteristic characteristic, int status) {
        System.out.println("in read");
        if (status == BluetoothGatt.GATT_SUCCESS) {
            byte[] data = characteristic.getValue();
            System.out.println("reading");
            System.out.println(new String(data));
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt,
            BluetoothGattCharacteristic characteristic) {
        //
        System.out.println("change");
        byte[] data = characteristic.getValue();
        System.out.println(new String(data));
    }
};

提前谢谢!!

1 个答案:

答案 0 :(得分:17)

首先,如果您通过以下方式阅读了特征,onCharacteristicRead将会触发:

 mBluetoothGatt.readCharacteristic(characteristic);

阅读特征和设置通知是两回事。您希望从中获取数据的特征类型是什么?

是吗:

  • 通知
  • 表示

如果是read,您可以使用mBluetoothGatt.readCharacteristic(characteristic);方法读取特征,但如果是notifyindicate,则必须首先阅读特征descriptor通过调用:

mBluetoothGatt.readDescriptor(ccc);

读完后,它应该通过调用onDescriptorRead回调来返回数据 在这里,您可以通过调用:

通过通知或指示设置(订阅)字符
mBluetoothGatt.setCharacteristicNotification(characteristic, true)

一旦它返回true,您将需要再次写入描述符(通知或指示的值)

BluetoothGattDescriptor clientConfig = characteristic.getDescriptor(CCC);
clientConfig.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
// or
//clientConfig.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
mBluetoothGatt.writeDescriptor(clientConfig);

完成此操作后,每当特征发生变化时,您都会收到onCharacteristicChanged回调的通知。

您可以在Android here上阅读有关蓝牙连接的更多信息 和蓝牙特征here