自己解決しました。
Notificationを使うと、特定のデバイスに通知が送れるので、centralアプリでBluetoothGatt.writeCharacteristicで値を送信し、peripheralアプリのonCharacteristicWriteRequest内で処理結果を通知で返すことで解決しました。
========== centralアプリソース ==========
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
String serviceUuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
String characteristicUuid = "YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY";
String characterisitcConfigUuid = "00002902-0000-1000-8000-00805f9b34fb";
BluetoothGattService service = gatt.getService(serviceUuid);
if (service != null) {
BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUuid);
boolean registered = gatt.setCharacteristicNotification(characteristic, true);
if (registered) {
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(characterisitcConfigUuid);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
}
}
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorWrite(gatt, descriptor, status);
mCharacteristic.setValue("peripheralに渡す値");
gatt.writeCharacteristic(mBleGattCharacteristic)
}
@Override
public void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
log.d(TAG, characteristic.getStringValue(0));
}
========= peripheralアプリソース =========
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);
}
@Override
public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
Log.d(TAG, value.toString());
// valueを使った処理
characteristic.setValue(処理結果);
mGattServer.notifyCharacteristicChanged(device, characteristic, false);
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, null);
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。