Android BLE characteristics getValue returns null

三世轮回 提交于 2019-12-08 19:13:50

问题


I am trying to write text data to my BLE device. So , i am following Android Bluetooth GATT classes to do the task. But i found writing the text to the Characteristics is fine but while trying to retrieve the Characteristics value , it returns null.

MyCode :

public void writeCharacteristic(BluetoothGattCharacteristic characteristic,
                                String text) {

    String TAGS ="MyBeacon";

    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAGS, "BluetoothAdapter not initialized");
        return;
    } else {
        Log.w(TAGS, "Writting ... ");
    }
    byte[] data = hexStringToByteArray(text);


    Log.w(TAGS, "Writting text = " + data);


    try {
        characteristic.setValue(URLEncoder.encode(text, "utf-8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    boolean writeValue = mBluetoothGatt.writeCharacteristic(characteristic);

    Log.w(TAGS, "Writting Status = " + writeValue);

}

// Successfully onCharacteristicWrite also gets called //

   @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicWrite(gatt, characteristic, status);

        String TAGS ="MyBeacon";

        String text = null;
        try {
            text = new String(characteristic.getValue(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        Log.w(TAGS, "onCharacteristicWrite = " + text+" :: "+status);

    }

but while trying to read the Characteristics it returns null.

  for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {

                final byte[] data = gattCharacteristic.getValue(); // returns null

                  if (data != null && data.length > 0) {

                     Log.d("MyBeacon", " Read Data ")

                  } else {

                     Log.d("MyBeacon", " Data is null")
                  }

      }

MyBeacon

Also check the issue in other thread too.

Please help me out , suggest me some solution to write and read data successfully to my Beacon.


回答1:


Syntax should be as follows,

mBluetoothGatt.readCharacteristic(characteristic);

Reading characteristics: You can read the characteristic using mBluetoothGatt.readCharacteristic(characteristic);

You can have to read the characteristic's descriptor as follows,

mBluetoothGatt.readDescriptor(ccc);

Once you read it, it should return data by calling the onDescriptorRead callback. Here you can set up (subscribe) to the charactersitic through either notification or indication by calling:

mBluetoothGatt.setCharacteristicNotification(characteristic, true)

once it returns true you will need to write to the descriptor again (the value of notification or indication)

BluetoothGattDescriptor clientConfig = characteristic.getDescriptor(CCC);
clientConfig.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);

//clientConfig.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
mBluetoothGatt.writeDescriptor(clientConfig);

Once this is done you will get notifications through onCharacteristicChanged callback every time the characteristic changes.

Do update me , if you have any problems while implementing,




回答2:


I faced a similar issue where the characteristic.getValue returns Null. I was following exactly what is mentioned in the BLE Gatt documentation, and other blogs, but still the issue persisted until finally I understood what I was doing wrong.

At client device end, we setValue into the characteristic that we are interested in using

gatt.WriteCharacteristic(characteristic.setValue("Hello"));

At Server end, the request is received onto the onCharacteristicWriteRequest(....) callback. Generally we expect the value that we set at client end to be carried by the characteristic parameter but we observe the characteristic.getValue() is null.

Where in the same callback we also have another parameter by name "Value" which actually carries the characteristic value we set at Client end. Please refer this parameter and this should solve the problem.




回答3:


Did you read it too early? It should be read after onCharacteristicWrite() has been called.



来源:https://stackoverflow.com/questions/35903325/android-ble-characteristics-getvalue-returns-null

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!