Autore Topic: Ritardo su lettura dati wifi  (Letto 505 volte)

Offline fedepass

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung tab 3
  • Sistema operativo:
    win 7
Ritardo su lettura dati wifi
« il: 13 Maggio 2014, 14:08:36 CEST »
0
Ciao A tutti,

volevo sottoporvi un problema che ho e che non capisco come risolvere.
Premetto che sono nuovo al mondo android, ma per lavoro devo affrontare questa problematica.

Io acquisisco immagini jpeg da uno strumento esterno collegato via wifi e le visualizzo in sequenza sul tablet.
Il problema che ho è relativo alla tempistica di acquisizione dei dati da wifi. L'intervallo di tempo tra una immagine e l'altra non è costante e varia a volte anche di diversi secondi nonostante il ciclo di acquisizione sia continuo.

Avendo il dubbio che il problema fosse a livello dello strumento, ho sviluppato un sw da pc in labview facendo le stesse operazioni e tutto funziona correttamente. No ritardi e visualizzazione corretta.

In android ho utilizzato una asynctask che mi apre la connessione wifi con lo strumento, invia il comando di acquisizione e riceve i dati (come primo la dimensione dell'immagine e come secondo tutti i bytes) in un ciclo finche non viene fermato.

         client = new Socket(address, port);
         client.setTcpNoDelay(true);
         toServer = new BufferedOutputStream(client.getOutputStream());
         fromServer = new BufferedInputStream(client.getInputStream());

la lettura la effettuo fino a quando ho finito tutti i bytes

if (fromServer.available() > 0)
{
data[dat] = (byte)fromServer.read();
dat++;
}

le immagini sono di circa 3K e l'array data[] è di 4K

Qualcuno sa dirmi se utilizzo male la connessione wifi? e nel caso come procedere per avere una lettura continua dei dati?

Grazie
Federico

Offline fedepass

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung tab 3
  • Sistema operativo:
    win 7
Re:Ritardo su lettura dati wifi
« Risposta #1 il: 15 Maggio 2014, 10:04:33 CEST »
0
Ciao a tutti,

solo per aggiornarvi sul problema nel caso qualcuno sa aiutarmi.
Ho riscritto un programma banalissimo in cui faccio partire un asynctask che invia e riceve i dati da wifi in ciclo continuo.

Vedo in debug una serie di GC_CONCURRENT e non capisco come mai mi viene liberata cosi spesso la memoria. Di conseguenza ho ritardi sulla lettura da strean variabili come scritto nel psot precedente.

VI allego un pezzo del codice.
Spero che qualcuno abbia una soluzione

Codice (Java): [Seleziona]
       protected Void doInBackground(Void... params)
        {
                int body[] = new int[5000];
                try {
                                //apertura canale tcp e configurazione stream
                                Socket client = new Socket("192.168.1.115", 2000);
                                BufferedOutputStream toServer = new BufferedOutputStream(client.getOutputStream());
                                BufferedInputStream fromServer = new BufferedInputStream(client.getInputStream());
                               
                                while(true)
                                {
                                        int dim = 0;
                                        byte[] mybytearray = new byte[] {'B','0','0'};
                                        //write on TCP
                                        toServer.write(mybytearray, 0, 3);
                                        toServer.flush();
                                        Log.d("info", "sendCommand");
                                        // leggo size
                                        int[] size = new int[2];
                                        int filesize = 0;
                                       
                                        int datRec = 0;
                                        int disp = 0;
                                        while(datRec<2)
                                        {
                                                disp = fromServer.available();
                                                if (disp > 0)
                                                {
                                                        size[datRec] = (fromServer.read());
                                                        datRec++;
                                                }
                                        }
                                        //fine ricezione SIZE
                                        if (datRec == 2)
                                        {
                                                filesize = ((size[0] & 0xFF)  << 8) | ((size[1] & 0xFF) << 0 );
                                                Log.d("Answer", "size " + filesize);
                                               
                                                //filesize = (int) Math.floor((float)filesize/2);
                                                if (dim == 0)
                                                        dim = filesize;
                                                //leggo i dati
                                                int cicli= (int) Math.ceil((float)filesize/dim);
                                                int i;
                                                for (i = 0; i<cicli; i++)
                                                {
                                                        //lettura del pacchetto di dati
                                                        datRec = 0;
                                                        disp = 0;
                                                        while(datRec<filesize)
                                                        {
                                                                disp = fromServer.available();
                                                                if (disp > 0)
                                                                {
                                                                        body[datRec] = (fromServer.read());
                                                                        datRec++;
                                                                }
                                                        }
                                                       
                                                        Log.d("Answer", "answer " + datRec);                   
                                                }
                                        }
                                }
                               
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                return null;
        }

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Ritardo su lettura dati wifi
« Risposta #2 il: 15 Maggio 2014, 10:20:08 CEST »
0
Hai profato a fare un po' di profiling con TraceView per individuare "di preciso" dove viene perso il tempo?

https://developer.android.com/tools/debugging/debugging-tracing.html
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline fedepass

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung tab 3
  • Sistema operativo:
    win 7
Re:Ritardo su lettura dati wifi
« Risposta #3 il: 15 Maggio 2014, 10:51:04 CEST »
0
La funzione

disp = fromServer.available();

mi restituisce 0 nonostante i dati siano stati inviati da modulo wifi e il tempo di attesa prima di vederli disponibili è variabile.

Non ho provato con il TraceView. Ora guardo come funziona

Grazie

Post unito: 15 Maggio 2014, 15:23:36 CEST
Ciao,

vi aggiorno sugli sviluppi nel caso qualcuno abbia lo stesso problema.

Ho messo l'apk su un cel cinese con stessa versione android e magicamente su quello funziona perfettamente tutto. Questo non so spiegarmelo
Sul Tab3 niente da fare. Sempre problemi di ricezione dati da wifi.

Qualcuno ha mai notato qualcosa di simile?
« Ultima modifica: 15 Maggio 2014, 15:23:36 CEST da fedepass, Reason: Merged DoublePost »