2012-06-06 33 views
0

我目前正在開發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; 

感謝您的幫助,您可以給,我真的很感激!

+0

您正在將單個字符串傳遞給socket()。 – starbolin

+0

創建它之後,您應該可以在套接字上調用isReachable()。如果地址不可路由,則無法繼續。 – starbolin

回答

0

同意我應該在套接字上調用isReachable僅用於驗證目的,所以感謝提示!但事實證明,問題在於設備沒有在端口80上通信,所以我有錯誤的端口這個事實肯定是問題的根源。無論如何,謝謝你的建議。