1 Android手机(N5X 6.0.1)正在运行BLE服务器,另一个(N5X O)正在订阅.

可以启用特征通知,但是在写描述符部分,我一直得到133.

Server.java

private void createServer() {

bluetoothGattServer = bluetoothManager.openGattServer(this, serverCallback);

BluetoothGattService service = new BluetoothGattService(Constants.SERVICE,

BluetoothGattService.SERVICE_TYPE_PRIMARY);

characteristic =

new BluetoothGattCharacteristic(Constants.CHARACTERISTIC,

BluetoothGattCharacteristic.PROPERTY_NOTIFY,

BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PERMISSION_WRITE);

// public static UUID DESCRIPTOR = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");

characteristic.addDescriptor(new BluetoothGattDescriptor(Constants.DESCRIPTOR,

BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE));

characteristic.setWriteType(

BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);

service.addCharacteristic(characteristic);

bluetoothGattServer.addService(service);

}

private BluetoothGattServerCallback serverCallback = new BluetoothGattServerCallback() {

@Override

public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {

super.onConnectionStateChange(device, status, newState);

Log.d(TAG, "onConnectionStateChange " + device.getName() + " " + status + " " + newState);

if (newState == BluetoothGatt.STATE_CONNECTED) {

bluetoothDevice = device;

} else if (newState == BluetoothGatt.STATE_DISCONNECTED) {

bluetoothGattServer.cancelConnection(bluetoothDevice);

bluetoothGattServer.close();

}

}

};

private void sendData(String message) {

characteristic.setValue(message);

bluetoothGattServer.notifyCharacteristicChanged(bluetoothDevice, characteristic, true);

}

所有其他UUID都是从here创建的.

Client.java

device.establishConnection(false)

.flatMap(bleConnection -> bleConnection.setupNotification(Constants.CHARACTERISTIC))

.flatMap(onNotificationReceived -> onNotificationReceived)

.subscribe(data -> {

Log.d(TAG, "data: " + data);

}, throwable -> {

Log.d(TAG, "data error " + throwable);

});

logcat的

05-15 15:26:50.097 D/BluetoothGatt: setCharacteristicNotification() - uuid: 8d7dda32-3759-11e7-a919-92ebcb67fe33 enable: true

05-15 15:26:50.105 D/RxBle#Radio: QUEUED RxBleRadioOperationDescriptorWrite(60042487)

05-15 15:26:50.110 D/RxBle#Radio: FINISHED RxBleRadioOperationServicesDiscover(231218312)

05-15 15:26:50.112 D/RxBle#Radio: STARTED RxBleRadioOperationDescriptorWrite(60042487)

05-15 15:27:20.119 D/RxBle#Radio: FINISHED RxBleRadioOperationDescriptorWrite(60042487)

05-15 15:27:20.121 D/BluetoothGatt: setCharacteristicNotification() - uuid: 8d7dda32-3759-11e7-a919-92ebcb67fe33 enable: false

05-15 15:27:20.126 D/RxBle#BluetoothGatt: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=133

05-15 15:27:20.129 D/BLE: data error BleGattDescriptorException{macAddress=42:EE:5A:C6:C1:F0, status=133 (0x85 -> https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-5.1.0_r1/stack/include/gatt_api.h), bleGattOperationType=BleGattOperation{description='DESCRIPTOR_WRITE'}}

注意:如果我使用原生Android API,我可以订阅和接收通知,而无需写入描述符.

更新:有趣的事情,虽然写描述符进程正在发生(它需要大约30秒,直到它返回错误),我能够收到onCharacteristicChanged.

update2:添加回调并写入特征代码

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐