정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

ESP8266 와이파이 모듈과 웹서버간 http 통신에 대해 질문있습니다.
LOGE | 2018-07-24

안녕하세요. 반갑습니다. 현재 IoT 관련 프로젝트를 진행하고 있는 대학생입니다. 프로젝트를 진행하다가 어려운 점이 있어 질문드립니다.

 

질문하기에 앞서 막힌 부분의 프로젝트의 내용을 간단히 설명드리겠습니다. 

 

1. 아두이노에서 온습도 데이터를 센싱합니다.

2. 데이터를 ESP8266 모듈을 통해 http로 아파치 톰캣 웹서버로 보냅니다. 

 

2번 단계에서 어려움이 있습니다.  아두이노 소스 코드는 다음과 같습니다.

/*
  참고 사이트 : 
  http://makewith.co/page/project/1004/story/2363/  // 무선으로 LED 켜기
  http://inboony.tistory.com/42  // ESP8266 모듈에서 데이터 보내기
*/
#include <SoftwareSerial.h>
#include <ESP8266.h>
#include <ESP8266Client.h>

 

#define DEBUG true
#define TO (1000)

int arduRx=2,arduTx=3;
SoftwareSerial esp8266(arduRx,arduTx); //RX는 2번 핀, TX는 3번 핀
ESP8266 wifi(esp8266);  // esp8266 모듈을 사용하기 위한 객체 wifi를 시리얼 통신 객체를 사용하여 생성

void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600); // PC-아두이노 간 시리얼 연결
   esp8266.begin(9600); // 아두이노-ESP8266 모듈간 연결
   wifi.begin(); // ESP8266 제어 시리얼 통신 연결
  
  /* ESP8266 설정 AT Command 이용*/
  sendData("AT+RST\r\n", TO*2, DEBUG); //reset module
  sendData("AT+CWMODE=1\r\n", TO, DEBUG); // Client mode
  sendData("AT+CWJAP=\"<ssid>\",\"<password>\"\r\n", TO*5, DEBUG); //사용할 공유기 설정. SSID와 비밀번호는 지웠습니다.
  sendData("AT+CIPMUX=1\r\n", TO, DEBUG); //multiple connections 설정
  // sendData("AT+CIPSERVER=1,7777\r\n", TO, DEBUG); // 공유기와의 연결 포트 번호를 7777번으로 설정. default 포트는 333.
  sendData("AT+CIFSR\r\n", TO, DEBUG); // 부여받은 IP 번호 확인
  
  // 웹서버로 TCP 연결 하는 부분. 웹 서버 아이피와 포트 여기서 수정할 것. 웹서버와의 link ID는 1번
  Serial.println("# Trying to Connect Web Server...");  
  while(sendData("AT+CIPSTART=1,\"TCP\",\"<webserver IP>\",<webserver port>\r\n",TO*5,DEBUG)[54]=='E') {
      Serial.println("# ReTrying to Connect Web Server After Close All Connection"); 
      sendData("AT+CIPCLOSE=5\r\n", TO, DEBUG); // 모든 연결 강제종료
      sendData("AT+CIPMUX=1\r\n", TO, DEBUG); // multiple connections 설정
      delay(TO*3);
  }
  Serial.println("# Connecting is complete.\n-----------loop function start------------");


}
 
void loop() {
  short temp=99, humi=80;
  esp8266.print("AT+CIPSEND=1,100\r\n");
  delay(TO/2);
   esp8266.print("GET /ForESP/ESPReceiver.jsp?id=1&temp=");
  esp8266.print(temp); // dummy data
  esp8266.print(" HTTP/1.1\r\n"); // dummy data
  delay(TO*5);
}
 
/* 아두이노-ESP8266 간 통신 함수*/
String sendData(String command, const int timeout, boolean debug){
  String response = "";
  esp8266.print(command); //command를 ESP8266에 보냄
  long int time=millis();
  
  while((time+timeout)>millis()){
    while(esp8266.available()){
      /*esp가 가진 데이터를 시리얼 모니터에 출력하기 위함*/
      char c=esp8266.read(); //다음 문자를 읽어옴
      response+=c;
    }
  }
  if(debug){
    Serial.print(response);
  }
 
  return response;
}

// 함수의 일부분 구글링으로 발췌했습니다. 

// IDE는 스케치입니다.

// 웹서버 아이피, 포트, 공유기 아이피, 비밀번호는 생략했습니다.

 

해당 코드를 테스트하기 위해 집에 있는 노트북에 아파치 톰캣을 실행시킨 후 아두이노를 실행시켰습니다.

 

실행 결과, 아두이노에서 보낸 http 리퀘스트가 서버 로그에 다음과 같이 뜹니다. (이 부분에서 문제가 있습니다.)

그림처럼 request 헤더에 밑줄 친 부분처럼 아두이노에서 ESP8266 모듈로 보내는 AT 명령어가 request에 같이 보내지는 오류가 생겼습니다.(AT명령어가 같이 끼워져서 보내지는것이 정상인지 아닌지도 잘 모르겠습니다. ㅜㅜ)

 

이 문제를 해결하려면 어떡하면 좋을까요? 고수분들의 조언을 구합니다.

 

아 그리고 아두이노에서 센싱한 데이터가 좀 많아서 GET 메소드만을 사용해서 보내기는 헤더 길이가 너무 길다고 로그가 뜹니다. 찾아보니까 POST 메소드라는 걸 사용하라는데 이 부분에 대해 참고하면 좋겠다 싶은 정보가 있다면 부탁드리겠습니다!

 

이전글   |    공부하고싶어요 ㅠㅠ 포인트가 없어요 ㅠㅠ... 2018-07-23
다음글   |    블루투스HC-06 관련 문의 드립니다. 2018-07-24