Как восстановить после получения данных из моего ESP 8266 в Android

Привет я застрял после отправки данных из esp8266 я подключил esp8266 с моим arduino

это мой код Arduino

#include <SoftwareSerial.h>
//#include <OneWire.h>
//#include <DallasTemperature.h>
//#include <stdlib.h>
//#include "Wire.h"
//#define DS3231_I2C_ADDRESS 0x68
//#define ONE_WIRE_BUS 5
//WIFI
#include <SPI.h>
#include <WiFi.h>
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
//OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
//DallasTemperature sensors(&oneWire);

int wifiTx = 4;
int wifiRx = 3;
#define DEBUG true
char com;
String data;

SoftwareSerial wifi(wifiTx, wifiRx);

//wifi
char ssid[] = "waifu";     //  your network SSID (name)
char pass[] = "chronoangel";  // your network password
//int status = WL_IDLE_STATUS;     // the Wifi radio's status


void setup() {
  // put your setup code here, to run once:
  Wire.begin();
  Serial.begin(9600);
  wifi.begin(115200);
  sensors.begin();
  //sekon, menit,jam, day of week, hari, bulan taun
  //setDS3231time(0,15,2,1,13,7,16);
  //\start_wifi();
  esp();
}

void loop() {
 test_wifi();
 //loop_esp();

}

void esp()
{
    sendCommand("AT\r\n",2000,DEBUG); 
    sendCommand("AT+RST\r\n",2000,DEBUG); // reset module
    sendCommand("AT+CWMODE=1\r\n",1000,DEBUG); // configure as access point
    sendCommand("AT+CWJAP=\"waifu\",\"chronoangel\"\r\n",3000,DEBUG);
    delay(10000);
    //Serial.println("\nCek IP");
    //sendCommand("AT+CIFSR\r\n",1000,DEBUG); // get ip address
    sendCommand("AT+CIPMUX=1\r\n",1000,DEBUG); // configure for multiple connections
    Serial.println("\nGet PORT"); 
    sendCommand("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // turn on server on port 80
    Serial.println("\nSet IP");
    sendCommand("AT+CIPSTA=\"192.168.1.7\"\r\n",1000,DEBUG); // set ip address
    sendCommand("AT+CIFSR\r\n",1000,DEBUG); // get ip address
    Serial.println("\nServer Ready"); 
}
void test_wifi()
{  
  if(wifi.available())
  {
    char toSend = (char)wifi.read();
    Serial.print(toSend);
  }

  //Read from usb serial to wifi
  if(Serial.available())
  {
    char toSend = (char)Serial.read();
    wifi.print(toSend);
  }
}

и это мой код андроид студии

package com.example.chronoangel.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.AsyncTask;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView textResponse;
    EditText editTextAddress, editTextPort;
    Button buttonConnect, buttonClear;

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

        editTextAddress = (EditText) findViewById(R.id.IP);
        editTextPort = (EditText) findViewById(R.id.Port);
        buttonConnect = (Button) findViewById(R.id.connect);
        //buttonClear = (Button)findViewById(R.id.clear);
        textResponse = (TextView) findViewById(R.id.textData);
        buttonConnect.setOnClickListener(buttonConnectOnClickListener);

    }

            OnClickListener buttonConnectOnClickListener = new OnClickListener(){

                    @Override
                    public void onClick(View arg0) {
                        MyClientTask myClientTask = new MyClientTask(editTextAddress.getText().toString(), Integer.parseInt(editTextPort.getText().toString()));
                        myClientTask.execute();
                    }};


        //class to get data from esp8266
        public class MyClientTask extends AsyncTask<Void, Void, Void> {

            String dstAddress;
            int dstPort;
            String response = "";

            MyClientTask(String addr, int port) {
                dstAddress = addr;
                dstPort = port;
            }

            @Override
            protected Void doInBackground(Void... arg0) {

                Socket socket = null;

                try {
                    socket = new Socket(dstAddress, dstPort);

                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
                    byte[] buffer = new byte[1024];
                    int bytesRead;
                    InputStream inputStream = socket.getInputStream();

    /*
     * notice:
     * inputStream.read() will block if no data return
     */
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        byteArrayOutputStream.write(buffer, 0, bytesRead);
                        response += byteArrayOutputStream.toString("UTF-8");

                    }

                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    response = "UnknownHostException: " + e.toString();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    response = "IOException: " + e.toString();
                } finally {
                    if (socket != null) {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                textResponse.setText(response);
                super.onPostExecute(result);

            }

        }



}

это мой взгляд на мою программу: моя проблема похожа на эту страницу:

http://stackru.com/questions/34274774/esp8266-wifi-server-to-android-client

но я думаю, что там не было ни подсказки, ни как переподключиться после отправки данных

программа запускается после того, как я нажму кнопку подключиться на Android-приложение

в моем серийном Arduino после отправки AT+ COMMAND

AT+CIPSEND = 0,2

тогда я отправляю данные "ab" на мой андроид

данные не были отправлены, но если я отправляю AT+ COMMAND

AT+CIPCLOSE=0

данные были отправлены, но я должен снова нажать кнопку подключения, чтобы получить данные из esp

у меня вопрос, можем ли мы получить непрерывные данные после нажатия кнопки подключения? Как предположить, я делаю с Android, чтобы снова подключиться после отправки сообщения Arduino?

1 ответ

Это скорее совет, чем ответ, потому что я думаю, что нет другого пути, кроме как закрывать соединение каждый раз.

Но я настоятельно рекомендую использовать собственное программное обеспечение для вашего ESP8266, а не использовать AT-команды. Они хороши для начала, для подключения к сети и так далее. Но они ограничены. Поскольку вы уже используете arduino, я бы предложил использовать IDE для написания кода для вашего ESP. Вы можете найти много кода и помочь здесь. https://create.arduino.cc/projecthub/Metavix/programming-the-esp8266-with-the-arduino-ide-in-3-simple-601c16

И ESP8266WiFi.h предлагает множество функций, которые готовы к использованию.

Другие вопросы по тегам