ESP8266 для связи Android - PullRequest
0 голосов
/ 12 февраля 2019

На самом деле я впервые задаю вопрос здесь и очень надеюсь, что кто-нибудь сможет решить мою проблему.

Я работаю над своим дизайн-проектом, и одна из его функций заключается в том, что он может общатьсяот ESP8266 NodeMCU до Android, без подключения NodeMCU к сети.Так что это как Android, подключающийся напрямую к модулю Wi-Fi, настраивающий NodeMCU в качестве точки доступа и веб-сервера.

Я установил простую связь, но я хочу, чтобы она была постоянной и одновременной, поскольку я используюэто соединение для отображения показаний датчика с NodeMCU на Android.Моя проблема здесь в том, что он не будет постоянно давать значения, он будет давать только первые данные, а затем ничего.

Вот мой код в Android:

Первый - это класс клиента

public class Client extends AsyncTask<Void, Void, String> {

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

Socket socket = null;

Client(String addr, int port, TextView textResponse) {
    dstAddress = addr;
    dstPort = port;
    this.textResponse = textResponse;
}

@Override
protected String doInBackground(Void... arg0) {
Log.d("Status_2", "Sample_2");
    try {
        if(socket == null)
        {
            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();
            }
        }
    }*/
    //textResponse.setText(response);
    return response;
}

@Override
protected void onPostExecute(String result)
{
    Log.d("Status_1", "sample");
    textResponse.setText(response);
    super.onPostExecute(result);
}

}

Вот из основной деятельности

public class MainActivity extends Activity {

TextView response;
EditText editTextAddress, editTextPort;
Button buttonConnect, buttonClear, buttonStop;
int check = 0;
public static Client myClient;


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


    editTextAddress =  findViewById(R.id.addressEditText);
    editTextPort =  findViewById(R.id.portEditText);
    buttonConnect =  findViewById(R.id.connectButton);
    buttonClear =  findViewById(R.id.clearButton);
    buttonStop = findViewById(R.id.buttonStop);
    response =  findViewById(R.id.responseTextView);

    myClient = new Client(editTextAddress.getText()
            .toString(), Integer.parseInt(editTextPort
            .getText().toString()), response);

    buttonStop.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            check = 0;
        }
    });

    buttonConnect.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0)
        {
            check = 1;
                myClient.execute();


        }
    });

    buttonClear.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            response.setText("");
        }
    });
}

}

А вот код из Arduino:

int status = WL_IDLE_STATUS;
boolean alreadyConnected = false; // whether or not the client was connected 
previously

WiFiServer server(8080);

void setup() 
{

   delay(1000);
   Serial.begin(115200);
   Serial.println();
  // MotionSensor_Setup();
   Serial.print("Configuring access point...");
   /* You can remove the password parameter if you want the AP to be open. */
   WiFi.softAP(ssid,password);
   delay(10000);
   IPAddress myIP = WiFi.softAPIP();
   Serial.print("AP IP address: ");
   Serial.println(myIP);

   Serial.println("\nStarting server...");
  // start the server:
  server.begin();

}




void loop() 
{
 // wait for a new client:
  WiFiClient client = server.available();
  // when the client sends the first byte, say hello:
    if(client)
    {
     if (!alreadyConnected) 
{
  // clead out the input buffer:
  client.flush();
  Serial.println(analogRead(A0));
  Serial.println();
  client.println("Hello, client!");
  client.println(analogRead(A0));
  delay(500);
  alreadyConnected = true;
   }
    }




if (client.available() > 0) {
  // read the bytes incoming from the client:
  char thisChar = client.read();
  // echo the bytes back to the client:
  server.write(thisChar);
  // echo the bytes to the server as well:
  Serial.write(thisChar);
}

} ​​

В конце концов я попробовал этот код здесь в методе void loop ().

void loop() 
{
 // wait for a new client:
  WiFiClient client = server.available();
  // when the client sends the first byte, say hello:
    while(client.connected())
    {
     client.println(analogRead(A0));
     delay(1000);
     Serial.println(analogRead(A0));
   }
    }

он попал в условие while и отобразил данные в Serial Monitor, но не отображается в Android.

Я испробовал несколько приемов и все еще не повезло.

Буду очень признателен за ответ, ребята, Спасибо!

1 Ответ

0 голосов
/ 23 февраля 2019

Вы можете попробовать это -> Действительно простой TCP-клиент Я выполняю свой Android-сервер в соответствии с этим руководством, и все в порядке.

...