Invece di utilizzare il sonno per ogni blocco, ho trovato un modo migliore ed efficiente per la mia applicazione di inviare più di 20 bit di dati.
I pacchetti verranno inviati dopo onCharacteristicWrite() attivato. Ho appena scoperto che questo metodo verrà attivato automaticamente dopo che il dispositivo periferico (BluetoothGattServer) invia un metodo sendResponse().
primo luogo dobbiamo trasformare i dati a pacchetto in pezzo con questa funzione:
public void sendData(byte [] data){
int chunksize = 20; //20 byte chunk
packetSize = (int) Math.ceil(data.length/(double)chunksize); //make this variable public so we can access it on the other function
//this is use as header, so peripheral device know ho much packet will be received.
characteristicData.setValue(packetSize.toString().getBytes());
mGatt.writeCharacteristic(characteristicData);
mGatt.executeReliableWrite();
packets = new byte[packetSize][chunksize];
packetInteration =0;
Integer start = 0;
for(int i = 0; i < packets.length; i++) {
int end = start+chunksize;
if(end>data.length){end = data.length;}
packets[i] = Arrays.copyOfRange(data,start, end);
start += chunksize;
}
dopo i nostri dati pronti, così ho messo il mio iterazione su questa funzione:
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if(packetInteration<packetSize){
characteristicData.setValue(packets[packetInteration]);
mGatt.writeCharacteristic(characteristicData);
packetInteration++;
}
}
è la destinazione del dati anche un dispositivo Android? – ThomasW
No È periferica BLE personalizzata. – Nik
OK. Nei miei test Android invierà oltre 20 byte a una periferica iOS, quindi forse dipende dal tipo di periferica. Tuttavia, per impostazione predefinita riceverà solo 20 byte da una periferica iOS. – ThomasW