Autore Topic: [Bt] Se il device è accoppiato non funziona, se lo riaccoppio funziona ? Perchè?  (Letto 761 volte)

Offline carnauser

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid A1
Salve ho un problema

Ho un device che se trovato accoppiato mi ritorna socket close quando chiedo di comunicare, mentre se lo riaccoppio di nuovo funziona che è una meraviglia.

Nella fattispecie dove si blocca è qua :

Codice (Java): [Seleziona]
package mixel.blue;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import mixel.run.Menu;
import mixel.run.STMPatch;
import mixel.service.Battito;
import mixel.service.BattitoListener;

import android.bluetooth.BluetoothAdapter;
import android.util.Log;
import android.widget.Toast;


public class StreamReader extends Thread {
       
        private static InputStream mmInStream;
        private static OutputStream mmOutStream;
        private static boolean stopwhile = true;

       
       

        public static void setStopwhile() {
                StreamReader.stopwhile = false;
        }

        public StreamReader () {
               
        }
       
        public void inizialize() {
               
                // d = new StreamReader();
                // Log.w("Battito", "INIZIO COMUNICAZIONE");
                //
                // d.run();
                Log.w("DATI", "A");
                InputStream tmpIn = null;
                OutputStream tmpOut = null;

                // Get the input and output streams, using temp objects because
                // member streams are final
                try {
                        Log.w("DATI", "B");

                        tmpIn = BlueUtil.mmSocket.getInputStream();
                        Log.w("DATI", "C");
                        tmpOut = BlueUtil.mmSocket.getOutputStream();
                        Log.w("DATI", "D");
                } catch (IOException e) {

                        Log.w("DATI", "E : /n" + e);
                }
                Log.w("DATI", "F");
                mmInStream = tmpIn;
                Log.w("DATI", "G");
                mmOutStream = tmpOut;
                Log.w("DATI", "H");
        }
       
       
        public void run() {
        int packetLength = 0;
   
        Log.w("DATI-RUN","A-1");
        byte[] buffer = new byte[1024];  // buffer store for the stream
        Log.w("DATI-RUN","A-2");
        int bytes; // bytes returned from read()
        Log.w("DATI-RUN","A-3");
        int count= 4;
        // Keep listening to the InputStream until an exception occurs
        byte lastbyte = 0x00;
                byte currentByte = 0x00;
                byte[] packetBuffer = new byte[ Patch.MAX_PACKET_SIZE ];
                byte[] packetBytes;
        try {
                Log.w("DATI-RUN","C-1");
                mmOutStream.write( Patch.STARTPACKET_V2 );
                Log.w("DATI-RUN","C-2");
                mmOutStream.flush();
                Log.w("DATI-RUN","C-3");
                } catch (IOException e1) {
                       
                        //BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
               
                        Battito.getInstance().setConnected(true);
                        Log.w("DATI-RUN","C-4" +e1);
                }
               
                int cazz = 0;
        while (stopwhile) {
                try {
                        //Log.w("DATI-RUN","C-5-"+ mmInStream.available());
                                currentByte = (byte) mmInStream.read();
//                              Log.w("DATI-RUN","C-5- dialogo!");
                        } catch (IOException e) {
//                              Log.w("DATI-RUN","C-6");
                                break;
                        }
//                      if (currentByte == Patch.STARTBYTE ){
//                      Log.w("DATI-RUN",cazz+ "=========================================================");
//                      }
//                      Log.w("DATI-RUN",cazz+ " -current : " + Integer.toHexString( currentByte & 0xff ));
//                      Log.w("DATI-RUN",cazz+ " -last : " + Integer.toHexString(lastbyte& 0xff ));
//                      if (currentByte == Patch.STARTBYTE ){
//                              Log.w("DATI-RUN",cazz+ "=========================================================");
//                      }
                       
                       
                        if( currentByte == Patch.STARTBYTE && lastbyte == Patch.STOPBYTE ) {
                                // Close previous packet
                                packetBytes = new byte[packetLength];
//                              Log.w("DATI-RUN",cazz+ "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                                System.arraycopy(packetBuffer, 0, packetBytes, 0, packetLength);
//                              Log.w("DATI-RUN","C-9");
                                new Packet( packetBytes );
//                              Log.w("DATI-RUN",cazz+ "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                                // Open New Packet
                                packetLength = 0;
//                              Log.w("DATI-RUN","C-11");
                        }

                        if( packetLength < Patch.MAX_PACKET_SIZE ) {
//                              Log.w("DATI-RUN","C-12");
                                packetBuffer[ packetLength ] = currentByte;
//                              Log.w("DATI-RUN","C-13");
                                packetLength++;
//                              Log.w("DATI-RUN","C-14");
                        }

                        lastbyte = currentByte;
                //      cazz++;
                       
                        try {
                                Thread.sleep(30);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                Log.w("DATI-RUN",e );
                        }
                        }
    }

}


   Log.w("DATI-RUN","C-4" +e1);  ritorna socket close...


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
Dallo spezzone di codice riesco a fare un'ipotesi.

Secondo me è dovuto al fatto che tu quando crei il thread, prima usi initialize() e subito dopo run(). Per cui il thread parte (con run) prima ancora che initialize abbia finito di aprire i socket (poichè implica un handshaking col device esterno, nella scala temporale del processore ci mette una vita). Nella BluetoothChat degli esempi Google il socket veniva creato nel thread stesso e non si procedeva sino a che non era terminata la richiesta.

Potrebbe essere la causa?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline carnauser

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid A1
Ho accodato tutto ma non cambia il risultato.
In pratica se io ho accoppio il device nell'apps funziona.
Se il device è già accoppiato niente, non va.
ho messo anche dei tempi di attesa astronomici ma non cambia nulla.
Non riesco proprio a capire.