2015-02-13 10 views
12

Rozwijam BLE w Androidzie, mogę skanować, podłączać i pisać charakterystykę do urządzenia BLE.Jak szybko i stabilnie zapisywać kolejne cechy dla BLE w systemie Android?

Wywołuję następującą funkcję, aby przekazać BluetoothGatt i characteristic do AsyncTask po kliknięciu na Button.

write_btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     new WriteCharacteristic(mBluetoothGatt , HueCharacteristic).execute(); 
    } 
}); 

Kodeks charakterystyce zapisu jest jak następuje:

private class WriteCharacteristic extends AsyncTask<String, Void, String> { 

     public BluetoothGatt mGatt; 
     public BluetoothGattCharacteristic mCharacteristic; 

     public WriteCharacteristic(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic){ 
      mGatt = gatt; 
      mCharacteristic = characteristic; 
     } 

     @Override 
     protected String doInBackground(String... urls) { 
      mGatt.writeCharacteristic(mCharacteristic); 
      return null; 
     } 
    } 

Ale klikam przycisk kolejne, wydaje się, że Android nie pisać za każdym characteristic do urządzenia BLE .

Jeśli kliknę przycisk po kolei przez 5 razy, utraci on 1 ~ 3 razy. Napiszesz tylko characteristic na BLE urządzenie przez dwa razy.

Pytanie:

Is there any better way to write characteristic consecutive and stable to BLE device for Android?

Odpowiedz

16

odczytu/zapisu systemu charakterystycznego w stosie Bluetooth Android nie jest dobry w kolejce wiele operacji. Musisz poczekać na zakończenie operacji przed wysłaniem kolejnej. Ponadto, ponieważ twój kod używa AsyncTask, będziesz otrzymywać równoległe wykonywanie zadań na niektórych urządzeniach, więc nawet żądania nie będą przekształcane do postaci szeregowej po wielokrotnym naciśnięciu przycisku.

Aby uzyskać stabilne wyniki z frameworka, należy je ustawić w kolejce do tych żądań i poczekać, aż zadziała BluetoothGattCallbackonCharacteristicWrite() przed wysłaniem następnego polecenia. Twój kod musi zsynchronizować cały dostęp do obiektu GATT, aby następny writeCharacteristic() nigdy się nie pojawił, dopóki wywołanie zwrotne zakończenia nie zostanie wywołane dla poprzedniego żądania.

+2

Kiedy komunikujemy się z kilkoma (2+) więcej urządzeniami BLE, powinniśmy umieścić w kolejce wszystkie charakterystyki i deskryptory zapisu w tej samej kolejce i zachować rekord, do którego mają być napisane, lub mogą mieć oddzielne kolejki, tak gatt1.writeCharacteristics (. .) i gatt2.writeCharacteristics (..) są prawdopodobnie napisane w tym samym czasie? 10q – Ewoks

+1

@Devunwired Mam to samo pytanie co Ewoks, czy mógłbyś to trochę wyjaśnić? – Felix