2017-02-19 2 views
1

그래서 아날로그 데이터 (Red Pitaya)를 취득 할 장치에 연결하려고합니다. 장치를 제어하는 ​​scpi 명령을 설정합니다. 나는 labview와 퍼티를 사용하여 이것을 제어 할 수 있습니다.JSch 또는 Socket을 사용하여 채널에 연결할 때 혼란 스럽거나 혼란 스럽습니까?

디바이스 scpi 서버에 액세스 할 수있는 앤드 로이드 애플리케이션을 작성하고 디바이스에 대한 명령을 보내면 완료됩니다.

장치는 처음에는 JSch를 사용하여 문제가없는 SSH 연결을 사용하여 서버에 연결해야한다는 점에서 프로그래밍되었습니다. 거기에서 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); 
} 

}입니다

사람이 감사

을 주시면 감사하겠습니다 어떤 조언이있는 경우

답변

0

가 여기서 일하는 당함 내가 문제가 명령을 종료하지 때문 믿는다 with \ 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"); 
     } 
    }); 
} 

}

난 당신이 별도의 기능을 대신 거기에 send 명령 코드를 작성하는 경우 응용 프로그램이 타임 아웃과 충돌 할 것으로 나타났습니다 명령을 시작하는 버튼을 사용하여.

+0

'println()'은 이미 행 종결자를 추가합니다. 이제는 두 가지가 있습니다. 주의 예외 처리가 잘못 구성되었습니다. 연결이 성공한 경우에만 리스너를 추가해야합니다. 이전의'try' 블록에서 코드 성공에 의존하는 코드는'try' 블록 안에 있어야합니다. – EJP

+0

조언 해 주셔서 감사합니다. – RedP