socketio.js
6.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const db = require('./db.js');
const secret_key = require('../keys/api_option').key;
const requesting = require('request');
const lat = "37.239795";
const lon = "127.083240";
module.exports = (server, app) => {
const io = require('socket.io', )(server, {
transports: ['websocket']
});
let info = {}
const CALL = (when, what) => {
return new Promise((resolve, reject) => {
requesting.get({
// api를 요청할 주소 -- 시크릿키,위도,경도 입력
url: `https://api2.sktelecom.com/weather/${when}/${what}?appKey=${secret_key}&lat=${lat}&lon=${lon}`,
json: true
},
//api에게 응답 받았을때 실행되는 callback function
function (err, api_res, api_body) {
//err 존재시 promise reject 호출
if (err) reject(err);
// api의 response이 있을경우 promise resolve 호출
if (api_res) {
console.log("call");
resolve(api_body);
}
});
})
}
io.on('connection', (socket) => { //웹 페이지 연결시 루프 동작
let API_CALL;
//명시적으로 객체임을 선언
let Current_Weather = {};
let Sensible_T = {};
let Heat_index = {};
let Discomport_index = {};
let Ultra_Violet_index = {};
let sending_to_client_info = {};
let client_send = {};
let sql;
socket.on("connection", () => {
console.log("lala");
// API_CALL = setInterval(() => {
console.log("lala");
const API_bundle = async () => {
try {
Current_Weather = await CALL("current", "minutely"); //현재날씨 (분별)
Sensible_T = await CALL("index", "wct"); //체감온도
Heat_index = await CALL("index", "heat"); //열지수
Discomport_index = await CALL("index", "th"); //불쾌지수
Ultra_Violet_index = await CALL("index", "uv"); //자외선지수
console.log("bundle");
info = {
heat: Heat_index.weather.wIndex.heatIndex[0].current.index, //열지수
sensible_temperature: Sensible_T.weather.wIndex.wctIndex[0].current.index, //체감온도
discomport: Discomport_index.weather.wIndex.thIndex[0].current.index, //불쾌지수
UV: Ultra_Violet_index.weather.wIndex.uvindex[0].day01.index, //자외선지수
windspd: Current_Weather.weather.minutely[0].wind.wspd, //바람 속도
sky: Current_Weather.weather.minutely[0].sky.code, //하늘 상태
rain: Current_Weather.weather.minutely[0].rain.last24hour, //강수량
current_temperature: Current_Weather.weather.minutely[0].temperature.tc, //현재 온도
lightning: Current_Weather.weather.minutely[0].lightning, //현재 낙뢰
warning: Current_Weather.common.alertYn, //현재 특보 유무
typhoon: Current_Weather.common.stormYn, //현재 태풍
time: Current_Weather.weather.minutely[0].timeObservation, // 불러온 시각
death_prob: 0 //확률
}
console.log("callback")
console.log(info);
// ------------------------------ death_prob 정의 ------------------------------
info.death_prob += info.sky.substr(5)*1 //하늘 상태에 따라 확률 증가
if(info.lightning===1) //낙뢰시에 확률 증가
info.death_prob += 10;
if(info.typhoon === "Y") //태풍시에 확률 증가
info.death_prob += 10;
if(info.warning === "Y") // 특보 발령시 확률 증가
info.death_prob += 5
//죽을 확률 계산(내맘대로 커스텀)
info.death_prob =(
(info.heat/8) + (Math.abs(info.sensible_temperature-15)/2) + (info.discomport/10) + (info.UV/5)
+ (info.windspd*3) + (info.rain/10) + (Math.abs(info.current_temperature-15)/2)
);
//이벤트 기반으로 일정 시간 간격으로 클라이언트에게 보낼 정보
client_send={
time : info.time,
wind : info.windspd,
temperature : info.current_temperature,
rain : info.rain,
death : info.death_prob
};
//만약 날이 너무 안좋아서 확률이 100을 넘긴다면 100으로 예외처리
if(client_send.death>=100){
client_send.death=100;
}
console.log(client_send)
} catch (err) { //promise err or try err catch
console.log("================Error Occured !!================\n",err);
}
}
API_bundle();
// //db에 저장
// sql="INSERT INTO weatherInfo (time,wind,temperature,rain,prob) VALUES (?,?,?,?,?)";
// db.query(sql,[client_send.time,client_send.wind,client_send.temperature,client_send.rain,client_send.death],(err,result)=>{
// if(err) console.log(err);
// socket.emit("weatherInfo_minutely_send_to_client",client_send); // 클라이언트에게 정보 담아서 이벤트 발산
// })
// }, 1* 1000); //1분마다 호출
});
socket.on('disconnecting', (reason) => {
clearInterval(API_CALL); //연결 종료시 해제
})
})
}