我正在Android上创建具有可读写特性的自定义BLE服务。代码如下:
public static UUID MY_SERVICE = UUID.fromString("e0ec8d9c-5e4d-470a-b87f-64f433685301");
public static UUID MY_CHARACTERISTIC = UUID.fromString("e0ec8d9c-5e4d-470a-b87f-64f433685302");
/**
* Return a configured {@link BluetoothGattService} instance for the
* Custom Service.
*/
public static BluetoothGattService createCustomBleService() {
BluetoothGattService service = new BluetoothGattService(MY_SERVICE,
BluetoothGattService.SERVICE_TYPE_PRIMARY);
// Current Configuration characteristic
BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(MY_CHARACTERISTIC,
BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE,
BluetoothGattCharacteristic.PERMISSION_READ |BluetoothGattCharacteristic.PERMISSION_WRITE);
boolean serviceAdded = service.addCharacteristic(characteristic);
Log.i(TAG, "Building BLE service addCharacteristic returned "+serviceAdded);
return service;
}
对addCharacteristic(...)的调用返回true。服务本身是可以创建,可以发布的,并且客户端可以发现该服务及其特征。在客户端代码中的其他位置,在找到所述服务的BLE扫描之后,运行的发现代码如下所示:
for (BluetoothGattService service : gatt.getServices()) {
serviceUuid = service.getUuid().toString();
if( MY_SERVICE.toString().equals(serviceUuid) ) {
List<BluetoothGattCharacteristic> gattCharacteristics = service.getCharacteristics();
for( BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics ) {
characteristicUuid = gattCharacteristic.getUuid().toString();
Log.d(TAG, "onServicesDiscovered() - found characteristic uuid="+characteristicUuid);
int cProps = gattCharacteristic.getProperties();
Log.d(TAG, "onServicesDiscovered() - found characteristic properties "+cProps);
if ((( MY_CHARACTERISTIC.toString().equals(characteristicUuid) ))&&((cProps & BluetoothGattCharacteristic.PROPERTY_WRITE)>0)) {
writeCharacteristic(gatt,gattCharacteristic,"configStringLiteral");
}
}
}
}
运行该服务发现代码时,如前所述,它会找到定制的服务和已定义的特征。我为特征属性设置的任何值都会在客户端发现时正确显示。该特性显示为可写。
问题在于,即使属性说其可写,特征写入也总是失败。
有人看过吗?...或者我正在做一些愚蠢的事情,并且看了太久了。
(顺便说一句,在运行时托管自定义服务的设备是Samsung Galaxy 7,客户端是Galaxy 6 ...反之亦然,
答案 0 :(得分:0)
发现服务后,权限信息不会通过BLE发送。因此,权限属性不应用于远程特征。
客户应仅检查特征属性以决定可以做什么。如果收到错误消息,例如要求进行加密,则蓝牙协议栈应开始加密,然后重试该请求。
因此,特征属性是向客户端声明可以用其做什么的正确方法。特征权限仅告诉本地GATT Server实现如何应对传入的GATT请求。