layout | title | author | date | comments |
---|---|---|---|---|
single |
CCTV_ver.3. DB에서 이상값 탐지 후 푸시알람(socket.io, trigger) |
seohyun-kim |
2021-07-22 00:00 |
true |
➡ 위 이미지를 클릭하면 Repository로 이동합니다.
by. 서현
지금까지의 데이터 평균값 + 1.5 * 표준편차
이상이면 탐지하여 backup
table에 msg와 함께 저장되도록 함
DELIMITER //
CREATE TRIGGER detection
AFTER INSERT
ON test
FOR EACH ROW
BEGIN
IF NEW.people > (SELECT AVG(people)+1.5*STDDEV(people) FROM test) THEN
IF NEW.vehicle > (SELECT AVG(vehicle)+1.5*STDDEV(vehicle) FROM test) THEN
INSERT INTO backup VALUES(NEW.id, NEW.start_date ,NEW.end_date, NEW.people, NEW.vehicle, 'Outlier People & Vehicle');
ELSE
INSERT INTO backup VALUES(NEW.id, NEW.start_date ,NEW.end_date, NEW.people, NEW.vehicle, 'Outlier People');
END IF;
ELSEIF NEW.vehicle > (SELECT AVG(vehicle)+1.5*STDDEV(vehicle) FROM test) THEN
INSERT INTO backup VALUES(NEW.id, NEW.start_date ,NEW.end_date, NEW.people, NEW.vehicle, 'Outlier Vehicle');
END IF;
END //
DELIMITER ;
by. 태훈
backup
table에서 5분마다 id
값의 변화를 관찰하여 변화가 있는 경우 emit
// <app.js>
const socketio = require('socket.io');
const io = socketio(server);
io.on("connection", (socket) => {
console.log(`connect: ${socket.id}`);
var lastRowID = -1;
var job = schedule.scheduleJob(
'*/5 * * * * *', // 주기 (5분마다)
function() {
console.log(1);
var sql = 'select * from backup order by id desc limit 1';
conn.query(sql, (err, row) => {
if (err) {
console.log(err);
} else {
if (lastRowID != row[0].id) {
lastRowID = row[0].id;
console.log(row[0]);
socket.emit("outlierData", row[0]);
} else {
console.log('not update database');
}
}
});
});
});
<script>
var port = JSON.parse('<%- JSON.stringify(port) %>');
console.log(port);
var socket = io.connect("http://localhost:" + port);
socket.on('outlierData', function(data) {
console.log(data);
notify(data.id, data.msg);
})
</script>
by. 가희
detection이 이뤄진 데이터의 id
값과 msg
를 띄워 보여줌
<script>
Notification.requestPermission();
function notify(id, msg) {
if (Notification.permission !== "denied") {
new Notification("id="+id + ": " + msg);
}
else if (Notification.permission === "denied") {
Notification.requestPermission();
}
}
</script>