How to reuse an SSH session (Jsch) created in AsyncTask in another class

I am new to Android and Java, and here is my situation:

I am trying to create an application that connects to Beaglebone Black using an ssh connection and then controls some peripherals connected to the BBB by issuing commands coming from an Android device. I open (successfully) an ssh session in AsyncTask, while the user sees the splash screen, if the connection was successful, the user will receive confirmation, and then will be able to send predefined commands by clicking on some available buttons.

What I want to do next is to leave the session open, and then create a new channel (exec or shell) every time I want to issue a command and wait for a response from BBB, but I don’t know how to reuse such an ssh session outside of AsynkTask.

what is even possible?

I am using Android Studio 0.8.2 and Jsch 0.1.51, my code is as follows:

public class SplashScreen extends ActionBarActivity {

public static final int segundos =10;
public static final int milisegundos =segundos*1000;
public static  final int delay=2;
private ProgressBar pbprogreso;
@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    pbprogreso= (ProgressBar)findViewById(R.id.pbprogreso);
    pbprogreso.setMax(maximo_progreso());
    empezaranimacion();
}

public void empezaranimacion()
{
    sshConnect task = new sshConnect();
    task.execute(new String[] {"http:"});

    new CountDownTimer(milisegundos,1000)

    {
        @Override
    public void onTick(long milisUntilFinished){
            pbprogreso.setProgress(establecer_progreso(milisUntilFinished));
        }
       @Override
    public void onFinish(){
           finish();
       }
    }.start();

}
public  int establecer_progreso (long miliseconds)
{
    return (int)((milisegundos-miliseconds)/1000);
}

public int maximo_progreso () {
    return segundos-delay;
}

public class sshConnect extends AsyncTask <String, Void, String>{
    ByteArrayOutputStream Baos=new ByteArrayOutputStream();
    ByteArrayInputStream Bais = new ByteArrayInputStream(new byte[1000]);
    @Override
    protected String doInBackground(String... data) {

        String host = "xxxxxxx";
        String user = "root";
        String pwd = "";
        int port = 22;
        JSch jsch = new JSch();
        try {
            Session session = jsch.getSession(user, host, port);
            session.setPassword(pwd);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            ChannelExec channel = (ChannelExec)session.openChannel("exec");
            channel.setOutputStream(Baos);
            channel.setInputStream(Bais);
            //Run Command
            channel.setCommand("python ~/BBB_test/testconnect.py");
            channel.connect();
            try{Thread.sleep(3500);}catch (Exception ee){}
            channel.disconnect();
            //session.disconnect();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        return Baos.toString();
    }
    @Override
    protected void onPostExecute(String result) {
        if (result.equals("Connected to BBB Baby!!\n")) {
            Intent nuevofrom = new Intent(SplashScreen.this, Principal.class);
            startActivity(nuevofrom);
            finish();
        } else {
            Intent newfrom = new Intent(SplashScreen.this, ConnecError.class);
            startActivity(newfrom);
            finish();

        }
    }
}

// Here I want to reuse an open session and create a new channel

public class sendCommand extends AsyncTask <String, Void, String >{
    ByteArrayOutputStream Baosc=new ByteArrayOutputStream();
    ByteArrayInputStream Baisc = new ByteArrayInputStream(new byte[1000])

    protected String doInBackground (String... command){
        try {
            ChannelExec channel2 = (ChannelExec)session.openChannel("exec");
            channel2.setOutputStream(Baosc);
            channel2.setInputStream(Baisc);
            //Run Command
            channel2.setCommand("python ~/BBB_test/testgpio.py");
            channel2.connect();
            try{Thread.sleep(3500);}catch (Exception ee){}
            channel2.disconnect();


        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return  Baosc.toString();
    }
    protected void onPostExecute(Long result) {
        TextView txt = (TextView) findViewById(R.id.infotext);
        txt.setText(result);

    }

}

If anything else is needed let me know! (this is the first time I ask something on the forum)

Thanks so much for your time and support!

+4
source share
2 answers

, , DamienKnight Asynktask. , :

public static class cSession {
        String host = "xxx.xxx.xxx.xxx";
        String user = "root";
        String pwd = "";
        int port = 22;
        JSch jsch = new JSch();
        public Session Met1 (){
            try {
                session = jsch.getSession(user, host, port);
                session.setPassword(pwd);
                session.setConfig("StrictHostKeyChecking", "no");
            } catch (Exception e2){
                System.out.println(e2.getMessage());
            }return session;
        }
        public Session damesession (){
            return session;
        }
        public void close_ses(){
            session.disconnect();
        }
    }

, , Jsch.

public class sshConnect extends AsyncTask <String, Void, String>{
        ByteArrayOutputStream Baos=new ByteArrayOutputStream();
        ByteArrayInputStream Bais = new ByteArrayInputStream(new byte[1000]);


        @Override
        protected String doInBackground(String... data) {
            cSession jschses = new cSession();
            Session ses =null;
            ses = jschses.Met1();
            try {
                ses.connect();
                ChannelExec channel = (ChannelExec)ses.openChannel("exec");
                channel.setOutputStream(Baos);
                channel.setInputStream(Bais);
                //Run Command
                channel.setCommand("python ~/BBB_test/testconnect.py");
                channel.connect();
                try{Thread.sleep(3500);}catch (Exception ee){}
                channel.disconnect();
                //session.disconnect();
            }catch (Exception e){
                System.out.println(e.getMessage());
            }
            return Baos.toString();

        }

@Damienknight!

+1

, . , . .

. H - JCraft.

  Channel channel=session.openChannel("shell");

  channel.setInputStream(System.in);
  channel.setOutputStream(System.out);

  channel.connect();
0

All Articles