在收到esp8266的响应时意外结束流改造

时间:2017-04-18 21:35:14

标签: android arduino retrofit esp8266

Arduino代码是:

#define ASCII_0 48
#define ESP8266 Serial3

String SSID = "baghairat";
String PASSWORD = "abc12345";
int packet_len;
char *pb;

int LED = 13;

boolean FAIL_8266 = false;

String strHTML1 = "<!doctype html>\
<html>\
<body>\
";

String strHTML2 = "</body>\
</html>";

//String strHTML = "arduino-er.blogspot.com";

#define BUFFER_SIZE 128
char buffer[BUFFER_SIZE];

void setup() {
pinMode(LED, OUTPUT);

digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);
delay(300);
digitalWrite(LED, HIGH);
delay(200);
digitalWrite(LED, LOW);

do{
Serial.begin(115200);
ESP8266.begin(115200);

//Wait Serial Monitor to start
while(!Serial);
Serial.println("--- Start ---");

ESP8266.println("AT+RST");
delay(1000);
if(ESP8266.find("ready"))
{
  Serial.println("Module is ready");

  ESP8266.println("AT+GMR");
  delay(1000);
  clearESP8266SerialBuffer();

  ESP8266.println("AT+CWMODE=1");
  delay(2000);

  //Quit existing AP, for demo
  Serial.println("Quit AP");
  ESP8266.println("AT+CWQAP");
  delay(1000);

  clearESP8266SerialBuffer();
  if(cwJoinAP())
  {
    Serial.println("CWJAP Success");
    FAIL_8266 = false;

    delay(3000);
    clearESP8266SerialBuffer();
    //Get and display my IP
    sendESP8266Cmdln("AT+CIFSR", 1000);  
    //Set multi connections
    sendESP8266Cmdln("AT+CIPMUX=1", 1000);
    //Setup web server on port 80
    sendESP8266Cmdln("AT+CIPSERVER=1,80",1000);

    Serial.println("Server setup finish");
  }else{
    Serial.println("CWJAP Fail");
    delay(500);
    FAIL_8266 = true;
  }
 }else{
  Serial.println("Module have no response.");
  delay(500);
  FAIL_8266 = true;
}
}while(FAIL_8266);

digitalWrite(LED, HIGH);

//set timeout duration ESP8266.readBytesUntil
ESP8266.setTimeout(1000);
}

void loop(){
int connectionId;

if(ESP8266.readBytesUntil('\n', buffer, BUFFER_SIZE)>0)
{
Serial.println("Something received");
Serial.println(buffer);
if(strncmp(buffer, "+IPD,", 5)==0){
  Serial.println("+IPD, found");
  sscanf(buffer+5, "%d,%d", &connectionId, &packet_len);
  if (packet_len > 0) {
  pb = buffer+5;
  while(*pb!=':') pb++;
  pb++;

  if (strncmp(pb, "GET /on", 7) == 0) {
  Serial.println("connectionId: " + String(connectionId));
  delay(1000);
  clearESP8266SerialBuffer();

  //  sendHTTPResponse(connectionId, strHTML1);
  sendHTTPResponse(connectionId, "{\"message\":true}");
  //sendHTTPResponse(connectionId, strHTML2);

  //Close TCP/UDP
  String cmdCIPCLOSE = "AT+CIPCLOSE="; 
  cmdCIPCLOSE += connectionId;
  sendESP8266Cmdln(cmdCIPCLOSE, 1000);

  }
  else{
    Serial.println("connectionId: " + String(connectionId));
  delay(1000);
  clearESP8266SerialBuffer();

  sendHTTPResponse(connectionId, strHTML1);
  sendHTTPResponse(connectionId, "{\"message\":false}");
  sendHTTPResponse(connectionId, strHTML2);

  //Close TCP/UDP
  String cmdCIPCLOSE = "AT+CIPCLOSE="; 
  cmdCIPCLOSE += connectionId;
  sendESP8266Cmdln(cmdCIPCLOSE, 1000);

    }
  }
  }
 }
}

void sendHTTPResponse(int id, String response)
{
 String cmd = "AT+CIPSEND=";
 cmd += id;
 cmd += ",";
 cmd += response.length();

 Serial.println("--- AT+CIPSEND ---");
 sendESP8266Cmdln(cmd, 1000);

 Serial.println("--- data ---");
 sendESP8266Data(response, 1000);
 }

 boolean waitOKfromESP8266(int timeout)
 {
 do{
 Serial.println("wait OK...");
 delay(1000);
 if(ESP8266.find("OK"))
 {
  return true;
 }

 }while((timeout--)>0);
 return false;
 }

 boolean cwJoinAP()
 {
 String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASSWORD + "\"";
 ESP8266.println(cmd);
 return waitOKfromESP8266(10);
 }

//Send command to ESP8266, assume OK, no error check
//wait some time and display respond
void sendESP8266Cmdln(String cmd, int waitTime)
{
ESP8266.println(cmd);
delay(waitTime);
clearESP8266SerialBuffer();
}

//Basically same as sendESP8266Cmdln()
//But call ESP8266.print() instead of call ESP8266.println()
void sendESP8266Data(String data, int waitTime)
{
  //ESP8266.print(data);
  ESP8266.print(data);
  delay(waitTime);
  clearESP8266SerialBuffer();
}

//Clear and display Serial Buffer for ESP8266
void clearESP8266SerialBuffer()
{
  Serial.println("= clearESP8266SerialBuffer() =");
  while (ESP8266.available() > 0) {
    char a = ESP8266.read();
    Serial.write(a);
  }
  Serial.println("==============================");
}

Android代码是:

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Constants.protocol+Constants.IP)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            ServerApis service = retrofit.create(ServerApis.class);
            Call<ResponseBody> call = service.left();
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {

                        Toast.makeText(MainActivity.this,"Left Done.",Toast.LENGTH_SHORT).show();

                }

                @Override
                public void onFailure(Throwable t) {
                    System.out.print(t.getMessage());
                }
            });

我在Android客户端上收到来自Arduino Mega 2560服务器的响应时收到“意外的流结束”错误。我正在使用ESP8266 WiFi模块,我正在使用Android的Retrofit。任何提示?

1 个答案:

答案 0 :(得分:4)

我明白了。现在我发送这个来自arduino的回应,它运作得很好 sendHTTPResponse(connectionId, "HTTP/1.1 200 OK\nContent-Type: application/json;charset=utf-8\nConnnection: close\n\n{\"message\":true}");