2015-05-08 7 views
5

Sto tentando di inviare più di 33 byte utilizzando loop semplici, Qualcuno ha idea di come inviare più di 20 byte di dati su Android ble.Come inviare più di 20 byte di dati su ble in Android?

if(!mConnected) return; 
     for (int i = 0; i<str.length;i++) { 
      if(str[i] == str[str.length -1]){ 
       val = str[i]+"\n"; 
      }else { 
       val = str[i] + "_"; 
      } 
      System.out.println(val); 
      mBluetoothLeService.WriteValue(val); 
     } 
+0

è la destinazione del dati anche un dispositivo Android? – ThomasW

+0

No È periferica BLE personalizzata. – Nik

+0

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

risposta

3

Invio più di 20 byte con BLE è facilmente realizzabile suddividendo i dati in pacchetti di byte 20 e implementare un breve ritardo (cioè usando sleep()) tra l'invio di ciascun pacchetto.

Ecco un breve frammento di codice da un progetto sto lavorando che prende i dati in forma di byte[] e si divide in un array dello stesso, (byte[][]), in 20 blocchi byte, e quindi lo invia un altro metodo che trasmette ciascun pacchetto uno per uno.

int chunksize = 20; 
    byte[][] packets = new byte[packetsToSend][chunksize]; 
    int packetsToSend = (int) Math.ceil(byteCount/chunksize); 

    for(int i = 0; i < packets.length; i++) { 
     packets[i] = Arrays.copyOfRange(source,start, start + chunksize); 
     start += chunksize; 
    } 

    sendSplitPackets(packets); 

Ecco altri due molto buone spiegazioni su come raggiungere questo obiettivo:

(Stackoverflow) Android: Sending data >20 bytes by BLE

(Nordic Semi) Dealing Large Data Packets Through BLE

+0

Devo inviare dati ripetutamente una volta avviata l'attività. se c'è un cambiamento o nessun cambiamento ma devo inviarlo. così a volte i miei dati si sono sovrapposti e rovinano la mia funzionalità. – Nik

+1

Non capisco appieno il problema che stai riscontrando, ma quello che raccomanderei è di garantire che (1) tu stia implementando un breve ritardo tra i pacchetti e (2) invii un pacchetto iniziale di "intestazione" che indica il tuo metodo quanti pacchetti totali aspettarsi e utilizzare un contatore incrementale per garantire che sia stato ricevuto il numero corretto. Se riesci a spiegare un po 'di più il tuo caso d'uso, potrei aiutarti con suggerimenti più dettagliati. –

+0

Hai qualche idea su come mantenere una connessione bluetooth stabile in tutta l'app Android. In questo momento sto stabilendo una nuova connessione in ogni attività dell'app. – Nik

1

Alcune implementazioni bluetooth LE incorporati limitare la dimensione di una caratteristica di essere 20 byte. So che la serie Laird BL600 fa questo. Questa è una limitazione del modulo Laird, anche se le specifiche BLE richiedono che la lunghezza massima sia più lunga. Altre soluzioni BLE incorporate hanno limiti simili. Sospetto che questa sia la limitazione che stai incontrando.

0

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++; 
     } 
    }