스마트 식물 키우기에서 아두이노로 식물의 온도, 습도 등을 센싱하고 이 값들을 스프링 백엔드 서버에 http get 요청으로 보내려한다.
post 요청으로 안하고 get요청으로 하는 이유는 url 파라미터를 통해 값을 간단하게 보내기 위해서이다.
두가지 다 시도 해봤는데 1번은 모듈문제인지 와이파이가 연결됐다 끊겼다 하고 인식도 잘 안돼서 2번을 시도하기로 했다.
결과만 말하자면 2번으로 시도했을땐 잘 되었다.
우선 Arduino IDE를 열고 위쪽 탭에 파일 > 기본설정 > 추가 보드 관리자 URL
에 아래 주소를 입력한다.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
그리고 좌측에 보드매니저
를 열고 esp8266
를 검색하면 결과 하나가 나올텐데 그걸 설치하면 된다.
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char* ssid = "와이파이이름"; // WiFi 네트워크 이름
const char* password = "패스워드"; // WiFi 비밀번호
void setup() {
Serial.begin(115200); // 시리얼 통신 시작
Serial.println("version 1 started");
WiFi.begin(ssid, password); // WiFi 연결 시작
while (WiFi.status() != WL_CONNECTED) { // WiFi 연결 대기
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { // WiFi에 연결된 경우
HTTPClient http; // HTTPClient 객체 생성
WiFiClient client;
http.begin(client, "http://33.33.333.33:8080/member/1"); // 접속할 URL 설정
int httpCode = http.GET(); // GET 요청 보내기
if (httpCode > 0) { // 응답이 정상적으로 수신된 경우
String payload = http.getString(); // 응답 페이로드(데이터)를 가져옴
Serial.println(payload); // 페이로드 출력
} else {
Serial.println("Error on HTTP request");
}
http.end(); // HTTP 연결 종료
}
delay(10000); // 10초 대기
}
코드 중 유의할게 접속 url을 로컬 서버를 테스트한다고 localhost:8080/member/1 로 입력하면 통신이 안된다.
로컬 서버에 테스트 할 땐 localhost가 아닌 아이피 주소를 숫자로 입력해주어야한다. ex) 192.xxx.xxx.xxx:8080
(이 부분 때문에 삽질을 오래했다...)
위 코드를 다 입력하고 시리얼 모니터를 열고 115200 baud로 맞춰주면 맨 밑줄과 같이 response 가 도착하게 된다.
일단 테스트 한다고 아무 주소에 get 요청을 보내봤다.
실제로는 아마 xx.xx.xx.xx:8080/arduino/uuid?temp=20&humidity=30
이런식으로 get 요청을 보내면 서버에 기록되는 방식으로 구현하면 될 것 같다.
참고로 도메인을 사용하여 백엔드 서버를 https로 배포했어도 그냥 아두이노에선 ec2 ipv4를 사용하여 http로 전송을 하였다. 아마 https를 사용하려면 이 코드에서 수정이 더 필요할 것 같아서 그랬다.
vercel로 배포한 프론트(리액트)와 ec2로 배포한 스프링 서버는 도메인을 이용해 https 통신을 하고
아두이노와 ec2 스프링 서버는 ec2 ipv4 주소를 사용하여 http 통신을 한다.
다음 글에선 실제 센서들을 화분에 연결하고 실제 센서 값을 서버로 보내보는 과정을 작성해보겠다.