【问题标题】:I am confused and stuck when trying to connect to a channel using JSch or Socket?尝试使用 JSch 或 Socket 连接到频道时,我感到困惑和卡住?
【发布时间】:2017-07-09 02:12:39
【问题描述】:

所以我正在尝试连接到将要获取模拟数据的设备(Red Pitaya)。它设置了控制设备的 scpi 命令。我可以通过labview和使用腻子来控制这些。

我正在尝试编写可以访问设备 scpi 服务器并向其发送命令以完成设备的 android 应用程序。

设备的编程方式是,您首先必须使用 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);
}

}

如果有人有任何建议,将不胜感激 谢谢

【问题讨论】:

    标签: java sockets tcp server redpitaya


    【解决方案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");
            }
        });
    }
    

    }

    当使用按钮启动命令时,我注意到如果您在其中编写发送命令代码而不是单独的函数,应用程序会超时并崩溃。

    【讨论】:

    • println() 已经附加了一个行终止符。现在你有两个。 NB 异常处理的结构不正确。如果连接成功,您应该只添加侦听器。依赖于先前try 块中代码成功的代码应位于该try 块内。
    • 感谢您的建议,绝对需要这个来帮助我变得更好。
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 2018-12-05
    • 2010-09-14
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多