我目前正在开发一个 Android 应用程序,以便为我的雇主链接到现有产品。该系统是运行固件的设备,可使用 .NET Windows 程序、直接串行通信或控制网页通过串行、以太网或 wi-fi 进行控制。Android 应用程序旨在自动连接控制网页,以便可以通过手机控制设备,而无需任何人手动查找 IP 地址。为此,我需要能够找到 IP 地址并确定该地址是否对应于这些固件设备之一。
本质上,我想要做的是遍历 Android 看到的所有 IP 地址,并将每个 IP 地址发送到上述方法。这个东西应该用固件命令ping地址,看看发回了什么来确定地址是否对应于固件设备。目前,我一直在通过发送诸如“HOME”或“GETINFO”之类的命令(当然,为固件正确格式化)并比较发送回的内容与预期的响应。像 home 这样的命令还具有引起物理响应的好处,因此我们无需微芯片调试器就知道是否至少收到了命令。
就目前而言,我将正确的地址硬编码并发送到此方法。我知道该应用程序可以使用与 URL 相同的地址成功加载网页控件,因此它必须正确且连接必须良好,但无法直接与设备通信。没有观察到物理响应,也没有发回任何信息——输入流只是超时并返回 -1。让我非常难过的是,据我所知,我发送信息的方式与 .NET Windows 控件完全相同,但它不起作用。
进一步说明:我知道将 IP 地址字符串作为主机名发送到套接字构造函数可能不起作用,但由于没有抛出 UnknownHostException,我知道套接字可以将其解析为 IP 地址。正确的?
我的代码如下:
private class NetworkTask extends AsyncTask<String, Boolean, Boolean> {
protected Boolean doInBackground(String... addr){
try {
String message = "<FHGETHUBINFO>";
byte[] input = new byte[8];
//addr is an array of string parameters containing a single IP address string. E.g. addr[0]=”192.168.199.108”
Socket s = new Socket(addr[0],80);
//outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
out.write(message.getBytes());
Log.v(TAG, "output sent. Waiting for input.");
InputStream in = s.getInputStream();
//Skip the exclamation mark and newline. Verified that nothing is received even without a skip.
in.skip(2);
int numBytes = in.read(input,0,8);
Log.v(TAG, "Input received: "+numBytes);
String st = input.toString();
//Close connection
s.close();
if(st != "HUB INFO"){
return true;
}
else{
return false;
}
}
catch (UnknownHostException e) {
Log.v(TAG,"UnknownHostException: "+e.getMessage());
e.printStackTrace();
}
catch (IOException e) {
Log.v(TAG,"IOException: "+e.getMessage());
e.printStackTrace();
}
return false;
感谢您提供的任何帮助,我真的很感激!