我目前正在開發Android應用程序,以便與我的僱主鏈接到現有產品中。該系統是一個運行固件的設備,可通過串行,以太網或Wi-Fi使用.NET Windows程序,直接串行通信或控制網頁進行控制。 Android應用旨在自動連接控制網頁,以便設備可通過手機進行控制,無需任何人員手動查找IP地址。爲了做到這一點,我需要能夠找到IP地址並確定地址是否與這些固件設備中的一個相對應。Android TCP/IP套接字通信無法返回數據
本質上,我想要做的是運行Android所見的所有IP地址,並將每個IP地址發送給上述方法。這件事應該使用固件命令對地址進行ping操作,並查看發回的內容以確定地址是否與固件設備相對應。目前我一直在發送類似「HOME」或「GETINFO」的命令(當然是正確格式化固件),並比較是否有任何內容被髮送回預期響應。像家一樣的命令也有引起物理響應的好處,所以我們知道如果沒有微芯片調試器,至少是否收到命令。
就目前而言,我擁有硬編碼的正確地址併發送給此方法。我知道應用程序可以使用與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;
感謝您的幫助,您可以給,我真的很感激!
您正在將單個字符串傳遞給socket()。 – starbolin
創建它之後,您應該可以在套接字上調用isReachable()。如果地址不可路由,則無法繼續。 – starbolin