2012-06-06 32 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上通信,所以我有错误的端口这个事实肯定是问题的根源。无论如何,谢谢你的建议。