+로컬 네트워크 환경이면 별다른 설정 필요 없으나 외부에서 접속 시 설정파일 수정이 필수다!
mosquitto_sub -t sensor/#
#의 경우 해당 토픽 아래의 모든 내용을 가져오는 명령이다.
원래는 센서별로 토픽을 지정했으나, 분류하는 과정이 복잡하고, 오류가 자꾸 발생해서 JSON 형식으로 토픽을 보내도록 했다.
mid는 원래 +"mid_1" 식으로 붙혔는데, 자바에서 파싱할 때는 괜찮았으나 통합모니터링시스템의 Node Js 환경에선
문제가 발생해 "\"mid_1\"" 식으로 수정했다.
5. 외형 조립 및 발표 준비
조립이야 어렵진 않았다. 플라스틱 케이스에 폼 양면테이프 사용.
하지만 발표 준비가 진짜 어려웠는데, 6인의 팀원이 절반 절반 나눠 3인은 프론트엔드 (PC/모바일 웹), 3인은 IoT 파트를 담당해서 진행하다보니 프론트엔드 팀은 IoT를 아예 모르고, IoT 팀은 프론트엔드 파트에 약점이 생겨버릴 수 밖에 없었다.
발표자가 프론트엔드 팀이였는데, 할 말이 너무 많아 IoT 팀원들이 같이 붙어서 원고 봐주고 설명해줬는데도
말을 줄이자니 이해하기 어려울 것 같고, 그렇다고 넣자니 발표자가 대본 암기하기 어려울 것 같고...
그래서 대본을 들고 올라갔는데 불이 꺼지는 바람에 대본도 보기 힘들었다고 한다. 발표자가 진짜 고생이 많았지..
6. 대망의 발표 당일
02:11:04 부터 보면 된다. 팀원 소개 시간 때 내 역활에 대해서 잘 써 놨는데 너무 떨린 나머지 얼버무리고 말았다. 어휴..
7. 후기
그냥...일주일만 더 빨리 Node Js 포기하고 JSP/Servlet으로 선회할껄 그랬다. 개발 범위 설정과 시간 분배에 성공해서
남들 프로젝트할 때 미리 끝내고 다른 조 도와주고, 발표준비했던 1차 프로젝트와는 달리, 개발 범위 설정과 시간 분배에
실패했던 것 같다. 멘토의 방향을 잘못 이해하다보니 MQTT 도입도 늦어졌고, 기능 구현도 쉽지는 않았다.
일단 예제도 없고, 심화로 갈려니 정말...머리 터지는 줄 알았다.
사실 만든 것도 버그 투성이다. ESP8266을 쓴 건 좋은데 너무 불안정하고, 웹서버에서 넘어오는 토픽도 받아질 때도 있고 자기 맘대로 동작한다. 이것저것 코드를 다 집어넣어놔 분리시켜 라이브러리화 시키면 좋은데 C++과 자바의 클래스 구조에는 차이도 있고, 분리해보려는 데 시간이 너무 촉박했다.
사실 DB도 1차처럼 내가 좀 봐줬어야 하는데 (기기번호(자동증가 컬럼)으로 식별하기 보단 기기 SN로 구별하는 게 좋은데, 신경 못 쓴 사이에 기기번호로 식별하도록 모든 VO, DAO가 짜여져서 그 부분이 좀 아쉬웠음) 그러질 못했다.
mariadb 설치 후 sudo mysql -u root 실행 시 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 오류 발생
0. 서비스 재실행
sudo service mysql restart 또는 sudo systemctl restart mariadb 입력하여 서비스 재실행
1. 서비스 재실행 자체가 실패할 경우 (+삭제 후 실행시 동일증상 발생해도 마찬가지)
/var/lib/mysql 폴더 강제 삭제 후 데이터 재생성 해주기,
cd var/lib/ 입력하여 경로 이동,
sudo rm -r mysql mysql 폴더 강제 삭제(* rm 명령어로 폴더 삭제할 경우 -r 옵션을 rm 명령어 뒤에 붙힌다)
sudo mysql_install_db --user=mysql
sudo service mysql start 또는 sudo systemctl start mariadb 입력하여 서비스 정상 동작 확인하기
GET 방식으로 웹서버 전송
받는 측 PHP 파일에서 별도의 수신 확인 응답을 보내지 않기 때문에
시리얼 모니터 상으론 에러코드 -11번이 출력되나 정상적으로 DB에 값이 저장되는 것으로 보임.
//GET 방식으로 웹서버로 전송.
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "DHT.h"
#define DHTPIN D2 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
float h;
float t;
const char* ssid = "";
const char* password = "";
//Your Domain name with URL path or IP address with path
String serverName = "<http://192.168.2.175/test2.php>";
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
unsigned long timerDelay = 5000;
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
}
void loop() {
readtemphum();
//Send an HTTP POST request every 10 minutes
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
HTTPClient http;
String serverPath = serverName + "?temp="+String(t)+"&hum="+String(h);
// Your Domain name with URL path or IP address with path
http.begin(serverPath.c_str());
// Send HTTP GET request
int httpResponseCode = http.GET();
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println(payload);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
void readtemphum(){
delay(2000);
h = dht.readHumidity();
t = dht.readTemperature();
}
POST 방식으로 전송하는 아두이노 코드
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "DHT.h"
#define DHTPIN D2 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
float h;
float t;
const char* ssid = "";
const char* password = "";
const char* serverName = "<http://192.168.2.175/posttest.php>";
String url = "/post/";
unsigned long lastTime = 0;
unsigned long timerDelay = 5000;
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}
void loop() {
readtemphum();
//Send an HTTP POST request every 10 minutes
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if (WiFi.status() == WL_CONNECTED) {
WiFiClient client;
HTTPClient http;
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String postData = "temp=" + String(t) + "&hum=" + String(h);
String address = serverName + url;
http.begin(address);
auto httpCode = http.POST(postData);
Serial.println("전송 데이터 :: " + postData);
Serial.println(httpCode); //Print HTTP return code
String payload = http.getString();
Serial.println(payload); //Print request response payload
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
void readtemphum() {
delay(2000);
h = dht.readHumidity();
t = dht.readTemperature();
}
네트워크 연결 후 5초 뒤 전송
성공한 경우 HTTP 코드 200번 반환 (성공) 연결에 문제 있을 경우 500번 반환(실패)