Как синхронизировать запись / чтение характеристики BLE на Android
Мое приложение для Android может либо написать, либо прочитать характеристику в зависимости от порядка методов. Как я могу синхронизировать оба? Мне нужно написать с прослушивателем onClick и прочитать значения (не обязательно ответы от характеристики записи). С кодом ниже он может только читать. Если я закомментирую mBluetoothLeService.readCharacteristic(characteristic);
тогда я могу написать только РАЗ
Основной вид деятельности пользовательского интерфейса Binder с сервисом BLE:
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (RBLService.ACTION_GATT_DISCONNECTED.equals(action)) {
} else if (RBLService.ACTION_GATT_SERVICES_DISCOVERED
.equals(action)) {
getGattService(mBluetoothLeService.getSupportedGattService());
Log.w(TAG,"calling gattservice");
} if (RBLService.ACTION_DATA_AVAILABLE.equals(action)) {
Log.w(TAG,"sending data to display function");
displayData(intent.getExtras().getString(RBLService.EXTRA_DATA));
}
}
};
Получение Сервиса, запись / чтение:
private void getGattService(BluetoothGattService gattService) {
BluetoothGattCharacteristic characteristic = gattService
.getCharacteristic(RBLService.UUID_BLE_SHIELD_TX);
map.put(characteristic.getUuid(), characteristic);
mBluetoothLeService.setCharacteristicNotification(characteristic,true);
mBluetoothLeService.readCharacteristic(characteristic);
Log.w(TAG,"I am at read charac method");
Log.w(TAG, "TX ok:");
if (wData == TRUE) {
try {
characteristic.setValue(arr);
Log.w(TAG, "characteristic set to array" + characteristic);
} catch (NullPointerException e) {
Log.w(TAG, "sth is wrong @player");
}
try {
mBluetoothLeService.writeCharacteristic(characteristic);
Log.w(TAG, "write success" + characteristic);
} catch (NullPointerException e) {
Log.w(TAG, "sth is wrong @player 2");
}
Сервис BLE, напишите характеристику:
public void writeCharacteristic(BluetoothGattCharacteristic characteristic)
{
//BluetoothGattCharacteristic characteristic=null;
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
/*if (UUID_BLE_SHIELD_TX.equals(characteristic.getUuid())){
Log.w(TAG,"characteristic uuid equals with TX");
}*/
try{
mBluetoothGatt.writeCharacteristic(characteristic);
Log.w(TAG,"characteristic write success"+characteristic);}
catch (NullPointerException e){Log.w(TAG,"sth is wrong 2");}
return;
}
Read Characteristic:
private void broadcastUpdate(final String action,
final BluetoothGattCharacteristic characteristic) {
final Intent intent = new Intent(action);
if (UUID_BLE_SHIELD_RX.equals(characteristic.getUuid())) {
final byte[] rx = characteristic.getValue();
//Log.w(TAG, "value of rx[0]"+rx[0]);
int location=(short)((rx[1]&0xff)<<8|(rx[2]&0xff));
//int location=rlocation & 0XFF;
Log.w(TAG, "inf-Location: "+location);
int pressure=((rx[3]&0xff)<<8|(rx[4]&0xff));
Log.w(TAG, "inf-Pressure: "+pressure);
/*Log.w(TAG,"rx[0]"+rx[0]);
Log.w(TAG,"rx[1]"+rx[1]);
Log.w(TAG,"rx[2]"+rx[2]);
Log.w(TAG,"rx[3]"+rx[3]);
Log.w(TAG,"rx[4]"+rx[4]);*/
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < rx.length; ++i) {
// hexString.append(Integer.toHexString(0xFF & rx[i]));
hexString.append(String.format("%02X" ,rx[i]));
}
final String data=hexString.toString();
intent.putExtra(EXTRA_DATA, data);
}