更新: 谢谢你的想法。我调试了这个问题,我相信android到ESP8266之间的连接。我相信ESP可能会发生一些事情,因为当我将android连接到我的电脑时,它似乎连接并且运行良好。有一些非常小的延迟,但没有像它连接到ESP时。因此我认为ESP正在造成延误。话虽如此,我不确定是什么原因引起的。我曾尝试使用Arduino IDE 1.6.8中的库的ESP8266 2.3.0版本,但似乎无法弄清楚延迟的原因。我确实将Android应用程序连接到我的内部路由器,然后发送到PC没有任何问题。然而,它似乎与ESP无关。我无法相信我是唯一一个看到这个......如果其他人有这个工作,请告诉我你是怎么做到的。我永远的感激是你的。
这是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 Debugger来测试代码。
有什么东西我做得不对吗?或者是否有更好的实现设备之间的即时通信?
感谢您的帮助!
Android设备: 三星Note 4 - v5.1.1 Android v2.0
Android Studio
ESP设备: ESP8266使用Arduino Studio 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 :(得分:0)
我认为任何人都无法确定问题所在。 为了防止你(和其他人)追逐鬼魂,你真的想要分解你的问题:
这样可以将问题分开,直到找到根本原因:)
答案 1 :(得分:0)
当我想将一些数据传输到接入点 Esp8266-01 时,我遇到了这个问题。我认为发生这种延迟是因为 if (client. available())
内的 while (client.connected())
循环等待接收数据,直到客户端可用。因此,延迟了(正好是我 5 秒)。为了避免这种令人不快的行为,我在 android MainActivity.java 文件的 AsyncTask 的 write 命令中附加了一个回车 '\r'
然后修改了 Arduino 草图以等待服务器收到回车,我的意思是一些像这样的代码 {{ 1}}
最后,Android 应用程序中称为 btn1 和 btn2 的两个按钮分别发送两个字符串 String request = client.readStringUntil('\r');
和 /led/on
。现在 ESP8266 收到回车并立即刷新客户端,然后执行程序的其他部分没有延迟。
以下程序根据 Android 应用程序中按下的按钮打开或关闭一个 LED(ESP8266-01 的 GPIO 0 引脚)。但不要忘记在编程时设置 ESP8266-01 的接地 GPIO 0 并且不要忘记先将移动 wifi 连接到 ESP wifi 网络,但您也可以使用 wifi 配置自动连接到 ESP wifi(请参阅此{{ 3}}).
Arduino 代码:
/led/off
清单 XML:
#include<ESP8266WiFi.h>
// WiFi Definitions
const char* ssid = "Esp8266TestNet";
const char* password = "Esp8266Test"; // has to be longer than 7 chars
const char* value = "";
int ledPin = 0; // GPIO 0
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH); // turn on
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password, 1, false);
server.begin();
}
void loop() {
// Check of client has connected
WiFiClient client = server.available();
if(!client) {
return;
}
// Read the request line
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match request
if(request.indexOf("/led/on") != -1) {
digitalWrite(ledPin, HIGH);
value = "on";
} else if (request.indexOf("/led/off") != -1) {
digitalWrite(ledPin, LOW);
value = "off";
}
else {
Serial.println("not validate");
}
client.flush();
// JSON response
String s = "HTTP/1.1 200 OK\r\n";
s += "Content-Type: application/json\r\n\r\n";
s += "{\"data\":{\"message\":\"success\",\"value\":\"";
s += value;
s += "\"}}\r\n";
s += "\n";
// Send the response to the client
client.print(s);
delay(1);
Serial.println("Client disconnected");
// The client will actually be disconnected when the function returns and the client object is destroyed
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myhgrtest">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn1"
android:text="btn1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
></Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn2"
android:text="btn2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
></Button>
</androidx.constraintlayout.widget.ConstraintLayout>