Toggle navigation
Toggle navigation
This project
Loading...
Sign in
김가영
/
Probability Death
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
DESKTOP-PC6TBNS\강환석씨
2018-12-11 16:16:23 +0900
Browse Files
Options
Browse Files
Download
Plain Diff
Commit
5ba609437d438e264aee6bd61029c3d4fafcc198
5ba60943
2 parents
948b9057
04199e6f
Merge branch
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
142 additions
and
80 deletions
lib/socketio.js
views/index.ejs
lib/socketio.js
View file @
5ba6094
...
...
@@ -5,98 +5,145 @@ const lat = "37.239795";
const
lon
=
"127.083240"
;
module
.
exports
=
(
server
,
app
)
=>
{
const
io
=
require
(
'socket.io'
,
)(
server
,
{
transports
:
[
'websocket'
]
const
io
=
require
(
'socket.io'
)(
server
,
{
transports
:
[
'websocket'
]
// websocket 사용시 polling 사용을 배제하고 안정적인 websocket만 사용함
});
//명시적 형 선언
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
;
let
info
=
{}
const
CALL
=
(
when
,
what
)
=>
{
requesting
.
get
({
const
req_API
=
(
when
,
what
)
=>
{
//async await 사용하기 위하여 promise 사용
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
)
{
if
(
err
)
throw
err
;
// api의 대답이 있을경우 실행
if
(
api_res
)
{
return
api_body
;
// api_body.weather.minutely[0]
}
});
//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
(
"calling api"
);
resolve
(
api_body
);
}
});
})
}
const
API_bundle
=
async
()
=>
{
try
{
Current_Weather
=
await
req_API
(
"current"
,
"minutely"
);
//현재날씨 (분별)
Sensible_T
=
await
req_API
(
"index"
,
"wct"
);
//체감온도
Heat_index
=
await
req_API
(
"index"
,
"heat"
);
//열지수
Discomport_index
=
await
req_API
(
"index"
,
"th"
);
//불쾌지수
Ultra_Violet_index
=
await
req_API
(
"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
};
function
getRandom_add_prob
(
min
,
max
)
{
return
Math
.
random
()
*
(
max
-
min
)
+
min
;
}
// 심장마비로 갑자기 확률 증가 할 수 있음
Math
.
random
()
*
2
>=
1
?
client_send
.
death
+=
getRandom_add_prob
(
0
,
10
)
:
client_send
.
death
-=
getRandom_add_prob
(
0
,
10
)
;
//만약 날이 너무 안좋아서 확률이 100을 넘긴다면 100으로 예외처리
if
(
client_send
.
death
>=
100
)
{
client_send
.
death
=
100
;
}
console
.
log
(
client_send
)
app
.
get
(
"socket"
).
emit
(
"weatherInfo_minutely_send_to_client"
,
client_send
);
// 클라이언트에게 정보 담아서 이벤트 발산
console
.
log
(
"emit"
);
//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
);
})
}
catch
(
err
)
{
//promise err or try err catch
console
.
log
(
"================Error Occured !!================\n"
,
err
);
}
}
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
;
let
call_interval
;
const
Start_Interval
=
(
second
,
CALL
)
=>
{
CALL
();
//처음 불러올때 한번 호출하고
call_interval
=
setInterval
(
CALL
,
second
*
1000
);
//그 후에 1분마다 호출
}
io
.
on
(
'connection'
,
(
socket
)
=>
{
//프론트와 소켓 연결시 이벤트 루프 동작
app
.
set
(
"socket"
,
socket
);
socket
.
on
(
"connection"
,
()
=>
{
API_CALL
=
setInterval
(()
=>
{
Current_Weather
=
CALL
(
"current"
,
"minutely"
);
//현재날씨 (분별)
Sensible_T
=
CALL
(
"index"
,
"wct"
);
//체감온도
Heat_index
=
CALL
(
"index"
,
"heat"
);
//열지수
Discomport_index
=
CALL
(
"index"
,
"th"
);
//불쾌지수
Ultra_Violet_index
=
CALL
(
"index"
,
"uv"
);
//자외선지수
info
=
{
heat
:
Sensible_T
.
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
].
day00
.
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
//확률
}
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
)
+
(
abs
(
info
.
sensible_temperature
-
15
)
/
2
)
+
(
info
.
discomport
/
10
)
+
(
info
.
UV
/
5
)
+
(
info
.
windspd
*
3
)
+
(
info
.
rain
/
10
)
+
(
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
};
//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
);
// 클라이언트에게 정보 담아서 이벤트 발산
})
},
60
*
1000
);
//1분마다 호출
console
.
log
(
"SOCKET CONNECTED"
);
Start_Interval
(
60
,
API_bundle
);
//소켓 연결후 interval 활성화하여 1분마다 API 호출
});
socket
.
on
(
'disconnecting'
,
(
reason
)
=>
{
clearInterval
(
API_CALL
);
//연결 종료시 해제
socket
.
on
(
'disconnect'
,
(
reason
)
=>
{
console
.
log
(
"disconnected"
);
clearInterval
(
call_interval
);
//연결 종료시 interval 해제
})
})
}
}
...
...
views/index.ejs
View file @
5ba6094
...
...
@@ -38,6 +38,21 @@
></div>
</div>
</div>
<<<<<<
< HEAD
=======
<
script
src=
"/socket.io/socket.io.js"
></script>
<script>
var
socket
=
io
(
'http://localhost'
,{
transports
:
[
'websocket'
]});
socket
.
emit
(
"connection"
,()
=>
{
console
.
log
(
"connected"
);
});
socket
.
on
(
"weatherInfo_minutely_send_to_client"
,(
info
)
=>
{
//서버에서 client에게 메세지 전송
console
.
log
(
info
);
});
</script>
>>>>>>> last_socket_hotfix
<!-- 첫번째 그래프 -->
<script
type=
"text/javascript"
>
...
...
Please
register
or
login
to post a comment