Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SSH从android应用程序向raspberry pi发送文件_Java_Android_Ssh_Raspberry Pi_File Transfer - Fatal编程技术网

Java 使用SSH从android应用程序向raspberry pi发送文件

Java 使用SSH从android应用程序向raspberry pi发送文件,java,android,ssh,raspberry-pi,file-transfer,Java,Android,Ssh,Raspberry Pi,File Transfer,我正在尝试通过WIFI从android应用程序向RaspberryPi发送文件 我可以连接到RPI并通过SSH发送命令 这是我用来发送ssh命令的函数: publicstaticstringexecuteemotecommand(最终字符串用户名、最终字符串密码、最终字符串主机名、最终int端口、最终文件) 抛出异常{ JSch JSch=新的JSch(); Session Session=jsch.getSession(用户名、主机名、端口); session.setPassword(密码);

我正在尝试通过WIFI从android应用程序向RaspberryPi发送文件

我可以连接到RPI并通过SSH发送命令

这是我用来发送ssh命令的函数:

publicstaticstringexecuteemotecommand(最终字符串用户名、最终字符串密码、最终字符串主机名、最终int端口、最终文件)
抛出异常{
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户名、主机名、端口);
session.setPassword(密码);
//避免要求钥匙确认
Properties prop=新属性();
道具放置(“检查”、“否”);
session.setConfig(prop);
session.connect();
//SSH通道
ChannelExec channelssh=(ChannelExec)
会话。openChannel(“exec”);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
channelssh.setOutputStream(baos);
//执行命令
channelssh.setCommand(“scp”+文件+“”+用户名+“@”+主机名+”:/home/pi/Desktop”);
channelssh.connect();
尝试{Thread.sleep(5000);}catch(异常ee){}
channelssh.disconnect();
返回bas.toString();
}
这是将要发送的SSH命令

scp /storage/emulated/0/Download/201906071017.txt pi@192.168.4.1:/home/pi/Desktop
我尝试在windows终端上运行SSH命令,它成功地上传了文件

编辑:

我在
.connect()
.disconnect()
之间添加了这段代码,以等待命令的响应,从而断开与RPi的连接

channelssh.setErrStream(System.err);
InputStream in=channelssh.getInputStream();
channelssh.connect();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
如果(i0)继续;
System.out.println(“退出状态:+channelssh.getExitStatus());
打破
}
尝试{Thread.sleep(1000);}catch(异常ee){}
}
channelssh.disconnect();
现在我在日志中被拒绝了权限,用户名和密码都是正确的

W/System.err: Permission denied, please try again.
W/System.err: Permission denied, please try again.
W/System.err: Permission denied (publickey,password).
W/System.err: lost connection
I/System.out: exit-status: 1
我做到了!! 我最终使用sftp服务上传了文件 我正在使用
ChannelSsh
ChannelExec
。我应该使用
ChannelSftp

这是工作代码

package com.example.a.sitetool;
导入android.util.Log;
导入com.jcraft.jsch.Channel;
导入com.jcraft.jsch.ChannelExec;
导入com.jcraft.jsch.ChannelSftp;
导入com.jcraft.jsch.jsch;
导入com.jcraft.jsch.Session;
导入java.io.ByteArrayOutputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.InputStream;
导入java.util.Properties;
公共类RpiUpdate{
公共静态字符串ExecuteMoteCommand(最终字符串用户名、最终字符串密码、最终字符串主机名、最终int端口、最终文件)
抛出异常{
Log.d(“MainActivity”、“Entered ExecuteMoteCommand”);
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户名、主机名、端口);
session.setPassword(密码);
//避免要求钥匙确认
Properties prop=新属性();
道具放置(“检查”、“否”);
session.setConfig(prop);
session.connect();
//SSH通道
Channel=session.openChannel(“sftp”);
channel.connect();
ChannelSftp ChannelSftp=(ChannelSftp)信道;
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
channelsftp.cd(“/home/pi/Desktop”);
channelsftp.put(新文件输入流(file),file.getName());
channelsftp.setOutputStream(baos);
//执行命令
channelsftp.put(file.getName(),“/home/pi/Desktop”);
InputStream in=channelsftp.getInputStream();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
如果(i0)继续;
System.out.println(“退出状态:+channelsftp.getExitStatus());
打破
}
尝试{Thread.sleep(1000);}catch(异常ee){}
}
通道断开();
返回bas.toString();
}
}
编辑: 我优化了代码并删除了
ByteArrayOutputStream
,因为
Channelsftp
不需要它。此更改导致返回为
void
,而不是
String
我还添加了更改输出文件权限的功能

package com.example.a.sitetool;
导入android.os.AsyncTask;
导入android.os.Environment;
导入android.util.Log;
导入com.jcraft.jsch.Channel;
导入com.jcraft.jsch.ChannelSftp;
导入com.jcraft.jsch.jsch;
导入com.jcraft.jsch.Session;
导入java.io.File;
导入java.io.FileInputStream;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.Locale;
导入java.util.Properties;
公共类RpiUpdate{
私有静态布尔成功;
公共静态无效更新(){
//TODO添加在线版本检查和下载
如果(成功)
上传文件();
}
私有静态void上传文件(){
Log.d(“RPIUpdate”,“输入的上载文件”);
成功=错误;
新建异步任务(){
@凌驾
受保护的Void doInBackground(整数…参数){
试一试{
ExecuteMoteCommand(“pi”、“rbs”、“192.168.4.1”、22);
Log.d(“MainActivity”,“上传的文件”);
成功=真实;
}捕获(例外e){
e、 printStackTrace();
Log.d(“MainActivity”,“无法上载文件”);
成功=错误;
}
回来