2016-07-04 37 views
0

更新: 谢谢你的想法。我已经调试了我相信到android到ESP8266之间的连接的问题。我相信ESP有可能会发生什么事情,因为当我将android连接到我的电脑时,它似乎连接并工作良好。有一些非常小的延迟,但没有像连接到ESP那样。因此,我认为ESP正在造成延迟。这是说我不知道​​什么可能导致这一点。我曾尝试在Arduino IDE 1.6.8中使用ESP8266 2.3.0版本的库,但似乎无法弄清楚为什么会出现延迟。我没有将android应用程序连接到我的内部路由器,然后发送到PC,没有问题。但是它似乎不适用于ESP。我不能相信我是唯一一个看到这个......如果其他人有这个工作,请让我知道你是如何做到的。我永恒的感激之情就是你的。Android Java套接字延迟发送数据

下面是ESP的Arduino代码:

WiFiServer server(2390); // TCP/IP 
SoftwareSerial mySerial(4, 5); // RX, TX 
void setup() 
{ 
    Serial.begin(115200); 
    WiFi.mode(WIFI_STA); 
    WiFi.softAP("mySSID", "myPASS"); 

    server.begin();// START TCP/IP SERVER 
} 
WiFiClient client; 
void loop() 
{ 
    if (client) 
    { 
     while (client.connected()) 
     { 
      if (client.available()) 
      { 
       char command = client.read(); 
       Serial.println(itoa(command,buffer,10)); 
      } 
     } 
    } 
    else 
    { 
     client = server.available(); 
    } 
} 

我试图采用了android(Java)和ESP8266之间的TCP/IP套接字来获得几乎瞬时的通信。我看到的问题是,当我按下按钮到android实际发送数据时,会出现明显的延迟。当我点击Go按钮时,它似乎有时发送正确,但在第一次发送后不会发送5-10秒。当它卡住时,我点击Go按钮多次,在延迟之后,他们似乎立即发送或开始发送。我查看了Android Studio中的网络监视器,从点击按钮直到流量显示在“监视器”选项卡中的网络面板上,延迟时间就会显现。

我正在使用Android Studio调试器来测试代码。

有没有什么我不正确的做法?或者,对于设备之间的即时通信有更好的实现吗?

感谢您提前给予的帮助!

Android设备: 三星注4 - V5.1.1安卓2.0

Android Studio中

ESP设备: ESP8266使用Arduino的工作室1.6.8

这里是我的代码:

public class MainActivity extends AppCompatActivity 
{ 
    private Socket socket; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void onClick(View view) 
    { 
     try 
     { 
      new AsyncTaskRunner().execute(""); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    private class AsyncTaskRunner extends AsyncTask<String, String, String> 
    { 
     private String resp; 
     ProgressDialog progressDialog; 

     @Override 
     protected String doInBackground(String... params) 
     { 
      try 
      { 
       DataOutputStream dataOut; 
       Socket s = new Socket("192.168.4.1", 2390); 

       dataOut=new DataOutputStream(s.getOutputStream()); 
       byte[] outputData = new byte[9]; 
       outputData[0] = 1; 
       outputData[1] = 2; 
       outputData[2] = 3; 
       outputData[3] = 4; 
       outputData[4] = 5; 
       outputData[5] = 6; 
       outputData[6] = 7; 
       outputData[7] = 8; 
       outputData[8] = 9; 
       dataOut.write(outputData); // Red 
       dataOut.flush(); 
       dataOut.close(); 
       s.close(); 
      } 
      catch (UnknownHostException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      return resp; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
     } 

     @Override 
     protected void onProgressUpdate(String... text) { 
     } 
    } 
} 

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.jered.networktest.MainActivity"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Go" 
     android:onClick="onClick"/> 

</RelativeLayout> 
+0

Android的代码看起来很好划分您的问题。可能是服务器代码的问题。 – njzk2

+0

AsyncTask可能会导致添加问题。尝试使用线程和处理程序 –

+1

每次您要发送消息时都要进行套接字连接,为什么不考虑在“Intent服务”中创建套接字连接并保持活动状态直到您明确关闭连接。 –

回答

0

我不认为任何人都可以肯定地说问题出在哪里。 为了防止你(及其他)从追鬼,你真的想分手了你的问题:

  • 确保您的“doInBackground”不延迟,例如通过登录到Android日志记录系统,控制台,调试器,或在UI中做一些简单的事情。
  • 确保在Android端的发送不会延迟,例如在微软写一个微小的监听器。 Java,并在PC上运行它。
  • 通过在Java中创建一个微小的发件人并在PC上运行它,确保不会延迟收听。

这样,直到你找到问题的根源:)