Commit 2cc99e71 authored by KangMin An's avatar KangMin An
Browse files

Update: 외부 날씨 저장 스케줄 생성. 외부 날씨 확인 경로 작성.

parent dbb80397
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
| Root | ﹒ | /api | 서버의 기본 경로 | | Root | ﹒ | /api | 서버의 기본 경로 |
| Data Collector | GET | /data/input?... | 아두이노를 통해 수집한 자료 등록 (내부, 외부는 쿼리로 구분) | | Data Collector | GET | /data/input?... | 아두이노를 통해 수집한 자료 등록 (내부, 외부는 쿼리로 구분) |
| Data | GET | /data/user | 사용자 지정 장소의 날씨 데이터 요청 | | Data | GET | /data/user | 사용자 지정 장소의 날씨 데이터 요청 |
| Data | GET | /data/outside?locCode | 해당 지역구의 날씨 데이터 요청 | | Data | GET | /data/outside?loccode | 해당 지역구의 날씨 데이터 요청 |
| Data | GET | /data/loccode | 행정 구역 코드 요청 | | Data | GET | /data/loccode | 행정 구역 코드 요청 |
| Auth | POST | /signup | 회원가입 요청 | | Auth | POST | /signup | 회원가입 요청 |
| Auth | POST | /login | 로그인 요청 | | Auth | POST | /login | 로그인 요청 |
......
...@@ -5,7 +5,7 @@ import jwt from "jsonwebtoken"; ...@@ -5,7 +5,7 @@ import jwt from "jsonwebtoken";
import resForm from "../resForm"; import resForm from "../resForm";
// 외부 수집기로 부터 들어온 정보 처리 // 외부 수집기로 부터 들어온 정보 처리
const handleOutData = async (locCode, date, lat, lng) => { export const handleOutData = async (locCode, date, lat, lng) => {
try { try {
// OpenWeatherAPI로 부터 지역의 날씨 정보획득을 위해 지역의 경도와 위도, API Key, 단위 기준 metric 전달 // OpenWeatherAPI로 부터 지역의 날씨 정보획득을 위해 지역의 경도와 위도, API Key, 단위 기준 metric 전달
const response = await fetch( const response = await fetch(
...@@ -31,6 +31,8 @@ const handleOutData = async (locCode, date, lat, lng) => { ...@@ -31,6 +31,8 @@ const handleOutData = async (locCode, date, lat, lng) => {
logging: false, logging: false,
} }
); );
console.log("Outside data successfully stored.");
} catch (err) { } catch (err) {
console.log("Input Weather_Out Data Error."); console.log("Input Weather_Out Data Error.");
console.log(err); console.log(err);
...@@ -52,6 +54,8 @@ const handleInData = async (email, date, temp, humi, lights) => { ...@@ -52,6 +54,8 @@ const handleInData = async (email, date, temp, humi, lights) => {
logging: false, logging: false,
} }
); );
console.log("Inside data successfully stored.");
} catch (err) { } catch (err) {
console.log("Input Weather_In Data Error."); console.log("Input Weather_In Data Error.");
console.log(err); console.log(err);
...@@ -73,7 +77,6 @@ export const getDataInput = (req, res) => { ...@@ -73,7 +77,6 @@ export const getDataInput = (req, res) => {
`Outside[${locCode}] Data(date: ${trans_date}/ lat: ${lat}/ lng: ${lng}) Input.` `Outside[${locCode}] Data(date: ${trans_date}/ lat: ${lat}/ lng: ${lng}) Input.`
); );
handleOutData(locCode, trans_date, lat, lng); handleOutData(locCode, trans_date, lat, lng);
console.log("Outside data successfully stored.");
} else { } else {
// 내부 데이터 수집기 동작 // 내부 데이터 수집기 동작
const { const {
...@@ -86,12 +89,11 @@ export const getDataInput = (req, res) => { ...@@ -86,12 +89,11 @@ export const getDataInput = (req, res) => {
`User[${email}] Data(date: ${trans_date}/ temp: ${temp}/ humi: ${humi}/ lights: ${lights}) Input.` `User[${email}] Data(date: ${trans_date}/ temp: ${temp}/ humi: ${humi}/ lights: ${lights}) Input.`
); );
handleInData(email, trans_date, temp, humi, lights); handleInData(email, trans_date, temp, humi, lights);
console.log("Inside data successfully stored.");
} }
res.status(resForm.code.ok); res.status(resForm.code.ok).json({ msg: resForm.msg.ok });
} catch (err) { } catch (err) {
console.log(err); console.log(err);
res.status(resForm.code.err); res.status(resForm.code.err).json({ msg: resForm.msg.err });
} }
}; };
...@@ -119,12 +121,12 @@ export const getUserWeatherData = (req, res) => { ...@@ -119,12 +121,12 @@ export const getUserWeatherData = (req, res) => {
// 실외 날씨 데이터 요청 처리 // 실외 날씨 데이터 요청 처리
export const getOutWeatherData = async (req, res) => { export const getOutWeatherData = async (req, res) => {
const { const {
query: { locCode }, query: { loccode },
} = req; } = req;
try { try {
// 실외 지역 번호를 통해 날씨 데이터 전송. // 실외 지역 번호를 통해 날씨 데이터 전송.
const result = await db.Weather_Out.findAll({ const result = await db.Weather_Out.findAll({
where: { loc_code: locCode }, where: { loc_code: loccode },
order: [["collected_at", "DESC"]], order: [["collected_at", "DESC"]],
logging: false, logging: false,
}); });
......
import db from "./db/index";
import envs from "../config/config";
import schedule from "node-schedule"; import schedule from "node-schedule";
import { spawn } from "child_process"; import { spawn } from "child_process";
import dotenv from "dotenv"; import { handleOutData } from "./controllers/dataController";
dotenv.config();
// Data Processing Python Codes Directory - server directory에서 실행 // Data Processing Python Codes Directory - server directory에서 실행
const DATA_PROCESSING_DIR = "./src/data_processing/main.py"; const DATA_PROCESSING_DIR = "./src/data_processing/main.py";
// 매일 자정에 실행할 스케줄의 규칙 // 매일 자정에 실행할 스케줄의 규칙
const rule = new schedule.RecurrenceRule(); const rule_dataProcessing = new schedule.RecurrenceRule();
rule.hour = 0; rule_dataProcessing.hour = 0;
rule.minute = 0; rule_dataProcessing.minute = 0;
rule.second = 0; rule_dataProcessing.second = 0;
// 매일 자정에 실행되는 데이터 처리 스케줄 // 매일 자정에 실행되는 데이터 처리 스케줄
const dataProcessingJob = schedule.scheduleJob(rule, () => { const dataProcessingJob = schedule.scheduleJob(rule_dataProcessing, () => {
const today = new Date(); const today = new Date();
console.log( console.log(
...@@ -25,10 +25,10 @@ const dataProcessingJob = schedule.scheduleJob(rule, () => { ...@@ -25,10 +25,10 @@ const dataProcessingJob = schedule.scheduleJob(rule, () => {
const pyprocess = spawn("python", [ const pyprocess = spawn("python", [
DATA_PROCESSING_DIR, DATA_PROCESSING_DIR,
process.env.MYSQL_HOST, envs.db.host,
process.env.MYSQL_USER, envs.db.user,
process.env.MYSQL_PASSWORD, envs.db.password,
process.env.MYSQL_DATABASE, envs.db.database,
]); ]);
pyprocess.stdout.on("data", (data) => { pyprocess.stdout.on("data", (data) => {
...@@ -45,3 +45,106 @@ const dataProcessingJob = schedule.scheduleJob(rule, () => { ...@@ -45,3 +45,106 @@ const dataProcessingJob = schedule.scheduleJob(rule, () => {
console.log("The data processing done."); console.log("The data processing done.");
}); });
}); });
// 10분 마다 지역 외부 날씨 저장 스케쥴
const rules_weather_out_store = {
"00m": new schedule.RecurrenceRule(),
"10m": new schedule.RecurrenceRule(),
"20m": new schedule.RecurrenceRule(),
"30m": new schedule.RecurrenceRule(),
"40m": new schedule.RecurrenceRule(),
"50m": new schedule.RecurrenceRule(),
};
rules_weather_out_store["00m"].minute = 0;
rules_weather_out_store["10m"].minute = 10;
rules_weather_out_store["20m"].minute = 20;
rules_weather_out_store["30m"].minute = 30;
rules_weather_out_store["40m"].minute = 40;
rules_weather_out_store["50m"].minute = 50;
// 임의의 사용자 데이터 등록
const coordinates = [
{ lat: 37.240049, lng: 131.86931, locCode: 3743011 },
{ lat: 37.206616, lng: 127.037113, locCode: 3124053 },
{ lat: 37.666729, lng: 127.051501, locCode: 1111072 },
{ lat: 35.177681, lng: 128.805934, locCode: 3807063 },
];
// 데이터 저장 용 날짜 생성
const make_date = () => {
const now = new Date();
const year = now.getFullYear();
const month =
now.getMonth() + 1 < 10 ? `0${now.getMonth() + 1}` : now.getMonth() + 1;
const date = now.getDate() < 10 ? `0${now.getDate()}` : now.getDate();
const hour = now.getHours() < 10 ? `0${now.getHours()}` : now.getHours();
const minute =
now.getMinutes() < 10 ? `0${now.getMinutes()}` : now.getMinutes();
const str_date = `${year}-${month}-${date}T${hour}:${minute}:00+09:00`;
const collected_at = new Date(str_date);
return collected_at;
};
// 날씨 저장 스케줄 등록
const weatherOutStoringJob_00m = schedule.scheduleJob(
rules_weather_out_store["00m"],
() => {
const date = make_date();
coordinates.map(({ lat, lng, locCode }) =>
handleOutData(locCode, date, lat, lng)
);
}
);
const weatherOutStoringJob_10m = schedule.scheduleJob(
rules_weather_out_store["10m"],
() => {
const date = make_date();
coordinates.map(({ lat, lng, locCode }) =>
handleOutData(locCode, date, lat, lng)
);
}
);
const weatherOutStoringJob_20m = schedule.scheduleJob(
rules_weather_out_store["20m"],
() => {
const date = make_date();
coordinates.map(({ lat, lng, locCode }) =>
handleOutData(locCode, date, lat, lng)
);
}
);
const weatherOutStoringJob_30m = schedule.scheduleJob(
rules_weather_out_store["30m"],
() => {
const date = make_date();
coordinates.map(({ lat, lng, locCode }) =>
handleOutData(locCode, date, lat, lng)
);
}
);
const weatherOutStoringJob_40m = schedule.scheduleJob(
rules_weather_out_store["40m"],
() => {
const date = make_date();
coordinates.map(({ lat, lng, locCode }) =>
handleOutData(locCode, date, lat, lng)
);
}
);
const weatherOutStoringJob_50m = schedule.scheduleJob(
rules_weather_out_store["50m"],
() => {
const date = make_date();
coordinates.map(({ lat, lng, locCode }) =>
handleOutData(locCode, date, lat, lng)
);
}
);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment