gpt4 book ai didi

session - 如何在另一个类中重用在 AsyncTask 中创建的 SSH (Jsch) session

转载 作者:行者123 更新时间:2023-12-02 10:29:14 25 4
gpt4 key购买 nike

我是 Android 和 Java 新手,这是我的情况:

我正在尝试创建一个应用程序,该应用程序使用 ssh 连接连接到 Beaglebone Black,然后通过发出来自 Android 设备的命令来控制连接到 BBB 的一些外围设备。我正在 AsyncTask 中(成功)打开 ssh session ,同时用户看到启动屏幕,如果连接成功,用户将得到确认,然后能够通过单击一些可用按钮发送预定义的命令。

接下来我想做的是保持 session 打开,然后每次我想发出命令并等待 BBB 的响应时创建一个新 channel (exec 或 shell),但我不知道如何在 AsynkTask 之外重用此类 ssh session 。

这可能吗?

我使用的是Android Studio 0.8.2和Jsch 0.1.51,我的代码如下:

公共(public)类 SplashScreen 扩展了 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();

}
}
}

//这里是我想重用打开的 session 并创建新 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);

}

}

如果还需要什么,请告诉我! (这是我第一次在论坛上提问)

非常感谢您的时间和支持!

最佳答案

通过使用 DamienKnight 的建议,我成功地得到了我想要的东西,即在 Asynktask 类之外创建 session 。我创建了一个公共(public)类,其中包含三种方法来创建、返回和断开 session :

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();
}
}

通过这样做, channel 的创建很灵活,我也可以使用 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!

问候

关于session - 如何在另一个类中重用在 AsyncTask 中创建的 SSH (Jsch) session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com