【发布时间】:2017-05-27 00:29:57
【问题描述】:
我有一个无线设备通过连接到我的网络的端口 22 进行通信。设备启动后,立即开始发送日志数据。一旦向该设备发送命令,它就会停止记录并做出相应的响应。这一切都有效,我已经使用 telnet 客户端对其进行了测试。
我的问题是我似乎无法在我的应用程序中正确地向它发送命令。我正在按计划读取日志数据,但是当我向它发送命令时,在本例中是命令“r”,它会继续输出日志数据,而不是它应该为该特定命令显示的内容。这必须意味着我没有正确发送命令。这是我的任务代码,它向它发送命令并将输出记录在 android logcat 中:
public class ReceiveVarTask extends AsyncTask<Void, Void, Void>{
String dstAddress;
int Port;
ReceiveVarTask(String addr, int port) {
dstAddress = addr;
Port = port;
}
protected Void doInBackground(Void... vars){
Socket socket = null;
String command = "r";
try {
Log.i(TAG, "Connecting to port 22");
socket = new Socket(dstAddress, Port);
Log.i(TAG, "Connected to port 22");
PrintWriter writer = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
writer.println(command);
String line = reader.readLine();
Log.i(TAG, line);
while(line!=null && !isCancelled()){
line = reader.readLine();
Log.i(TAG, line);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
protected void onPostExecute(Void arg) {
taskRunning = false;
}
}
我做错了什么?为什么没有注册命令?
更新:
我已经使用了几个 telnet 客户端进行测试,并且服务器正在读取一些预期的“r”命令。它使用 Windows telnet 客户端运行,它使用 Velestar 的 vSSH 应用程序运行。有趣的是,在 ClockworkMod 使用 android telnet 客户端进行测试时,服务器也没有注册该命令。
可能与编码有关吗?
我是否需要任何额外的权限才能使用套接字?我在清单中声明了 android.permission.INTERNET。
更新 2:
硬件的开发人员刚刚告诉我,硬件期望命令是 ASCII 编码并终止 CR。所以我会尝试将 PrintWrite 初始化更改为:
PrintWriter writer = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "ASCII")), true);
和打印命令:
writer.print(command+"\r");
【问题讨论】: