Я запутался и застрял при попытке подключиться к каналу с помощью JSch или Socket?
Поэтому я пытаюсь подключиться к устройству, которое будет собирать аналоговые данные (Red Pitaya). Он установил команды scpi, которые управляют устройством. Я могу контролировать их через labview и используя шпаклевку.
Я пытаюсь написать приложение для Android, которое может получить доступ к scpi-серверу устройства и отправить ему команды для завершения работы устройства.
Устройство запрограммировано таким образом, что сначала вы должны подключиться к серверу, используя SSH-соединение, что у меня не вызывает проблем с использованием JSch, оттуда вы можете отправить команду, чтобы запустить сервер scpi и открыть соединение.
Вот с этим я и борюсь, и я не понимаю, почему, когда сервер SCPI запущен, к нему обращаются через Ip устройства и порт 5000, но я не могу написать кусок кода, который подключается к это и выполняет команду SCPI. Я не уверен, является ли это соединение или способ, которым я отправил данные.
Это код
public class rp_command extends AsyncTask<Void,Void, Void> {
String ipAddress;
int port;
String response = "";
TextView textResponse;
rp_command(String address, int rp_port, TextView textResponse){
ipAddress = address;
port = rp_port;
this.textResponse = textResponse;
}
@Override
protected Void doInBackground(Void...arg0){
Socket socket = null;
try{
socket = new Socket(ipAddress, port);
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeByte(1);
out.writeUTF("DIG:PIN LED2,1");
out.flush();
} catch (UnknownHostException e){
e.printStackTrace();
response = "UnknownHostException:" + e.toString();
} catch (IOException e){
e.printStackTrace();
response = "IOException:" + e.toString();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}return null;
}
@Override
protected void onPostExecute(Void result){
textResponse.setText(response);
super.onPostExecute(result);
}
}
Если у кого-нибудь есть какие-либо советы, мы будем благодарны
1 ответ
Здесь все работает, я думаю, что проблема была в том, что команда не заканчивалась командой \r\n, находящейся в конце строки. Вот рабочий тестовый код, если кому-то интересно. Это для отправки строки, не получающей.
public class MainActivity extends AppCompatActivity {
Socket s = new Socket();
PrintWriter s_out;
BufferedReader s_in;
String out = null;
public void sendCommand (String command){
try {
s_out = new PrintWriter(s.getOutputStream(), true);
s_out.println(command);
}catch (IOException e){
System.out.println(e);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button LED_ON, LED_OFF;
LED_ON = (Button)findViewById(R.id.button);
LED_OFF = (Button)findViewById(R.id.button2);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try{
s.connect(new InetSocketAddress("192.168.0.104", 5000));
}catch (IOException e){
System.out.println(e);
}
LED_ON.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendCommand("DIG:PIN LED2,1\r\n");
}
});
LED_OFF.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendCommand("DIG:PIN LED2,0\r\n");
}
});
}
}
При использовании кнопок для запуска команды я заметил, что если вы напишите там код команды отправки, а не отдельную функцию, приложение остановится и произойдет сбой.