Skip to content
Snippets Groups Projects
Commit 26e48f13 authored by Server (Shared Users)'s avatar Server (Shared Users)
Browse files

revise

parent 6c53e8d5
Branches
No related tags found
No related merge requests found
...@@ -21,12 +21,15 @@ class CoapClient(): ...@@ -21,12 +21,15 @@ class CoapClient():
def __init__(self): # complete def __init__(self): # complete
self.ip = "shmd01.iptime.org" self.ip = "shmd01.iptime.org"
self.myMAC = ':'.join(re.findall('..', '%012x' % uuid.getnode())) self.myMAC = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
self.clearMyData() #self.clearMyData()
self.myuuid, self.operate = self.obtainMyID() self.myuuid, self.operate = self.obtainMyID()
if self.operate == 1: # rpNode가 이미 한 개 이상존재하는 경우 if self.operate == 1: # rpNode가 이미 한 개 이상존재하는 경우
self._beacon = BeaconEmit() self._beacon = BeaconEmit()
self.advertiseMe() self.advertiseMe()
if self.operate != 2:
self.calculateNodePositionAtServer()
"""
def clearMyData(self): # complete def clearMyData(self): # complete
path = "/rpNodeInfoPath" path = "/rpNodeInfoPath"
...@@ -53,6 +56,7 @@ class CoapClient(): ...@@ -53,6 +56,7 @@ class CoapClient():
client.stop() client.stop()
client.stop() client.stop()
"""
def obtainMyID(self): # complete def obtainMyID(self): # complete
path = "/rpNodeInfoPath" path = "/rpNodeInfoPath"
...@@ -114,10 +118,7 @@ class CoapClient(): ...@@ -114,10 +118,7 @@ class CoapClient():
response = client.put(path, json.dumps(payload)) response = client.put(path, json.dumps(payload))
print((response.pretty_print())) print((response.pretty_print()))
if json.loads(response.payload)['operate'] == 0: # Postion 계산이 불가능한 경우 if json.loads(response.payload)['operate'] == 0: # Postion 계산이 불가능한 경우
client.stop() print("impossble position calculation")
self.clearMyData()
print("RpNode Exit and delete my data in DB")
sys.exit(1)
except KeyboardInterrupt: except KeyboardInterrupt:
print("obtainMyID Stop") print("obtainMyID Stop")
...@@ -162,7 +163,7 @@ class CoapClient(): ...@@ -162,7 +163,7 @@ class CoapClient():
regiRelThread.start() regiRelThread.start()
continue continue
jsonpayload = self.mkJsonbeaconInfo(beaconInfo) jsonpayload = self.mkJsonbeaconInfo(beaconInfo)
if jsonpayload['distance'] < 60: if jsonpayload['distance'] < 40:
payload.append(jsonpayload) payload.append(jsonpayload)
response = client.put(path, json.dumps(payload)) response = client.put(path, json.dumps(payload))
...@@ -176,12 +177,19 @@ class CoapClient(): ...@@ -176,12 +177,19 @@ class CoapClient():
def mkJsonbeaconInfo(self, info): # complete def mkJsonbeaconInfo(self, info): # complete
n = 2.05 n = 2.05
h = 0
ad = 0
distance = math.pow(10, (float(info[4]) - float(info[5])) / (10 * n)) distance = math.pow(10, (float(info[4]) - float(info[5])) / (10 * n))
if distance < h:
ad = 0
else:
ad = sqrt(distance * distance - h * h)
payload = { payload = {
'rpuuid' : self.myuuid, 'rpuuid' : self.myuuid,
'userMAC' : info[0], 'userMAC' : info[0],
'useruuid' : info[1], 'useruuid' : info[1],
'distance' : distance, 'distance' : ad,
'updateTime' : time.time() 'updateTime' : time.time()
} }
return payload return payload
...@@ -221,7 +229,6 @@ class CoapClient(): ...@@ -221,7 +229,6 @@ class CoapClient():
def main(): def main():
measuringDevice = CoapClient() measuringDevice = CoapClient()
measuringDevice.calculateNodePositionAtServer()
putBLEInfoThread = threading.Thread(target = measuringDevice.putBLEInfo) putBLEInfoThread = threading.Thread(target = measuringDevice.putBLEInfo)
putBLEInfoThread.start() putBLEInfoThread.start()
putBLEInfoThread.join() putBLEInfoThread.join()
......
...@@ -28,7 +28,7 @@ class CoAPServer(CoAP): ...@@ -28,7 +28,7 @@ class CoAPServer(CoAP):
self.userNodeCollection = self.db.UserNodeData self.userNodeCollection = self.db.UserNodeData
self.trackingCollection = self.db.TrackingData self.trackingCollection = self.db.TrackingData
self.usersCollection = self.db.users self.usersCollection = self.db.users
self.updatePeriod = 5 self.updatePeriod = 10
self.limitDistance = 40 self.limitDistance = 40
except: except:
print("Could not connect to MongoDB") print("Could not connect to MongoDB")
...@@ -84,7 +84,7 @@ class CoAPServer(CoAP): ...@@ -84,7 +84,7 @@ class CoAPServer(CoAP):
if len(userLocationData) < 3: if len(userLocationData) < 3:
print("userLocationData < 3") print("userLocationData < 3")
dd = datetime.datetime.now() dd = datetime.datetime.utcnow()
userNodeData = { userNodeData = {
'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']}, 'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']},
'useruuid': useruuid, 'useruuid': useruuid,
...@@ -110,7 +110,7 @@ class CoAPServer(CoAP): ...@@ -110,7 +110,7 @@ class CoAPServer(CoAP):
if x == None: if x == None:
print("no solution") print("no solution")
dd = datetime.datetime.now() dd = datetime.datetime.utcnow()
userNodeData = { userNodeData = {
'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']}, 'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']},
'useruuid': useruuid, 'useruuid': useruuid,
...@@ -122,7 +122,7 @@ class CoAPServer(CoAP): ...@@ -122,7 +122,7 @@ class CoAPServer(CoAP):
self.userNodeCollection.insert_one(userNodeData) self.userNodeCollection.insert_one(userNodeData)
return return
dd = datetime.datetime.now() dd = datetime.datetime.utcnow()
userNodeData = { userNodeData = {
'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']}, 'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']},
'rp2': {'rpuuid' : userLocationData[1]['rpuuid'], 'distance' : userLocationData[1]['distance']}, 'rp2': {'rpuuid' : userLocationData[1]['rpuuid'], 'distance' : userLocationData[1]['distance']},
......
...@@ -22,9 +22,11 @@ class RpNodeInfoResource(Resource): ...@@ -22,9 +22,11 @@ class RpNodeInfoResource(Resource):
from coapthon.messages.response import Response from coapthon.messages.response import Response
assert(isinstance(response, Response)) assert(isinstance(response, Response))
self.payload = json.loads(self.payload) self.payload = json.loads(self.payload)
"""
if self.payload['option'] == -1: if self.payload['option'] == -1:
self.deleteNodeData(self.payload) self.deleteNodeData(self.payload)
elif self.payload['option'] == 1: """
if self.payload['option'] == 1:
response.payload = self.calculateNodePosition(self.payload) response.payload = self.calculateNodePosition(self.payload)
else : else :
response.payload = self.postRpNodeInfoInDB(self.payload) response.payload = self.postRpNodeInfoInDB(self.payload)
...@@ -46,7 +48,7 @@ class RpNodeInfoResource(Resource): ...@@ -46,7 +48,7 @@ class RpNodeInfoResource(Resource):
response.payload = self.postRpNodeInfoInDB(self.payload) response.payload = self.postRpNodeInfoInDB(self.payload)
response.code = defines.Codes.CHANGED.number response.code = defines.Codes.CHANGED.number
return self, response return self, response
"""
def deleteNodeData(self, info): # complete def deleteNodeData(self, info): # complete
info = info['rpMAC'] info = info['rpMAC']
graphColletion = self.db.RpGraphData graphColletion = self.db.RpGraphData
...@@ -54,14 +56,28 @@ class RpNodeInfoResource(Resource): ...@@ -54,14 +56,28 @@ class RpNodeInfoResource(Resource):
rpuuid = self.collection.find({'rpMAC' : info})[0]['rpuuid'] rpuuid = self.collection.find({'rpMAC' : info})[0]['rpuuid']
graphColletion.remove({'v2' : rpuuid}) graphColletion.remove({'v2' : rpuuid})
self.collection.remove({'rpMAC' : info}) self.collection.remove({'rpMAC' : info})
"""
def postRpNodeInfoInDB(self, info): # complete def postRpNodeInfoInDB(self, info): # complete
info = info['rpMAC'] info = info['rpMAC']
cursor = self.collection.find({'rpMAC' : info['rpMAC']})
if len(list(cursor)) == 1:
rpuuid = cursor[0]['rpuuid']
payload = {
'rpMAC' : info['rpMAC'],
'rpuuid' : rpuuid
}
response = json.dumps({
'rpuuid' : rpuuid,
'operate' : 2 # node position calculation할 필요가 없다
})
else:
rpuuid = "52528282"+str(uuid.uuid4())[8:] rpuuid = "52528282"+str(uuid.uuid4())[8:]
rpuuid = rpuuid.replace("-","") rpuuid = rpuuid.replace("-","")
if self.collection.count() == 0: # 첫번째 rpNode인 경우 if self.collection.count() == 0: # 첫번째 rpNode인 경우
payload = { payload = {
'rpMAC' : info, 'rpMAC' : info['rpMAC'],
'rpuuid' : rpuuid 'rpuuid' : rpuuid
} }
self.collection.insert_one(payload) self.collection.insert_one(payload)
...@@ -72,7 +88,7 @@ class RpNodeInfoResource(Resource): ...@@ -72,7 +88,7 @@ class RpNodeInfoResource(Resource):
}) })
else: else:
payload = { payload = {
'rpMAC' : info, 'rpMAC' : info['rpMAC'],
'rpuuid' : rpuuid 'rpuuid' : rpuuid
} }
self.collection.insert_one(payload) self.collection.insert_one(payload)
...@@ -96,17 +112,31 @@ class RpNodeInfoResource(Resource): ...@@ -96,17 +112,31 @@ class RpNodeInfoResource(Resource):
self.collection.update({'rpuuid' : info}, {'$set':{'x': 0.0, 'y': 0.0}}, False) self.collection.update({'rpuuid' : info}, {'$set':{'x': 0.0, 'y': 0.0}}, False)
elif self.collection.count() == 2: # 자신이 두번째 RpNode인 경우 elif self.collection.count() == 2: # 자신이 두번째 RpNode인 경우
graphB = graphColletion.find({'v2': info}) graphB = graphColletion.find({'v2': info})
if len(list(graphB) == 0):
#type 0 : position을 구하지 못하는 경우
print("2번째 rpNode를 만들 수 없습니다.(exist not one line)")
response['operate'] = 0
self.collection.update({'rpuuid' : info}, {'$set' : {'type' : 0}}, False)
return json.dumps(response)
else:
x = graphB[0]['distance']
self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': 0.0, 'type' : 1}}, False)
x = graphB[0]['distance'] x = graphB[0]['distance']
self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': 0.0}}, False) self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': 0.0}}, False)
elif self.collection.count() == 3: # 자신이 세번째 RpNode인 경우 elif self.collection.count() == 3: # 자신이 세번째 RpNode인 경우
graphC = graphColletion.find({'v2': info}) graphC = graphColletion.find({'v2': info})
if len(list(graphC) < 2):
print("3번째 rpNode를 만들 수 없습니다.(exist not two line)")
response['operate'] = 0
self.collection.update({'rpuuid' : info}, {'$set' : {'type' : 0}}, False)
return json.dumps(response)
else:
for doc in graphC: for doc in graphC:
tempdoc = self.collection.find({'rpuuid': doc['v1']}) tempdoc = self.collection.find({'rpuuid': doc['v1']})
if tempdoc[0]['x'] == 0 and tempdoc[0]['y'] == 0: # 첫번째 RpNode 즉, (0,0) if tempdoc[0]['x'] == 0 and tempdoc[0]['y'] == 0: # 첫번째 RpNode 즉, (0,0)
vertexA = tempdoc[0]# 첫번째 RpNode를 vertexA라 한다. vertexA = tempdoc[0]# 첫번째 RpNode를 vertexA라 한다.
elif tempdoc[0]['y'] == 0: elif tempdoc[0]['y'] == 0:
vertexB = tempdoc[0]#두번째 RpNode를 vertexB라 한다. vertexB = tempdoc[0]#두번째 RpNode를 vertexB라 한다.
dis = { dis = {
'a': graphColletion.find({'v1': vertexB['rpuuid'], 'v2': info})[0]['distance'], 'a': graphColletion.find({'v1': vertexB['rpuuid'], 'v2': info})[0]['distance'],
'b': graphColletion.find({'v1': vertexA['rpuuid'], 'v2': info})[0]['distance'], 'b': graphColletion.find({'v1': vertexA['rpuuid'], 'v2': info})[0]['distance'],
......
var mongoose = require('mongoose');
const Schema = mongoose.Schema;
const aggregateCacheSchema = new Schema({
rpuuid: { type: String, default: "" },
count:{ type: Number, default: 0 },
time:{ type: Number, default: 0 },
}, { collection : 'AggregateCache', // 컬렉션명 지정
versionKey : false, // "__v" 필드 생성X
strict : false }
);
//users collection
module.exports = mongoose.model('AggregateCache', aggregateCacheSchema);
\ No newline at end of file
...@@ -4,6 +4,7 @@ const Schema = mongoose.Schema; ...@@ -4,6 +4,7 @@ const Schema = mongoose.Schema;
const rpNodeDataSchema = new Schema({ const rpNodeDataSchema = new Schema({
rpMAC: { type: String, default: "" }, rpMAC: { type: String, default: "" },
rpuuid: { type: String, default: "" }, rpuuid: { type: String, default: "" },
rpname: { type: String, default: "" },
x:{ type: Number, default: 0 }, x:{ type: Number, default: 0 },
y:{ type: Number, default: 0 }, y:{ type: Number, default: 0 },
type : { type: String, default: "" } type : { type: String, default: "" }
......
var data = {
labels: [
],
datasets: [
]
};
var dat = {
}
var options = {
animation: {
animateScale: false
},
responsive: false,
scales: {
yAxes: [
{
ticks: {
beginAtZero: true
}
}
],
xAxes: [
{
ticks: {
beginAtZero: true
}
}
]
}
};
var ctx = document.getElementById("myChart").getContext('2d');
var myBarChart = new Chart(ctx, {
type: 'line',
data: data,
options: options
});
var button = document.getElementById("sendAjax")
button.addEventListener("click", function() {
sendAjax('http://localhost:3000/');
})
function sendAjax(url) {
var oReq = new XMLHttpRequest();
oReq.open('POST', url);
oReq.setRequestHeader('Content-Type', "application/json") // json 형태로 보낸다
oReq.send();
oReq.addEventListener('load', function() {
var result = JSON.parse(oReq.responseText);
var score = result.score;
var comp_data = data.datasets[0].data;
for (var i = 0; i < comp_data.length; i++) {
comp_data[i] = score[i];
}
data.datasets[0].data = comp_data;
myBarChart.update();
})
}
\ No newline at end of file
...@@ -5,6 +5,7 @@ var User = require('../models/users'); ...@@ -5,6 +5,7 @@ var User = require('../models/users');
var Tracking = require('../models/tracking'); var Tracking = require('../models/tracking');
var UserNode = require('../models/userNode'); var UserNode = require('../models/userNode');
var rpNode = require('../models/rpNodeData'); var rpNode = require('../models/rpNodeData');
var aggregateCache = require('../models/aggregateCache');
/* /*
var User = require('../models/users'); var User = require('../models/users');
var user = new User({ var user = new User({
...@@ -86,49 +87,47 @@ router.get('/findUserByUUID/:id', function(req, res, next) { ...@@ -86,49 +87,47 @@ router.get('/findUserByUUID/:id', function(req, res, next) {
//console.log(output[0].name) //console.log(output[0].name)
UserName = output[0].name; UserName = output[0].name;
}) })
await User.find({uuid:req.params.id}, (err,output)=>{ await UserNode.find({useruuid:req.params.id}).sort({updateTime : -1}).exec((err,output)=>{
//res.json(output);
//console.log(output[0].name)
UserName = output[0].name;
})
await UserNode.find({useruuid:req.params.id}, (err,output)=>{
//res.json(output); //res.json(output);
//console.log("tt,",output[0].rp1) //console.log("tt,",output[0].rp1)
console.log(output[0].updateTime, output[0]._id);
try{ try{
temp =[output[output.length-1].rp1,output[output.length-1].rp2,output[output.length-1].rp3]; temp =[output[0].rp1,output[0].rp2,output[0].rp3];
UserLocation ={ UserLocation ={
x:output[output.length-1].x, x:output[0].x,
y:output[output.length-1].y, y:output[0].y,
r:10 r:10
} }
}catch(exception){} }catch(exception){}
}) //console.log("kkk",temp);
(async ()=>{
// await rpNode.find((err,output) =>{
// rpNodeData = output;
// console.log("tt",JSON.stringify(rpNodeData));
// })
for(i in temp){ for(i in temp){
console.log(i, temp[i].rpuuid) console.log(i, temp[i].rpuuid)
await rpNode.find({'rpuuid': temp[i].rpuuid},(err,output)=>{ await rpNode.find({'rpuuid': temp[i].rpuuid},(err,output)=>{
console.log(output) console.log(output[0])
if(err)
console.log(err);
if(output.length != 0) if(output.length != 0)
rpNodeData.push({ rpNodeData.push({
rpname : output[0].rpname,
rpuuid : temp[i].rpuuid, rpuuid : temp[i].rpuuid,
x: output[0].x, x: output[0].x,
y: output[0].y, y: output[0].y,
r: temp[i].distance * 20 r: temp[i].distance
}) })
}) })
//console.log(rpNodeData,i)
} }
console.log(rpNodeData)
res.render('index',{title:'Express',UserName:UserName ,UserLocation: UserLocation, rpNodeData:JSON.stringify(rpNodeData)})
})();
})
} }
catch(exception){ catch(exception){
console.log(exception) console.log(exception)
} }
console.log(rpNodeData)
res.render('index',{title:'Express',UserName:UserName ,UserLocation: UserLocation, rpNodeData:JSON.stringify(rpNodeData)})
})(); })();
}); });
...@@ -141,7 +140,7 @@ router.get('/users', function(req, res, next) { ...@@ -141,7 +140,7 @@ router.get('/users', function(req, res, next) {
}); });
router.get('/rpis', function(req, res, next) { router.get('/rpis/:id', function(req, res, next) {
// User.find((err,output) =>{ // User.find((err,output) =>{
// console.log(output); // console.log(output);
// res.render('users', { data: output }); // res.render('users', { data: output });
...@@ -153,10 +152,40 @@ router.get('/rpis', function(req, res, next) { ...@@ -153,10 +152,40 @@ router.get('/rpis', function(req, res, next) {
} }
} }
],function(rr,ra){ ],function(rr,ra){
if(ra){ var data = [];
console.log(ra); (async ()=>{
res.render('rpis',{data:ra}); let lastUpdateTime = Math.floor(Number(new Date())/1000);
for(i in ra){
temp =await Tracking.aggregate([
{
'$match': {
'rpuuid': ra[i]._id,
'updateTime': {
'$lt': lastUpdateTime,
'$gt': lastUpdateTime - 60,
},
distance: {'$lt': 40}
}
}, {
'$group': {
'_id': '$userMAC'
}
} }
]);
await rpNode.find({'rpuuid': ra[i]._id},(err,output)=>{
if(output[0].rpname.indexOf(req.params.id) != -1 || req.params.id == "*")
data.push({
rpuuid: ra[i]._id,
rpname: output[0].rpname,
count: temp.length,
});
});
}
res.render('rpis',{data});
})();
}); });
}); });
...@@ -165,36 +194,91 @@ router.get('/aggregateByRPUUID/:id', function(req, res, next) { ...@@ -165,36 +194,91 @@ router.get('/aggregateByRPUUID/:id', function(req, res, next) {
// console.log(output); // console.log(output);
// res.render('users', { data: output }); // res.render('users', { data: output });
// }) // })
Tracking.findOne({rpuuid: req.params.id},(err, output) => { var timeLogs = [];
Tracking.findOne({rpuuid: req.params.id}).sort({updateTime : -1}).exec((err, output) => {
console.log(output); console.log(output);
const lastUpdateTime = output.updateTime; let rpname = "";
const lastUpdateTimeObject = new Date(Date(output.updateTime)); let lastUpdateTime = Math.floor(output.updateTime);
console.log(Date(lastUpdateTime)); lastUpdateTime -= lastUpdateTime%60;
const lastUpdateTimeObject = new Date(lastUpdateTime*1000);
var temp =[];
console.log(output.distance) (async ()=>{
await rpNode.find({rpuuid: output.rpuuid},(err,output)=>{
rpname = output[0].rpname;
});
for(let i = 0; i< 60; i++){
Tracking.aggregate([ temp = await aggregateCache.find({'rpuuid':output.rpuuid,time:lastUpdateTime - 60*i});
if(temp.length == 0){
temp =await Tracking.aggregate([
{ {
'$match': { '$match': {
'rpuuid': output.rpuuid, 'rpuuid': output.rpuuid,
'updateTime': { 'updateTime': {
'$gt': lastUpdateTime - 10 '$lt': lastUpdateTime - 60*i,
'$gt': lastUpdateTime - 60*i - 60,
}, },
distance: {'$lt': 10} distance: {'$lt': 40}
} }
}, { }, {
'$group': { '$group': {
'_id': '$userMAC' '_id': '$userMAC'
} }
} }
],function(rr,ra){ ]);
if(ra){ var out = await new aggregateCache({
console.log(ra); rpuuid: output.rpuuid,
res.json({Date : lastUpdateTimeObject.toLocaleString('ko-KR', { count: temp.length,
timeZone: 'Asia/Seoul' time: lastUpdateTime - 60*i,
}),count : ra.length,result: ra}); }).save();
await Tracking.deleteMany({
'rpuuid': output.rpuuid,
'updateTime': {
'$lt': lastUpdateTime - 60*i,
'$gt': lastUpdateTime - 60*i - 60,
} }
}) });
// console.log(out);
timeLogs.push(temp.length);
}
else{
// console.log(temp[0].count);
timeLogs.push(temp[0].count);
}
}
// console.log(timeLogs);
res.render('rpisAggregate',{timeLogs:timeLogs,lastUpdateTime:lastUpdateTime,rpname});
})();
// Tracking.aggregate([
// {
// '$match': {
// 'rpuuid': output.rpuuid,
// 'updateTime': {
// '$gt': lastUpdateTime - 60
// },
// distance: {'$lt': 10}
// }
// }, {
// '$group': {
// '_id': '$userMAC'
// }
// }
// ],function(rr,ra){
// if(ra){
// console.log(ra);
// res.json({Date : lastUpdateTimeObject.toLocaleString('ko-KR', {
// timeZone: 'Asia/Seoul'
// }),count : ra.length,result: ra});
// }
// })
}) })
//res.json({}); //res.json({});
}); });
......
extends layout extends layout
block content block content
p #{UserName}
p #{UserLocation.x}, #{UserLocation.y} p #{UserLocation.x}, #{UserLocation.y}
p(id="closeRpNode")
script(type='text/javascript', src ="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js") script(type='text/javascript', src ="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js")
canvas(id="myChart",width="700", height="400") canvas(id="myChart",width="700", height="400")
script(type='text/javascript', src ="/chart.js") script(type='text/javascript', src ="/chart.js")
...@@ -28,7 +30,7 @@ block content ...@@ -28,7 +30,7 @@ block content
var t = []; var t = [];
const nodeData = JSON.parse(`#{rpNodeData}`.replace(/&quot;/g, '"')); const nodeData = JSON.parse(`#{rpNodeData}`.replace(/&quot;/g, '"'));
document.getElementById("closeRpNode").innerText = nodeData[0].rpname +", "+(nodeData[0].r).toFixed(2)+"M 근처";
for(i in nodeData){ for(i in nodeData){
t.push({ t.push({
x: nodeData[i].x, x: nodeData[i].x,
......
extends layout extends layout
block content block content
input(type='text' id='input' name='rpiSearch' placeholder='검색할 단어를 입력하세요')
button(onclick='const k =document.getElementById("input").value; location.href= k!= ""?k:"*" ') 검색
hr(size='3px') hr(size='3px')
p p
- let i=0; - let i=0;
for i in data for i in data
a(href='/api/aggregateByRPUUID/'+i._id) #{i.name} , uuid:#{i._id} a(href='/api/aggregateByRPUUID/'+i.rpuuid) #{i.rpname} , #{i.count}명 , uuid:#{i.rpuuid}
br br
-i++ -i++
\ No newline at end of file
extends layout
block content
script(type='text/javascript', src ="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.js")
canvas(id="myChart",width="700", height="400")
script(type='text/javascript', src ="/lineChart.js")
script(type='text/javascript').
var timeLogs = [#{timeLogs}];
console.log(#{lastUpdateTime});
var dataset =[];
for(var i=1;i<=60;i++){
dataset.push({x:i,y:timeLogs[60-i]});
data.labels.push(new Date((#{lastUpdateTime}-3600+32400)*1000 + i*60000).toISOString().replace('T', ' ').substr(0, 16))
}
console.log(dataset)
try{
data.datasets.push({
label: '#{rpname}',
data: dataset,
backgroundColor: [
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
});
}catch{
console.log("err");
}
myBarChart.update();
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment