В моем перцовом роботе есть сервер python, и он отлично работает на машине. Я использую putty для запуска сервера и ncat для отправки моей команды, и нет никаких проблем.
В моем фрагменте Connection мне нужно создать канал для отправки команды ssh роботу для запуска сервера, а затем мне нужно создать сокет для сервера. Затем, когда я отправляю пакет для подключения сервера к приложению с помощью этой команды: {'command': '< SYS_CONNECT>'}
В ответ сервер должен отправить некоторую информацию о роботе, такую как имя, уровень заряда батареи и т. Д., Но я только что получил нулевой с сервера.
Существует приложение, используемое для запуска в Android 5.1 и несколько лет назад. Теперь я решил создать новое приложение и импортировать некоторые классы и компоненты из старого приложения.
private boolean connect(){
state = ConnectionState.CONNECTION_INIT;
for( String h : hostAdresses ){
try{
host = h;
// create socket
socket = new Socket( InetAddress.getByName(host).getHostAddress(), port );
socket.setSoTimeout(defaultReadTimeout);
in = new BufferedReader( new InputStreamReader( new BufferedInputStream(socket.getInputStream()) ) );
out = socket.getOutputStream();
// try to connect
int tries = connectionMaxTries;
while(!stop && socket != null && state == ConnectionState.CONNECTION_INIT && tries > 0) {
// send connection request
DataRequestPackage p = new DataRequestPackage(
PepperCommands.SYS_CONNECT,
new String[0]);
String data = gson.toJson(p);
// wait for data
//data = in.readLine();
try {
out.write(data.getBytes());
Log.w(TAG, "Sending data =" + data);
StringBuilder sb = new StringBuilder();
while ((data = in.readLine()) != null) {
sb.append(data);
Log.d(TAG, "loop data");
}
data = sb.toString();
} catch (Exception e) {
Log.d(TAG, "error on reading data");
}
Log.w(TAG, "Receiving data = " + data);
Log.w(TAG, "in.readLine(), data = " + in.readLine());
DataResponsePackage response = gson.fromJson(data, DataResponsePackage.class);
if( response.request.command == PepperCommands.SYS_CONNECT
&& response.requestSuccessfull){
state = ConnectionState.CONNECTION_ESTABLISHED;
notifyDataRecievedListeners(response);
return true;
}
tries--;
}
}catch(UnknownHostException e){
state = ConnectionState.CONNECTION_UNKNOWN_HOST;
Log.w(TAG, "Host unknown " + host);
MainActivity.getInstance().runOnUiThread( new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.getInstance().getApplicationContext(),
R.string.net_unknown_host, Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
state = ConnectionState.CONNECTION_ESTABLISHED_FAILED;
Log.w(TAG, "IO Exception on connnection with " + host + ":" + port);
}
}
return false;
}
Пытается запустить удаленный сервер, используя ssh.
/**
* Tries to start remote server using ssh.
* @return {@code true} if server started, {@code false} otherwise.
*/
private boolean sshServerStart(){
// show message
MainActivity.getInstance().runOnUiThread( new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.getInstance().getApplicationContext(),
R.string.net_try_server_start, Toast.LENGTH_SHORT).show();
}
});
// send command
String[] vCommands = new String[]{ SSH_COMMAND_SERVER_START };
if( sendSSHCommands( vCommands ).size() > 0 ){
// wait a few seconds for server to start
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
return true;
}
return false;
}
Подключение к серверу ssh
/**
* Connecting to ssh server
* @return {@code true} if successful connected, {@code false} otherwise.
*/
private Session connectSSH(){
for( String host : hostAdresses ){
try {
// get user information
SharedPreferences vPreferences = MainActivity.getPreferences();
String vUser = vPreferences.getString(PREFERENCES_SSH_USER, "nao");
String vPassword = vPreferences.getString(PREFERENCES_SSH_PASSWORD, "nao");
if( mUseCustomLoginData ){
vUser = mSSHUser;
vPassword = mSSHPassword;
}
// create session
Session vSession = mSSH.getSession(vUser,
InetAddress.getByName(host).getHostAddress().toString(),
22 );
vSession.setPassword( vPassword );
// avoid asking for key auth
Properties vProperties = new Properties();
vProperties.put("StrictHostKeyChecking", "no");
vSession.setConfig(vProperties);
try{
// connect to ssh server
vSession.connect();
} catch( JSchException err ){
if( err.getMessage().contains("Auth fail") ){
// ask for custom login data
if( askForCustomLoginData() ){
vSession = connectSSH();
} else {
return null;
}
} else {
System.out.println("EXCEPTION: " + err.getMessage());
err.printStackTrace();
}
}
return vSession;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (JSchException e) {
e.printStackTrace();
}
}
return null;
}
Я ожидаю от этого кода response.request.command
вернуть SYS_CONNECT
и response.requestSuccessfull
вернуть true
для этой строки, но я получил неожиданный нулевой ответ
if( response.request.command == PepperCommands.SYS_CONNECT && response.requestSuccessfull){