diy/esp8266

esp8266과 안드로이드 서버 통신하기

do121 2022. 12. 1. 00:16

안드로이드에서 아래와 같이 소켓 통신 서버를 열어 놓고 esp8266과 통신하는 방법

//서버관련
    public void serverCreate() {
        Collections.synchronizedMap(clientsMap);
        try {
            serverSocket = new ServerSocket(1234);//포트 지정
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {

                        try {
                            socket = serverSocket.accept();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        msg = socket.getInetAddress() + "에서 접속\n";
                        handler.sendEmptyMessage(SERVER_TEXT_UPDATE);

                        new Thread(new Runnable() {
                            private DataInputStream in;
                            private DataOutputStream out;
                            private String nick;

                            @Override
                            public void run() {

                                try {
                                    out = new DataOutputStream(socket.getOutputStream());
                                    in = new DataInputStream(socket.getInputStream());
                                    if (in != null) {
                                        try {
                                            if (msg.indexOf("192.x.x.x") > -1) {
                                                msg = in.readLine(); // esp8266은 uft로 보내지 못해서readline 사용

                                            }  else {
                                                msg = in.readUTF(); // 일반적인 경우
                                            }
                                                sendMessageC(msg);
                                                handler.sendEmptyMessage(SERVER_TEXT_UPDATE); //수신 데이터를 핸들러로 보내서 처리

                                        } catch (IOException e) {
                                            e.printStackTrace();
                                        }
                                    }

                                } catch (IOException e) {
                                    e.printStackTrace();
                                }

                            }
                        }).start();
                    }
                }
            }).start();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

* 이리저리 해보아도 esp8266에서 utf방식으로 전송이 안되어서 readline()으로 읽어옴.

** 2번째 방식에서 보듯이 안드로이드 웹서버가 아님에도 get 방식으로 서버에 접속이 가능하여 웹브라이저에서도 "http://192.x.x.x:1234/test" 이런 형식으로 접속할 경우 in.readline()으로 test란 값을 가져옴 

*** 안드로이드 서버가 2번째 get방식이 가능하여 홈어시스턴트를 통한 각종 센서 값 수신 및 제어가 가능함. 차후 관련 사례를 다룰 예정임

 

1. wificlient 방식으로 안드로이드 서버에 데이터 전송

와이파이 접속 등 일반적인 부분은 생략하고 개략적 형태를 보면

#include <ESP8266WiFi.h>

 

 

WiFiClient client;


String svip = "192.x.x.x";

 

if (!client.connect(svip, 1234)) { //서버 1234 포트 접속

      Serial.println("connection failed");//서버 접속에 실패
      delay(100);
      return;

    }
    else
    {
      client.println("test"); // -> 안드로이드 서버의 in.readline()에서 test란 값을 가져옴
      delay(100);

      String recevbline = client.readStringUntil('\r');

      Serial.println("recevbline:" + recevbline);
      delay(1000);
    }

 

2. http.get 방식으로 안드로이드 서버에 데이터 전송

개략적 소스임

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

 

String serverPath= "http://192.x.x.x:1234/test";

 

    WiFiClient client;
    HTTPClient http;


      http.begin(client, serverPath.c_str());

      // Send HTTP GET request
      int httpResponseCode = http.GET(); //get 방식으로 안드로이드 서버 접속함 -> 안드로이드 서버의

                                                                 //in.readline()에서 GET /test HTTP/1.1란 값을 가져옴

      // Free resources
      http.end();