2017-02-19 23 views
1

所以我試圖連接到將要獲取模擬數據(紅火龍果)的設備。它已經設置了控制設備的scpi命令。我可以通過labview和使用膩子來控制這些。嘗試使用JSch或Socket連接到頻道時,我感到困惑和困惑?

我想寫和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); 
} 

}

如果任何人有這將不勝感激 感謝

任何意見

回答

0

得到它的工作在這裏,我相信這個問題是由於沒有結束命令\ 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