obd-java-api icon indicating copy to clipboard operation
obd-java-api copied to clipboard

Slow speed after connection to socket

Open Odmink0 opened this issue 8 years ago • 0 comments

Hello. First of all: thank you for obd-java-api!

I trying to develop own OBDII trouble codes scanner app for Android phones. For connection and reading data i use this obd-java-api. For testing i use software OBDsim on my laptop and ELM327 Mini(small blue dongle) on my car.

Connection and TroubleCodesCommand run wery well on OBDsim. But when i trying to connect to my car i got fail: after opening a BT socket, obd-api run at very-very-very slow speed and can execute ObdResetCommand 2-3 minutes. At that time app Torque Lite on same ELM and same car connect fast and read trouble codes successfully.

My code `import android.app.Application; import android.app.ProgressDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothSocket; import android.content.Context; import android.content.res.Resources; import android.os.AsyncTask; import android.os.Process; import android.support.design.widget.Snackbar; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast;

import com.github.pires.obd.commands.control.TroubleCodesCommand; import com.github.pires.obd.commands.protocol.AdaptiveTimingCommand; import com.github.pires.obd.commands.protocol.EchoOffCommand; import com.github.pires.obd.commands.protocol.HeadersOffCommand; import com.github.pires.obd.commands.protocol.LineFeedOffCommand; import com.github.pires.obd.commands.protocol.ObdResetCommand; import com.github.pires.obd.commands.protocol.SelectProtocolCommand; import com.github.pires.obd.commands.protocol.SpacesOffCommand; import com.github.pires.obd.commands.protocol.TimeoutCommand; import com.github.pires.obd.enums.ObdProtocols; import com.github.pires.obd.exceptions.NoDataException; //import com.github.pires.obd.reader.io.BluetoothManager;

import java.io.IOException; import java.net.Socket; import java.util.UUID;

import static android.os.Process.THREAD_PRIORITY_BACKGROUND; import static android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE;

public class BTConnection { UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); private static final String TAG = "Activity"; private BluetoothSocket mmSocket; private BluetoothDevice mmDevice; private Context context;

String result="";
TextView debug, tempdebug;
Button elmbtn;
ProgressBar elmprogress;
EditText input;
LinearLayout resultlayout;
TextView alldtc;

public BTConnection(Context context){
    this.context = context;

    resultlayout = (LinearLayout)((OActivity)context).findViewById(R.id.dtcoutput);
    debug = (TextView)((OActivity)context).findViewById(R.id.debugview);        
    debug.setText("Debug ON");

    elmbtn = (Button)((OActivity)context).findViewById(R.id.elmbtn);
    elmprogress = (ProgressBar) ((OActivity)context).findViewById(R.id.pbar);
    input = (EditText)((OActivity)context).findViewById(R.id.input_code);
    alldtc = (TextView)((OActivity)context).findViewById(R.id.dtccounter);
    //resultlayout.removeAllViewsInLayout();
    // resultlayout.setVisibility(View.GONE);
}


public class ConnectThread extends AsyncTask<BluetoothDevice, String, String> {

    protected void onPreExecute(){
        elmprogress.setProgress(0);
        elmbtn.setEnabled(false);
        resultlayout.removeAllViewsInLayout();
        alldtc.setText(context.getResources().getString(R.string.currentdtcelm));
    }
    protected String doInBackground(BluetoothDevice... device) {            
        Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE);
        
        Log.d(TAG,"Start connection Thread");
        
        synchronized (this) {
            BluetoothSocket tmp = null;
            mmDevice = device[0];

            try {
                // Get a BluetoothSocket to connect with the given BluetoothDevice.
                // MY_UUID is the app's UUID string, also used in the server code.
                tmp = device[0].createRfcommSocketToServiceRecord(MY_UUID);
                Log.d(TAG, "Create socket from UUID success");
                publishProgress("Create socket from UUID success");

                //debug.setText("Create socket from UUID success");
            } catch (IOException e) {
                Log.e(TAG, "Socket's create() method failed", e);
                publishProgress("Create socket from UUID failed");
            }
            mmSocket = tmp;

            final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            mBluetoothAdapter.cancelDiscovery();

            Log.d(TAG, "Cancel discovery");
            publishProgress("Cancel discovery");
            try {                    
                mmSocket.connect();
                Log.d(TAG, "Connect socket from UUID success");
                publishProgress("Connect socket from UUID success");
                ResetOBD();
                publishProgress("Reset OBD success");
                EchoOFF();
                EchoOFF();
                publishProgress("Echo OFF OBD success");
                LineFeedOFF();
                publishProgress("LineFeedOFF OBD success");
                SpacesOFF();
                HeadersOff();
                AdaptiveTiming();
                //SetTimeout();
                //publishProgress("Set timeout success");
                OBDSetProtocolAuto();
                publishProgress("Set OBD protocols auto success");
                result = ReadTroubleCodes();
                publishProgress(context.getString(R.string.text_field));

            } catch (IOException connectException) {
                // Unable to connect; close the socket and return.
                try {
                    mmSocket.close();
                } catch (IOException closeException) {
                    Log.d(TAG, "Could not close the client socket", closeException);
                    publishProgress("Could not close the client socket");
                }
            }

        }
        return result;
    }

    protected void onProgressUpdate(String... progress) {
        //debug.setText(debug.getText()+"\n"+progress[0]);
        elmprogress.incrementProgressBy(1);
        input.setHint(progress[0]);
    }

    protected void onPostExecute(String result) {
        try {                
            mmSocket.close();
            elmprogress.incrementProgressBy(1);
            Log.d(TAG,"Close socket from UUID success");
            //debug.setText(debug.getText()+"\n"+"Close socket from UUID success");
        } catch (IOException e) {
            Log.e(TAG, "Could not close the client socket", e);
            //debug.setText(debug.getText()+"\n"+"Could not close the client socket");
        }
        Toast.makeText(context, result, Toast.LENGTH_LONG).show();
        elmbtn.setEnabled(true);                        
    }

    public void ResetOBD(){
        try {
            new ObdResetCommand().run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"Reset OBD success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }

    }

    public void EchoOFF(){
        try {
            new EchoOffCommand().run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"Echo OFF OBD success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }

    }

    public void LineFeedOFF(){
        try {
            new LineFeedOffCommand().run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"Line Feed OFF OBD success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
    }

    public void SetTimeout(){
        try {
            new TimeoutCommand(125).run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"Set timeouts success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
    }

    public void OBDSetProtocolAuto(){
        try {
            new SelectProtocolCommand(ObdProtocols.AUTO).run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"Set OBD protocol to AUTO success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
    }

    public void SpacesOFF(){
        try {
            new SpacesOffCommand().run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"SpacesOFF success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
    }

    public void HeadersOff(){
        try {
            new HeadersOffCommand().run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"HeadersOff success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
    }

    public void AdaptiveTiming(){
        try {
            new AdaptiveTimingCommand(1).run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            Log.d(TAG,"AdaptiveTiming success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
    }

    public String ReadTroubleCodes(){
        String troublecodes = "";
        try {
            ModifiedTroubleCodesObdCommand tcoc = new ModifiedTroubleCodesObdCommand();
            tcoc.run(mmSocket.getInputStream(), mmSocket.getOutputStream());
            troublecodes = tcoc.getFormattedResult();
            Log.d(TAG,"Read OBD trouble codes success");
        }
        catch (IOException e){
            e.printStackTrace();
            Log.d("DTCIOERR", e.getMessage());
        }
        catch (InterruptedException e) {
            e.printStackTrace();
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
        catch (NoDataException e) {
            e.printStackTrace();
            troublecodes = " --- ";
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
        catch (StringIndexOutOfBoundsException e) {
            e.printStackTrace();
            troublecodes = " --- ";
            Log.d("DTCERR", e.getMessage());
            //mHandler.obtainMessage(OBD_COMMAND_FAILURE_IE).sendToTarget();
        }
        return troublecodes;
    }
    public class ModifiedTroubleCodesObdCommand extends TroubleCodesCommand {
        @Override
        public String getResult() {
            // remove unwanted response from output since this results in erroneous error codes
            return rawData.replace("SEARCHING...", "").replace("NODATA", "");
        }
    }
}

} `

I call it from another class by execute `BTConnection.ConnectThread elm = new BTConnection(this).new ConnectThread();

Log.d(TAG,"Create elm as child success");

elm.execute(device);

Log.d(TAG,"Run elm Async success");`

OBDsim software can record logs and i collect AT commands from Torque and obd-java-api. Difference in usage of space between AT and commands.

Torque log:

`ATZ ELM327 v1.3a OBDGPSLogger

ATE0 OK ATE0 OK ATM0 ?`

And log from my app with obd-java-api:

`AT Z ELM327 v1.3a OBDGPSLogger

AT E0 OK AT E0 OK`

My issue: i can't send commands and receive result using ELM327 Mini and obd-java-api.

P.S.: sorry for my english.

Odmink0 avatar Feb 14 '17 16:02 Odmink0