Android BLE:描述符/特征写入失败,GATT_WRITE_NOT_PERMITTED

时间:2016-09-02 09:57:16

标签: java android bluetooth bluetooth-lowenergy

从我的移动设备(扫描仪)我试图写入连接的可穿戴设备(广播公司)中的描述符。

在可穿戴设备上,我已将描述符定义为

readCharacteristic = new BluetoothGattCharacteristic(Constants.READ_CHAR_UUID,
                            BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
                            BluetoothGattCharacteristic.PERMISSION_READ);
readCharacteristic.addDescriptor(new BluetoothGattDescriptor(Constants.NOTIFY_DESC_UUID,
                        BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE));
在移动设备上,我尝试用

写入特征
BluetoothGattDescriptor descriptor = readCharacteristic.getDescriptor(Constants.NOTIFY_DESC_UUID);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)

不幸的是,这失败了

中的状态为GATT_WRITE_NOT_PERMITTED
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {

}

在可穿戴式logcat中,我看到gatts_write_attr_perm_check - GATT_WRITE_NOT_PERMIT。

当我尝试写一个特征时会发生同样的事情。

奇怪的是,使用iOS扫描程序时写入成功。这意味着可穿戴部件是正确的。

我在Manifest中拥有权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

使用的设备: Nexus 5x 6.0.1 API 23, Moto 360 5.1.1 API 22

有没有人知道如何解决这个描述符/特征写入问题?

1 个答案:

答案 0 :(得分:1)

  

从我的移动设备(扫描仪)我试图写入描述符   连接的可穿戴设备(广播公司)。

在这种情况下,它应该是移动设备(中央)和连接的可穿戴设备(外围设备)。扫描仪和广播公司实际上没有建立BLE连接。

关于写入失败,当应用程序尝试将数据写入数据库时​​,它在函数gatts_write_attr_perm_check处被拒绝。代码如下:

else if (!(perm & GATT_WRITE_ALLOWED))
      {
          status = GATT_WRITE_NOT_PERMIT;
          GATT_TRACE_ERROR( "gatts_write_attr_perm_check -GATT_WRITE_NOT_PERMIT");
       }

所以,问题是记录的烫发不符合GATT_WRITE_ALLOWED,这是

> (GATT_PERM_WRITE | GATT_PERM_WRITE_ENCRYPTED |\
> GATT_PERM_WRITE_ENC_MITM |  GATT_PERM_WRITE_SIGNED |\
> GATT_PERM_WRITE_SIGNED_MITM)

那么,你有没有尝试过: 1)取消配对设备并再次配对设备。 2)启用高安全级别,例如启用MITM。

我想你想要启用通知吗?我无法获得你所拥有的所有代码,但你也可以试试这个(引自Android网站):

private BluetoothGatt mBluetoothGatt;
BluetoothGattCharacteristic characteristic;
boolean enabled;
...
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
...
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
        UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);